opencv拉流出现missing picture in access unit with size 4错误解决

这篇具有很好参考价值的文章主要介绍了opencv拉流出现missing picture in access unit with size 4错误解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0、应用场景问题

我们使用opencv作为拉流客户端,获取画面后进行图像处理并推流(使用ffmpeg库)。 opencv解码同样使用ffmpeg库。

我们要求opencv能根据业务不断进行拉流操作,等效的逻辑代码如下:

while(1) {
    printf("start open rtmp\n");
    cv::VideoCapture cap;
	
    if(!cap.open("rtmp://192.168.3.100:1935/live/1581F5FHB228R00200S3", cv::CAP_FFMPEG))  // // 无流时会有20-30s超时时间
    {
        printf("reopen rtmp\n");
        continue;
    }

    // 推流初始化 ...

    while(1) {
        cap.read(frame);  // 无流时会有20-30s超时时间

        if(frame.empty()) {
            printf("frame empty\n");
            break; 
        }
        cv::imshow("v", frame);
        cv::waitKey(1);

        // 图像处理 ...
        // 推流 ...
    }

    // 推流反初始化 ...
}

注意代码中 // 无流时会有20-30s超时时间 注释的地方cap.open() 和 cap.read(frame),后面会用到。

在一次偶然测试中,发现opencv拉流时,控制台会出现如下错误:

[NULL @ 000001bb1f721400] missing picture in access unit with size 4
[h264 @ 000001bb1f71f880] Error splitting the input into NAL units.

导致后续获取frame为空,认为流断开触发重新进行拉流的操作,导致后续视频处理、推流业务有短暂停顿,客户端播放会出现响应的短暂黑屏问题。
opencv拉流出现missing picture in access unit with size 4错误解决,OpenCV,opencv,人工智能,计算机视觉,videcocapture,ffmpeg

1、解决思路

出现前面情况的可能原因:

可能是因为网络问题引起数据丢失,使得解码出现问题,是一段(秒级以上)时间的发生频率。 我们不去处理视频源、opencv底层的潜在问题,仅从应用层上规避该原因带来的问题,也就是不将这个报错信息作为拉流断开来处理。

1.1、方式一:

我们简单操作修改代码如下。流存在时,如果frame为空不作为错误,直接continue进行下一次读取。

        if(frame.empty()) {
            printf("frame empty\n");
            // break; 
            continue; // 不进行重新拉流
        }

实际测试时,能够跳过当前空帧,并能再次重新成功获取新的frame。
opencv拉流出现missing picture in access unit with size 4错误解决,OpenCV,opencv,人工智能,计算机视觉,videcocapture,ffmpeg

但是,会存一下可能的问题:

  • 1)无法区分流真正断开的情况,导致程序会卡在读取frame的循环中

  • 2)断开流超过 cap.read(frame) 超时时间后,再次连接后无法解码

    这个错误在1)的基础之上出现,导致流不能解码(需要重新拉流?或其他未知设置?)。如下图
    opencv拉流出现missing picture in access unit with size 4错误解决,OpenCV,opencv,人工智能,计算机视觉,videcocapture,ffmpeg

1.2、方式二:

我们设置一个frame.empty()为空的次数限制,当达到一定次数(如10次)认为是流断开连接。

    while(1) {
        cap.read(frame); // 无流时会有20-30s超时时间
        
    	if(frame.empty()) {
        	printf("frame empty\n"); 

        	if(cnt++ == 10) {
            	cnt = 0;
            	printf("grab failed at 3 times, reopen rtmp\n");
            	break;
        	}
        	continue;
        }
		// 其他操作...
    }

当流正常确认断开后,cap.read(frame) 会阻塞,阻塞3次(约60~90s)后将退出当前while循环,进行重新拉流。这种逻辑是符合业务的,新拉流可能参数配置改变,需要重新进行推流参数的调整(推流反初始化、推流初始化)。

opencv拉流出现missing picture in access unit with size 4错误解决,OpenCV,opencv,人工智能,计算机视觉,videcocapture,ffmpeg

当以cap.read(frame) 超时以20s,不同时间端重连时,说明如下情况:

  • 若在 20s 内流重新连接时,能正常获取非空的 frame。

  • 在 20~60s 之内重新获取流时,cap.read(frame) 不再超时且以流帧率进行执行,例如 30fps 时会再后续第 3x20 = 60ms 后 break 退出当前循环、重新拉流。

  • 在 60s 后,break 退出当前循环、重新拉流。

存在问题:

前面代码中,若正常获取非空 frame 后未将 cnt 置零,会出现每次累计出现文首错误(读到空frame )到第 3 次 必将 break 退出当前循环、重新拉流。因此需要在 if 语句后面后对 cnt 重置

1.3、方式三:

方式二的等效代码,只不过是使用了 VideoCapture 的另外一种接口方式。文章来源地址https://www.toymoban.com/news/detail-808214.html

    while(1) { 
        if(!cap.grab()) {  // 无流时会有20-30s超时时间
	        if(cnt++ == 10) {
	            cnt = 0;
	            printf("grab failed at 10 times, reopen rtmp\n");
	            break;
	        }
	        continue;
	    }
	    cnt = 0; // 重置
        
	    if(!cap.retrieve(frame)) {
	        printf("retrieve failed\n");
	        continue;
	    }

		// 其他操作...
    }

到了这里,关于opencv拉流出现missing picture in access unit with size 4错误解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • idea 拉取项目 跳出Log in with Access token

    解决办法 :

    2024年02月09日
    浏览(41)
  • Qt Installation and Setup in Linux with OpenCV||Embedded Object Detection Project (Part 2)

    Qt Installation and Setup in Linux with OpenCV || Qt with OpenCV - Embedded Object Detection Project using Hikvision Industrial Camera (Part 2) Hi! This is my second post on Qt development about how to set up Qt with opencv in Linux System, compared with the last blog talking about Windows environment. Thanks for ur support and don’t forget to click the “

    2024年02月19日
    浏览(29)
  • Qt Installation and Setup in Windows with OpenCV ||Embedded Object Detection Project (Part 1)

    Qt Installation and Setup in Windows with OpenCV || Qt with OpenCV - Embedded Object Detection Project using Hikvision Industrial Camera (Part 1) I am documenting my experience in Qt development and hope that this article will be helpful to developers who are interested in learning and applying Qt. Don’t forget to click the “Follow” button to stay upda

    2024年02月21日
    浏览(28)
  • 解决:mac brew install xx 出现 fatal: not in a git directory Error: Command failed with exit 128: git

    wshanshi:这是一个简单的问题总结记录… 一、异常信息 使用brew install 时发现报了一个错:fatal: not in a git directory Error: Command failed with exit 128: git,如下图所示。 二、解决方法 brew -v 可查看提示,To add an exception for this directory。提示添加安全目录(–add safe.directory) 执行上述提

    2024年02月14日
    浏览(35)
  • Introduction to Unit Testing in Java

    作者:禅与计算机程序设计艺术 UNIT TESTING (UNIT测试),是在软件开发生命周期中不可或缺的一环。单元测试是一个模块化的测试工作,它的目标是验证某个函数、模块或者类的某个功能是否符合设计要求。它通过对代码中独立的测试用例进行运行和验证,发现错误并报告给相

    2024年02月08日
    浏览(36)
  • opencv+gstreamer拉流

    opencv的VideoCapture函数支持以Gstreamer pipeline的方法对RTSP数据进行解码,VideoWriter函数支持以Gstreamer pipeline的方式进行RTSP推流。 为了实现上述的功能, opencv在编译时需要打开WITH_GSTREAMER选项 ,具体编译过程,需要后续进行测试,然后描述相应的过程。 opencv中可以通过调用getBu

    2024年02月04日
    浏览(27)
  • BTP Integration Suite学习笔记 - (Unit1) Developing with SAP Integration Suite

    今天决定跟着SAP官方资源系统学习一遍BTP Itegration Suite。找到两个Learning Journey: SAP Integration Suite Foundation 和 Solution Integration on SAP BTP。还有一个更大的roadmap,Integration Suite的官方内容在这里都可以链接到。 认证暂时只找到了一个比较基础的:SAP Certified Development Associate - SAP Int

    2024年02月15日
    浏览(30)
  • 【Flutter】exception in phase ‘semantic analysis‘ in source unit ‘_BuildScript_‘ Unsupported class

    Gradle版本与Java版本不兼容问题,.gradlecache6.5说明当前项目的Gradle 版本是6.5,Gradle 6.5对应版本Java8(即常说的JDK1.8)~Java14。 Gradle官方的兼容性文档 在android项目里修改Gardle版本即可,操作如下: Fileopen当前项目下的android项目Project StructureSDK LocationGradle SettingsGradle JDK 修改成需

    2024年02月03日
    浏览(27)
  • 2022图像翻译/扩散模型:UNIT-DDPM: UNpaired Image Translation with Denoising Diffusion Probabilistic Models

    我们提出了一种新的无配对图像间翻译方法,该方法使用去噪扩散概率模型而不需要对抗训练。我们的方法,UNpaired Image Translation with Denoising Diffusion Probabilistic Models(UNIT-DDPM),训练一个生成模型,通过最小化另一个域条件下的去噪分数匹配目标,推断图像在两个域上的联合分

    2023年04月18日
    浏览(37)
  • 【视频异常检测 Dual Memory Units with Uncertainty Regulation for Weakly Supervised Video Anomaly...论文阅读

    中文标题:具有不确定性调节的双存储单元在弱监督视频异常检测中的应用 文章信息: 原文链接:https://arxiv.org/abs/2403.06154 源码:https://github.com/henrryzh1/UR-DMU 发表于:AAAI 2023 学习区分正常状态和异常事件的辨别性特征对于弱监督视频异常检测(WS-VAD)任务至关重要。现有方

    2024年04月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包