概述
最近在程序转码的时候发现音频给转没了,就消失了。但是使用ffmpeg自带的程序转码时却没有发生。
不由得好奇,导致出现的原因,检查日志发现了如下的错误
Changing audio frame properties on the fly is not supported by all filters
通过追踪代码发现该错误出现的位置为下图位置----向滤图中添加音频帧的时候错误,百思不得其解:
经过查看源码,该错误是以下一段代码产生的:
根据其调用的上下文,我们可以发现,这个其实就是拿FilterContext和解码后的frame的sample,channel_layout,channels,format来进行比较。
而这个FilterContext的初始化在下图处,可以看到本程序使用的是解码器信息,大部分情况没出现问题。
此例便是出现了,dec_ctx->chanel_layout = 4,但是dec_frame->channel_layout=3的情况才出现问题,所以出现了这种情况,到此出现此问题的原因基本清楚了。
其实,还有一个问题,为啥ffmpeg的程序没有问题,但是我们的程序出现了问题呢?既然到这了,那么就再扒一下ffmpeg.c的源码:
经过查找发现了熟悉的味道,ifilter,那么这个ifilter的数据又是从哪里来的呢,继续扒。
跟踪其调用堆栈,我们可以发现ifilter里的sample_rate等数据就是解码过的帧的数据。
在寻找此过程的时候我发现,ffmpeg.c程序的filter_graph初始化是在完成解码后才进行的初始化,而我们通常会受到雷神(https://blog.csdn.net/leixiaohua1020)和dev包里/example/transcoding.c文件的影响,在解码之前已经把filter_graph给初始化了,这才出现了这种情况,至此所有的疑问都得到了解决,满足。
当找到最后时,脑中突然出现了我之前处理过这种问题的印象,不由懊恼。想到百度时,并没有找到此问题的相关有用信息,转而打开许久不用的csdn博客,记录下来。
最后
以上就是平淡小蚂蚁为你收集整理的Changing video/audio frame properties on the fly is not supported by all filters 原因及解决方法的全部内容,希望文章能够帮你解决Changing video/audio frame properties on the fly is not supported by all filters 原因及解决方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复