【FFmpeg】ffplay播放rtsp视频流花屏问题

本文介绍ffplay播放RTSP视频流时出现花屏现象的排查过程及解决方案。通过修改ffmpeg源码增加缓冲区大小,解决了因数据丢失引起的花屏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:
​http://www.cnblogs.com/dwdxdy/p/3240217.html

问题描述:ffplay播放rtsp视频流时,播放过程中随机出现花屏现象。

基本流程学习:阅读ffplay源码,熟悉其播放rtsp视频流的基本流程。

在ffplay源码阅读和分析的基础上,画出了其播放rtsp的函数调用关系,如下图所示:

avformat_open_input函数根据输入的文件名,与rtsp_read_packet关联。

rtsp_read_packet完成每个rtp包的读取和解析,读取主要是利用rtp_read从缓冲区获取数据,解析主要是根据rtp协议,解析rtp包,得到h264码流数据,由rtp_parse_packet完成。

av_read_frame读取一帧数据的avpacket包,主要是调用rtsp_read_packet读取h264码流数据包,然后由av_parser_parse2组成h264 码流包,最终组成一帧数据的avpacket。

错误测试:发布不同分辨率的rtsp视频流,测试错误产生的原因。

利用VLC发布视频的rtsp服务,经测试,同一种视频封装格式,分辨率越小,花屏现象越少。

分辨率越小,服务端发送给客户端的数据越小,其花屏现象越少,说明花屏现象与服务端发送的数据量有关。

可能的原因是服务端发送的数据量较大时,客户端缓冲区不足,导致数据丢失的问题,从而引起花屏现象。

错误验证:修改ffmpeg源码,输出客户端接收的数据包信息,验证是否存在数据丢失的问题。

源码修改如下图所示,主要是输出RTP包的序号,根据序号判断是否存在丢包问题。

信息输出结果如下图所示,正常情况下,RTP的序号是连续的,而由输出信息可知RTP序号不连续,因而存在丢包的问题。

解决方法:增加客户端接收数据的缓冲区,避免丢包现象的产生。

源码修改如下图所示,主要是将UDP_MAX_PKT_SIZE增大了10倍。



​2014-06-30 21:59 ersheng  
请问,ffmpeg有专门设置这个参数的接口吗?


@ersheng
据我所知,没有相关的设置接口
 
@ersheng
可否請問作者 要修改的源碼 詳細說明 檔案名稱 和位置 謝謝
  
@麥克
libavformat目录下的udp.c文件,修改UDP_MAX_PKT_SIZE即可


兩個問題 
1. 是要log out的程式碼是改哪一段
2. 如果是真的網路連結 有沒有可能不連續是因為網路品質不好掉了包?
您好 我指的log out是訊息輸出修改的地方 謝謝


@麥克
rtpproto.c文件下,246行添加rtp包的长度和时间输出代码


樓主您好 我試過您說的位置去加程式碼 可是build失敗 想請問您用的ffmpeg是哪一版? 
您講的位置 我在2.4版 看到的不一樣 感謝


您好 或是您加完程式碼build出來的執行檔 寄給我參考 好嗎?
謝謝


mailto:hwmike.mh@gmail.com:
楼主,我将udp.c里的UDP_MAX_PKT_SIZE 增大10倍,并且编译后,
发现对于是你质量没有明显的影响,不知是不是我的方法不对?谢谢!

### 如何使用 `ffplay` 播放 RTSP 视频流 `ffplay` 是 FFmpeg 提供的一个简单媒体播放器工具,可以直接用来播放 RTSP 流。以下是具体的命令和参数配置方法: #### 基本命令结构 要使用 `ffplay` 播放 RTSP 视频流,可以按照以下基本命令格式执行: ```bash ffplay rtsp://<服务器IP>:<端口号>/<路径> ``` 其中 `<服务器IP>` 替换为实际的 IP 地址,`<端口号>` 和 `<路径>` 根据具体 RTSP 服务提供商的要求填写。 #### 示例命令 假设有一个 RTSP 流地址如下所示: ``` rtsp://192.168.1.100:554/stream1 ``` 那么完整的播放命令将是: ```bash ffplay rtsp://192.168.1.100:554/stream1 ``` #### 可选参数 为了优化播放效果或满足特定需求,还可以添加一些可选参数。常见的参数包括但不限于以下几个: - `-loglevel quiet`: 关闭日志输出,使终端界面更加简洁。 - `-sync video|audio`: 设置同步方式(默认为音频优先),可以选择视频 (`video`) 或者音频 (`audio`) 同步模式。 - `-framedrop`: 开启帧丢弃功能,在设备性能不足的情况下自动跳过部分画面以保持流畅度。 综合以上选项后的一条完整示例命令可能看起来像这样: ```bash ffplay -loglevel quiet -sync video -framedrop rtsp://192.168.1.100:554/stream1 ``` 需要注意的是,某些情况下 RTSP 流可能会因为网络延迟或其他原因导致卡顿现象发生;此时可以通过调整缓冲区大小来改善体验[^1]。 对于更复杂的场景比如需要解析多个音视频轨道或者仅提取指定类型的媒体数据,则需要用到高级 API 编程接口如 C/C++ 调用 libavformat 库函数实现自定义逻辑处理流程][^[^24]。 当遇到无法成功连接至目标源的问题时,请确认本地环境已正确安装并配置好支持 RTSP 协议版本号匹配以及防火墙设置允许外部访问相应端口范围内的流量传输活动情况是否存在异常状况等问题存在可能性较大些[^3].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值