项目使用mingw环境g++5.3,C++调用ffmpeg接收rtsp流,再通过C#显示。结构上是C#调用C++的so文件,读取得到的视频帧(RGB888格式),通过图片控件显示。

一开始是使用opencv打开视频源,本地文件和rtsp的源使用一样的接口,方便使用。但是通过opencv打开rtsp源的时候,发现720p2Mbit的视频能够正常打开,但1080p的视频打开后出马赛克,卡顿比较多。

而同样的视频源,使用VLC就能流畅的打开,不过延时很高,大约1s。

后来又发现,使用i3低电压版CPU的笔记本上,连720p也有卡顿和马赛克。使用3代i5处理器的笔记本能够流畅播放720p,1080p的会出马赛克。一开始认为是opencv的问题,所以换成了用ffmpeg打开rtsp流。但是效果与opencv的完全一致。

由于解码的CPU占用率很高,而且性能高的笔记本问题就少,所以怀疑是解码时间长,导致丢数据。所以在ffmpeg打开rtsp流之前加了强制使用tcp的选项:

AVDictionary* options = NULL;
av_dict_set(&options, "rtsp_transport", "tcp", 0); //强制使用tcp,udp在1080p下会丢包导致花屏
result = avformat_open_input(&fmt_ctx, video_url.c_str(), NULL, &options); //打开文件

这样就解决了丢包问题,本以为就完美了,后来视频源经过图传传输到笔记本上,使用1080p 2Mbit,这一版程序的就出现了大量的马赛克,卡顿严重。

分析认为是网络图传限制了最大传输带宽为6Mbit,且延时大约30ms,可能对rtsp传输有影响。所以又恢复了之前udp的方式,结果效果就好多了,但是和之前一样,还是会出马赛克。

使用tcp的方式无法通过图传,也就否定了这种解决方案。所以还是需要解决udp方式丢包的问题。

对于udp丢包的问题,可以使用增加缓存的方式解决,而我在网上没有查到有关ffmpeg打开rtsp流增加udp缓存的方法,所以还是到ffmpeg源码中搜索avformat_open_input函数的源码,和rtsp_transport等关键字,最后搜到了这个函数的所有配置,发现buffer_size这个选项最终在socket中修改了udp的接收缓存。默认64K,修改为1MB以后,视频流畅播放了:

AVDictionary* options = NULL;
av_dict_set(&options, "buffer_size", "1024000", 0); //设置udp的接收缓冲
result = avformat_open_input(&fmt_ctx, video_url.c_str(), NULL, &options); //打开文件

ffmpeg接收rtsp流问题的更多相关文章

  1. VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时

    之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...

  2. (原)关于获取ffmpeg解析rtsp流sdp中带有sps,pps的情况

     转载请注明出处:http://www.cnblogs.com/lihaiping/p/6612511.html 今天同事准备在android下使用ffmpeg来获取rtsp流,问我如何获取获取sps ...

  3. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

  4. RTSP 流相关工具介绍

    RTSP (Real Time Streaming Protocol),实时流协议,是一种应用层协议,专为流媒体使用.本文将介绍 GStreamer, VLC, FFmpeg 这几个工具,如何发送.接 ...

  5. 视频文件自动转rtsp流

    最近碰到一个项目需要用到 rtsp 视频流做测试, 由于真实环境的 摄像头 并不能满足需求,故尝试了一下用本地视频文件转换成rtsp视频流做测试,记录一下~ 采用方案: Docker + EasyDa ...

  6. nginx+ffmpeg搭建rtmp转播rtsp流的flash服务器

    本文概要: nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择.本文介绍了一种简易方法快速搭建rtmp流媒体服务器,也叫rtsp转播,数据源不是读取文件,而是采用 ...

  7. 搭建rtmp直播流服务之3:java开发ffmpeg实现rtsp转rtmp并实现ffmpeg命令的接口化管理架构设计及代码实现

    上一篇文章简单介绍了java如何调用ffmpeg的命令:http://blog.csdn.net/eguid_1/article/details/51777716 上上一篇介绍了nginx-rtmp服 ...

  8. centos下用ffmpeg推流宇视科技摄像头rtsp流到前端播放(无flash)

    严禁垃圾中文技术网站复制粘贴 流程:安装SRS服务接收ffmpeg的推流,SRS会提供一个flv的播放地址,前端通过fls.js播放即可,无需flash. 1.安装ffmpeg 提供两个版本,都能推流 ...

  9. 调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议

    Live555接收RTSP直播流,转换Http Live Streaming(iOS直播)协议 RTSP协议也是广泛使用的直播/点播流媒体协议,之前实现过一个通过live555接收RTSP协议,然后转 ...

随机推荐

  1. oracle查询相关注意点

    单表查询: .or 和 and 混合使用 需求:查询业主名称包含'刘'或门牌号包含'5'的,并且地址编号为3的记录 and 的权限优先于 or 所以需要在or的两边添加() 2. 范围查询 除了传统的 ...

  2. Codeforces Round #483 (Div. 2)C题

    C. Finite or not? time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  3. window下pip install Scrapy报错解决方案

    1.首先打开https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted,找到对应版本的Twisted并下载到你的文件夹. 2.利用pip install命令 ...

  4. JS 原型总结

    参考: (从内存角度)简单类型与复杂类型及原型链

  5. tp5.1路由报错No input file specified.

    问题: 按照官方教安装了框架,打开首页没问题,可是安装教程路由规则打开 "http://127.0.0.1/hello/2" 时, 却报错误  "No input fil ...

  6. YII2集成GOAOP,实现面向方面编程!

    引言: 软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创建和管理的模块.于是出现了以系统模块化特性的面向对象程序设计技术.模块化的面向对象编程极度地提高了 ...

  7. 集合之HashMap、Hashtable

    HashMap 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtabl ...

  8. hive 查看表结构和属性

    1.查看数据库/表 show databases/tables; 2.切换数据库 use database_name; 3.查看表结构 desc table_name; 4.查看表详细属性 desc ...

  9. STM32(9)——通用定时器作为输入捕捉

    通用定时器作为输入捕获的使用.我们将用 TIM5 的通道 1 (PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间 输入捕获简介 输入捕获 ...

  10. 472. Concatenated Words

    class Solution { public: vector<string> res; vector<string> findAllConcatenatedWordsInAD ...