我是靠谱客的博主 饱满世界,最近开发中收集的这篇文章主要介绍JavaCV异常:av_interleaved_write_frame() error -10053 while writing interleaved video packet,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JavaCV异常:av_interleaved_write_frame() error -10053 while writing interleaved video packet

    • 问题描述
    • 解决方案

JavaCV异常汇总 JavaCV异常汇总

问题描述

推流的过程一般是:获取到每一个AVPacket或者AVFrame然后循环推送出去。
我出现这个报错的时候是在直播暂停时遇到。之前实现暂停功能的时候,是通过空跑for循环,不去获取pkt或者frame,而是让for循环空跑,当恢复播放时,再继续获取pkt或者frame进行推送,这个时候就出现了如题的报错:av_interleaved_write_frame() error -10053 while writing interleaved video packet
查询ffmeg或者javacv关于10053这个错误码的描述,没有找到很有参考价值的答案,不过直接搜10053发现在socket中会有10053错误码的情况。而socket出现10053的原因可能如下:

  1. 可能软件的其他地方关闭了socket ;
  2. 可能对端已关闭了连接
  3. socket被其他线程关闭,内存访问越界
  4. 检查代码逻辑错误,别访问非法内存,写网络程序指针多做判断,释放要安全释放
  5. 创建无法连接到ServerSocket的socket连接会让程序死掉

一般都是由于连接问题导致的,所以猜想是不是因为暂停推流操作时导致服务与nginx的链接断开了,导致恢复播放继续推流无法推送。但是nginx的原理目前不是很清楚,猜测可能是因为下面的情况导致:

  • nginx与javacv的rtmp链接可能会有一个超时的情况,如果一段时间内无流传输,链接超时将会断开。

解决方案

如上所诉,如果是因为无流导致链接断开推流失败,那么暂停时循环推送同一个pkt或者frame是否会解决问题?
伪代码如下(以推送AVPaclet为例)

	AVPacket pkt = null;// 需要推送的pkt
	AVPacket oldpkt = null;// 缓存的pkt
	while(true){
		// 暂停开关
		if (playstatus) {
			// 将暂停前推得最后一个AVPacket拷贝给 要推送的pkt,循环推送最后一帧
			pkt = av_packet_clone(oldpkt);
		} else {
			// 获取AVPacket进行推送
			pkt = grabber.grabPacket();
			// copy一份AVPacket缓存起来
			oldpkt = pkt == null || pkt.size() <= 0 || pkt.data() == null ? null : av_packet_clone(pkt);
		}
		recorder.recordPacket(pkt);// 推送pkt
	}

完美解决!!!

最后

以上就是饱满世界为你收集整理的JavaCV异常:av_interleaved_write_frame() error -10053 while writing interleaved video packet的全部内容,希望文章能够帮你解决JavaCV异常:av_interleaved_write_frame() error -10053 while writing interleaved video packet所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部