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为空,认为流断开触发重新进行拉流的操作,导致后续视频处理、推流业务有短暂停顿,客户端播放会出现响应的短暂黑屏问题。
在这里插入图片描述

1、解决思路

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

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

1.1、方式一:

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

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

实际测试时,能够跳过当前空帧,并能再次重新成功获取新的frame。
在这里插入图片描述

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

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

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

    这个错误在1)的基础之上出现,导致流不能解码(需要重新拉流?或其他未知设置?)。如下图
    在这里插入图片描述

1.2、方式二:

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

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

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

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

在这里插入图片描述

当以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 的另外一种接口方式。

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

		// 其他操作...
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/314279.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv6s,map值打印成两位小数(原本是显示0.538,变成显示为53.79)

显示结果 更改前: 更改后: 方法 将tools/eval.py中的--do_pr_metric后面改为defaultTrue即可打印出map值原本是显示0.538,变成显示为53.79,方法为👇 在YOLOv6-main/yolov6/core/evaler.py中做如下更改&#xff1a…

揭秘H5与小程序的测试奥秘!

最近接触了较多关于H5页面的测试,H5页面的测试除了业务逻辑功能测试外,其他部分的测试方法基本是可以通用的,在此对H5页面和小程序的一些通用测试方法进行总结分享给大家。 H5优势 H5可以跨平台,开发成本相对较低; H…

代码随想录算法训练营第25天 | 216.组合总和III 17.电话号码的字母组合

目录 216.组合总和III 💡解题思路 回溯三部曲 💻实现代码 17.电话号码的字母组合 💡解题思路 # 数字和字母如何映射 # 回溯法来解决n个for循环的问题 💻实现代码 216.组合总和III 题目链接:216.组合总和III …

必须掌握的100+个Linux命令大全【持续更新中】

别有一番风趣的alias … note:: 寒蝉凄切,对长亭晚,骤雨初歇。 柳永《雨霖铃》 Linux alias命令用于设置指令的别名,可以将比较长的命令进行简化。 默认情况下会输出当前的设置: $ alias lls -lah lals -lAh llls -lh lsls --…

【Docker】Linux中Docker数据管理的数据卷及挂载

目录 一、数据管理 1. 讲述 2. 应用场景 二、数据卷的应用 1. 命令 2. tomcat镜像 3. 挂载数据卷 4. 项目部署在数据卷 三、目录挂载 四、完善Tomcat配置 每篇一获 一、数据管理 1. 讲述 Docker 的数据管理主要涉及到两个方面:数据卷(Volume…

[linux]编译一个ko文件并运行

一、需求 有一段代码需要在运行时加载注入内核中&#xff0c;当用户层需要访问时可以提供内核态环境去运行。 二、c代码构建 // #include <errno.h> // #include <string.h> // #include <stdio.h> // #include <fcntl.h> // #include <stdlib.h…

Docker数据卷与拦截与目录拦截

目录 高级容器挂载技术深度解析引言数据卷挂载原理解析应用场景使用介绍 目录挂载原理解析应用场景使用介绍 总结 高级容器挂载技术深度解析 引言 容器技术的快速发展使得容器挂载技术变得愈发重要。在容器化应用中&#xff0c;数据卷挂载和目录挂载是两种常见的挂载方式&…

SpringMVC 学习博客记录

文章目录 Servlet请求转发和请求包含RequestDispatcher HandlerInterceptor组件实际运用场景 HandlerMapping&RequestMappingInfo(HandlerMapping)HandlerExecutionChainHandlerAdapter源码学习知识点博客记录 Servlet请求转发和请求包含 RequestDispatcher Request#getR…

测试八年|对业务测试人员的一些思考

自从事测试工作八年多以来&#xff0c;经历过三个部门多条业务线&#xff0c;也经历过测试转型再回到测试&#xff0c;在此过程中对测试工作和角色的认知也逐步有些思考&#xff0c;想把这些思考分享给大家&#xff0c;希望为业务测试同学提供一些有价值的思路。 一、质量保障…

U盘启动安装win11遇到缺少计算机所需的介质驱动程序问题

一、使用U盘制作启动盘遇到问题 下载了windows原版镜像&#xff0c;验证了md5&#xff0c;确保文件没有损坏。使用ultroiso制作u盘启动盘&#xff0c;开始安装后出现下图的报错&#xff1a; 在网上搜索解决方案&#xff0c;主要有以下几种&#xff1a; 安装的时候&#xff0c…

POI:对Excel的基本写操作 整理1

首先导入相关依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><!--xls(03)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></depend…

SpringBoot中 如何优雅的 重试调用 第三方API?

引言 在实际的应用中&#xff0c;我们经常需要调用第三方API来获取数据或执行某些操作。然而&#xff0c;由于网络不稳定、第三方服务异常等原因&#xff0c;API调用可能会失败。为了提高系统的稳定性和可靠性&#xff0c;我们通常会考虑实现重试机制。 本文将深入探讨如何在…

Defi安全--Zunami Protocol攻击事件分析

其它相关内容可见个人主页 1 Zunami攻击事件相关信息 2023.8.13发生在Ethereum上发生的攻击&#xff0c;存在两个攻击交易&#xff0c;具体信息如下&#xff1a; 攻击合约地址&#xff1a;Contract Address 攻击合约 攻击者地址&#xff1a;Zunami Protocol Exploiter 攻击…

【DB2】installSAM执行后会重启这件事

碎碎念 在使用自动化工具安装TSAMP的过程中&#xff0c;机器会自动重启这件事。 TSAMP真的挺折磨的&#xff0c;一个月居然因为这件事情debug两次了。 在测试自动化脚本的时候&#xff0c;第一遍安装都是好好的&#xff0c;从第二遍开始&#xff08;因为要测试脚本的幂等性&…

openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态

文章目录 openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态195.1 分析查询语句运行状态195.1.1 问题现象195.1.2 处理办法 openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态 195.1 分析查询语句运行状态…

2024年实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

【工具栏】Rainbow Brackets(彩虹括号) 插件的安装和使用

使用前 这一段代码里有这么多括号&#xff0c;找到相匹配的括号需要花点时间 &#xff0c;但是安装Rainbow Brackets插件后&#xff0c;代码在括号方面多一份美观 安装 效果如下&#xff1a;

IPv6路由协议----BGP4+

BGP基本概念 边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。 MP-BGP是对BGP4进行了扩展达到在不同网络中应用的目的,BGP4原有的消息机制和路由机制并没有改变。MP-BGP在IPv6单播网…

【论文阅读】Self-supervised Learning: Generative or Contrastive

Abstract 研究了在计算机视觉、自然语言处理和图形学习中用于表示的新的自监督学习方法。全面回顾了现有的实证方法&#xff0c;并根据其目的将其归纳为三大类&#xff1a;生成性、对比性和生成性对比&#xff08;对抗性&#xff09;。进一步收集了关于自我监督学习的相关理论…

Windows压缩包的MySQL安装方式

1.下载压缩包 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.35-winx64.zip 2.解压压缩包&#xff08;建议将解压到非C盘&#xff0c;路径不要出现特殊符号&#xff09; 3.在MySQL主目录下&#xff0c;创建my.ini空文件&#xff08;先创建一个txt文件&#xff0c;进…