FFMPEG之编码实现RTMP循环推流(附带av_interleaved_write_frame返回-22处理)04

FFMPEG之编码实现RTMP循环推流(附带av_interleaved_write_frame返回-22处理)

前言

本篇是参考雷神的推流进行二次处理的,可以参考雷神这篇博客。[最简单的基于FFmpeg的推流器(以推送RTMP为例)](https://blog.csdn.net/leixiaohua1020/article/details/39803457)。

为了防止遗忘,在此记录下来当时做题的过程。我当时实现这个功能的时候,确实非常困难,参考的博客不多,而且还被许多博客带偏了。。。前天开始弄,连续两晚通宵达旦,难受。 1)本篇思路是非常简单的,就是每次播放完毕利用av_seek_frame()就将ifmt_ctx往回移即可;然后重新播放。 以下是我遇到的问题 Q1:第一次读完毕后,av_read_frame返回-11,然后再读的时候结果发现pts、dts为很大的负数,无法继续执行; Q2:于是我往着时间戳的方面入手,结果打印pts,dts一看,前一帧的pts=80(假设数据),后一帧的pts=40,这样的话av_write_frame在写帧时就会报错,返回-22;于是我又找,发现雷神调用这两个函数在舍弃小数时会舍弃掉几十秒,造成pts前后帧不是顺序排序,解决就是换成我下面代码的那个函数,两个实际是一样的,只不过我的不会舍弃小数。 解决上面的后,运行结果还是不对,于是我以为是av_seek_frame()的问题,百度搜。。。但是也没有太好的答案,然后随便用一个,去打印了第一次循环播放的前一帧和第二次循环播放的第一帧,结果发现是一样的数据

猜你喜欢

转载自blog.csdn.net/weixin_44517656/article/details/108392900
今日推荐