ffmpeg接收rtsp流问题
项目使用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流问题的更多相关文章
- VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时
之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...
- (原)关于获取ffmpeg解析rtsp流sdp中带有sps,pps的情况
转载请注明出处:http://www.cnblogs.com/lihaiping/p/6612511.html 今天同事准备在android下使用ffmpeg来获取rtsp流,问我如何获取获取sps ...
- FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放
前言 ffmpeg播放rtsp网络流和摄像头流. Demo 使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克 使用ffmpeg播放网络rtsp文件流 ...
- RTSP 流相关工具介绍
RTSP (Real Time Streaming Protocol),实时流协议,是一种应用层协议,专为流媒体使用.本文将介绍 GStreamer, VLC, FFmpeg 这几个工具,如何发送.接 ...
- 视频文件自动转rtsp流
最近碰到一个项目需要用到 rtsp 视频流做测试, 由于真实环境的 摄像头 并不能满足需求,故尝试了一下用本地视频文件转换成rtsp视频流做测试,记录一下~ 采用方案: Docker + EasyDa ...
- nginx+ffmpeg搭建rtmp转播rtsp流的flash服务器
本文概要: nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择.本文介绍了一种简易方法快速搭建rtmp流媒体服务器,也叫rtsp转播,数据源不是读取文件,而是采用 ...
- 搭建rtmp直播流服务之3:java开发ffmpeg实现rtsp转rtmp并实现ffmpeg命令的接口化管理架构设计及代码实现
上一篇文章简单介绍了java如何调用ffmpeg的命令:http://blog.csdn.net/eguid_1/article/details/51777716 上上一篇介绍了nginx-rtmp服 ...
- centos下用ffmpeg推流宇视科技摄像头rtsp流到前端播放(无flash)
严禁垃圾中文技术网站复制粘贴 流程:安装SRS服务接收ffmpeg的推流,SRS会提供一个flv的播放地址,前端通过fls.js播放即可,无需flash. 1.安装ffmpeg 提供两个版本,都能推流 ...
- 调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议
Live555接收RTSP直播流,转换Http Live Streaming(iOS直播)协议 RTSP协议也是广泛使用的直播/点播流媒体协议,之前实现过一个通过live555接收RTSP协议,然后转 ...
随机推荐
- 对布局定位设置-position
使用position属性,会激活5个属性 left right bottom top z-index(-1至999) 注:z-index:会改变内容的层级关系, 1.绝对定位 position: ab ...
- HTTP学习之URL与资源
URL是因特网资源的标准化名称,该字符串指向一条电子信息片段,定义服务端应用程序在什么位置以及客户端要如何与其交互 一条完整的URL由多个片段组成. 通用URL组件 方案 以哪种协议访问服务器 用户 ...
- python逻辑判断 () not and or
python逻辑判断 () not and or 优先级关系:()>not>and>or 运算符示意 not –表示取反运算. and –表示取与运算. or –表示取或运算. or ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- kali aquatone安装
https://www.jianshu.com/p/418eedb9d9c8
- Qt——模态、非模态
模态: 只能操作对话框非模态:要使用 QDialog *_d = new QDialog();_d->setattribute(Qt::WA_DeleteOnClose);_d->show ...
- elk6.3.2在线安装中文分词工具IK
1.进入ES目录并执行安装(注意版本号改成你需要的版本) cd /usr/share/elasticsearch ./bin/elasticsearch-plugin install https:// ...
- 北京Uber优步司机奖励政策(12月30日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Drupal中自定义登录页面
通过覆写template定义新的user_login表单来为自定义登录页面.方法: 1. 本站使用的主题是Rorty.来到\sites\all\themes\rorty,打开template.php ...
- Docker介绍及安装
Docker介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...