使用FFMPEG导出码流到AVI/MP4文件的若干问题

时间:2023-02-05 10:04:17

最近在做使用FFMPEG将码流导出到AVI/MP4文件,碰到些许问题记录下来。

1、导出的AVI/MP4文件,播放速度不正确,如1分钟的码流花了50秒或者70秒放完。

原因: 出现此问题主要是因为PTS计算的有问题。

解决方法: PTS是根据每个包的时间来计算的,在计算前需要先设置 AVCodecContext 的time_base. 此处需要将time_base.den =  1000;
time_base.num = 1;然后再调用av_rescale_q()函数去计算PTS。


2、导出的AVI/MP4文件播放有花屏

原因:出现花屏说明丢帧了。

解决方法: 丢帧说明的写包av_write_frame()的时候失败。失败的原因秀有可能是因为PTS出现问题。FFMPEG写入AVI/MP4文件的时候,一定要确保

PTS是递增的,当前帧的PTS不能等于或小于前面所有帧的PTS,否则av_write_frame()会失败。因此我们在将码流写入到AVI/MP4文件前,需要先将确保时间戳的正确性,如果不正确,请手动调整为正确。


3、导出的AVI/MP4文件时崩溃

原因:访问越界

解决方法:很有可能是AVCodecContext video_width、 video_height没有设置或为0导致的。但是不排除其他原因。

   建议可以看ffmpeg源码排查问题。


4、导出的文件音视频不同步

原因:两个码流时间不同步。

解决方法:

1、针对视频的AVStream 需要设置正确的AVCodecContext  time_base,参照问题1

2、两个视频包间的音频包的时间戳都相同,且等于前一个视频包的时间戳。根据问题1的解决方法,需要将音频包的时间戳在前一个视频包的时间戳的基础上递增上去。


5、导出的文件音频不清晰,断断续续

原因:导出的文件音频比特率设置错误

解决方法:针对音频的AVStream 需要设置正确的bit_rate、sample_rate、sample_fmt = AV_SAMPLE_FMT_S16、channels