概述
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的原因可能如下:
- 可能软件的其他地方关闭了socket ;
- 可能对端已关闭了连接
- socket被其他线程关闭,内存访问越界
- 检查代码逻辑错误,别访问非法内存,写网络程序指针多做判断,释放要安全释放
- 创建无法连接到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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复