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协议,然后转 ...
随机推荐
- 【读书笔记】The Swift Programming Language (Swift 4.0.3)
素材:Language Guide 初次接触 Swift,建议先看下 A Swift Tour,否则思维转换会很费力,容易卡死或钻牛角尖. 同样是每一章只总结3个自己认为最重要的点.这样挺好!强迫你去 ...
- python中 的继承
1.Python的类可以继承多个类,Java和C#中则只能继承一个类. 2.Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先. 当类是经典类时,多继承情况下,会 ...
- ZooKeeper分布式
1:zk的相关特性 1.一致性:数据一致性,数据按顺序分批入库. 2.原子性:事务要么都成功,要么都失败,不会局部化. 3.单一视图:客户端连接集群中的任一zk节点,数据都是一致的. 4.可靠性:每次 ...
- linux下pip错误 ImportError: No module named 'pip_internal'
wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate sudo python get-pip.py
- Ubuntu下Zabbix结合percona监控mysql数据
按道理来说zabbix就自带的MySQL插件来监控mysql数据库,但是你会发现,自带的mysql监控项是很少的,根本满足不了公司的需求.由于它本身自带的模板太过简单了,所以需要做更详细的监控,而pe ...
- netfilter 学习摘要
netfilter 子系入口在L3,完成后把数据包发往L4 netfilter 主要功能: 数据包选择(iptables) 数据包过滤 网络地址转换(NAT) 数据包操纵(在路由选择之前或之后修改数据 ...
- DXP常用的设置及快捷键
原文地址:http://www.cnblogs.com/NickQ/p/8799240.html 测试环境:Altium Designer Summer 16 一.快捷键 1.原理图和PCB通用快捷键 ...
- django的Request-7
目录 1. 从url中获取截取 2. QueryDict (1). QueryDict.get(key, [default]) (2). QueryDict.getlist(key, [default ...
- go学习笔记-错误处理
错误处理 通过内置的错误接口提供了非常简单的错误处理机制. error类型是一个接口类型 type error interface { Error() string } 可以在编码中通过实现 erro ...
- NoSQL入门第三天——Redis配置文件与持久化
一.解析Redis配置文件redis.conf (Linux下配置多于编码) 1.它在哪 由于我是在root的家目录下载安装的,默认的安装位置就是: conf就在这里: 根据经验,出厂的conf永远不 ...