ffmpeg + rtsp 1080p 多路实时预览时 花屏

背景:

       客户需要一个直连设备实时预览的播放器,就以 ffmpeg + rtsp + SDL 为核心,写了一个多路实时预览的播放器。客户使用之后,反馈会花屏,卡顿。

      网上搜索,发现 这篇分析比较全面 转载地址 https://blog.csdn.net/sz76211822/article/details/87797475 ,原文访问不了。

1.修改udp.c    

        UDP_MAX_PKT_SIZE  大小x10   

        UDP_TX_BUF_SIZE

  这个需要重新编译 ffmpeg 所以 参考 https://blog.csdn.net/nodeman/article/details/106431994?utm_medium=distribute.pc_relevant.none-task-blog-title-5&spm=1001.2101.3001.4242 文章,修改 upd.c 后,重新编译ffmpeg4.3.1 版本。

  替换新编译出来的 ffmepg 相关dll 进行测试,发现还是会花屏,并不能解决花屏问题。

 

2.修改 rtsp 连接参数

  

AVDictionary* options = NULL;

av_dict_set(&options, "buffer_size", "2048000", 0);

av_dict_set(&options, "max_delay", "500000", 0);

av_dict_set(&options, "stimeout", "10000000", 0);  //设置超时断开连接时间 10s

av_dict_set(&options, "rtsp_transport", "tcp", 0);  //以udp方式打开,如果以tcp方式打开将udp替换为tcp

buffer_size 改为 2048000, rtsp_transport 连接方式从 udp 改为 tcp。

2.1  测试

     修改后重新测试,发现花屏现象减少,但是还是有花屏。花屏减少 ,主要是 连接方式从 udp 改为 tcp.

3. 关注ffmpeg 底层错误 av_log_set_callback

   依据第一篇博文,关注ffmpeg 相关错误,因为对ffmpeg 源码不熟悉 和 本项目情况,没有添加全局变量。通过设置 av_log_set_callback 写入日志。当花屏时,通过分析日志,确实出现了第一篇文章描述的相关错误日志。因为是多路实时预览,需要知道是哪一路的视频数据出现问题,通过分析ffmepg 错误日志 代码,发现 av_log_set_callback 的 回调函数第一个参数是  AVCodecContext 指针,应该是 AVFormatContext  *m_pFormatCtx->streams[videoindex]->codec,中一致,代码测试确认一下,确实匹配上。这样就能知道是哪一路视频数据出现错误,当发现相关错误时,给对应的通道 设置标志,下一帧需要解I帧。

     修改之后测试,花屏没有复现。

参考资料:

    https://blog.csdn.net/sz76211822/article/details/87797475

https://blog.csdn.net/nodeman/article/details/106431994?utm_medium=distribute.pc_relevant.none-task-blog-title-5&spm=1001.2101.3001.4242

https://blog.csdn.net/leixiaohua1020/article/details/46890739

 

 

 

 

 

 

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
qt是一种跨平台的开发框架,ffmpeg是一套音视频编解码的库,rtsp是一种用于传输音视频流的协议。所以如果想要实现多摄像头实时显示的功能,可以通过qt结合ffmpeg来实现。 首先,我们需要使用ffmpeg来获取每个摄像头的rtsp流并解码。可以使用ffmpeg提供的函数来打开rtsp流并将其解码成原始的音视频数据。通过设置ffmpeg的参数,我们可以指定使用不同的摄像头,并可以同从多个摄像头获取音视频数据。 接着,我们可以使用qt的图像显示控件来显示从摄像头解码得到的视频帧。可以使用qt提供的QGraphicsView、QLabel等控件,将视频帧数据转换成qt能够识别的格式并在界面上实时显示。 为了实现多摄像头实时显示,我们可以在qt中使用多线程来同处理多个摄像头的数据。可以为每个摄像头开启一个线程,用于获取该摄像头的rtsp流并解码。然后将解码得到的视频帧数据通过线程间的通信机制传递给主线程,然后在主线程中更新界面并显示视频帧。 另外,为了提高实时性,我们可以对视频帧进行硬件加速处理,比如使用OpenGL进行渲染,这样可以减少CPU的使用率,提高视频的播放效果。 总结来说,实现qt与ffmpeg结合实现多摄像头实时显示的功能,主要是通过ffmpeg获取rtsp流并解码,然后通过qt的图像显示控件实时显示解码得到的视频帧,在多线程中同处理多个摄像头的数据,最终实现多摄像头的实时显示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值