音频 av_buffersrc_add_frame 错误

来源:11-11 如何使用filter-获取原始数据

慕妹8246037

2024-01-26

老师这章开篇说滤镜可以做音视频倍速播放,我上网搜了一些,自己写代码试了下,视频流用了setpts滤镜,结果是好的,最后获取的frame的pts确实按照设置的倍数改变了,音频用atemp, 但是av_buffersrc_add_frame报错-1163346256, av_err2str(-1163346256) 是Not yet implemented in FFmpeg, patches welcome。 老师有时间看看能不能看下哪错了

abuffer 的配置参数是

time_base=1/44100:sample_rate=44100:sample_fmt=fltp:channel_layout=stereo:channels=2

"atempo"的配置参数是tempo=2.0
"abuffersink"的配置参数是

enum AVSampleFormat sample_fmts[] = {AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE};
int64_t channel_layouts[2] = {3, -1 }; 
int channels[2] = {2, -1 }; 
int sample_rates[2] = {44100, -1 }; 
// AV_SAMPLE_FMT_FLTP、 3、 2、 44100 这些参数都是编码器上下文获取的

终端打印音频流信息

Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)

配置过程也没报错,avfilter_link() API 这三个link 也没有报错,但是av_buffersrc_add_frame就报错了,我看
av_log_set_callback(log_callback)中打印的错误信息是

Format change is not supported

错误信息中的format指的是sample_fmt吗?, 可是我配置的都是音频中的AV_SAMPLE_FMT_FLTP,而且解码出来的音频帧format 也是AV_SAMPLE_FMT_FLTP, 这不都是匹配的吗😂😂😂。

写回答

1回答

慕妹8246037

提问者

2024-01-26

解决了,处理音频流的时候忘记调用avfilter_graph_config这个API,疏忽了, 一直在纠结这个format了,浪费了我两天时间

0
9
慕妹8246037
回复
李超
老师不用了,这个问题刚刚解决了😄😊,我用的是iOS的播放pcm的API。声卡需要一个播放队列, 我设置了3个buffer (循环使用,每个buffer大小就是一个音频帧)给队列,每个buffer播放结束然后从packet 解码一个frame、经过滤镜处理,再放回buffer队列。不知道是不是因为中间存在这种情况,3个buffer都放完了,但是还没有从packet、滤镜中取出frame,比如AVERROR(EAGAIN)这种情况, 导致了细小的播放空白,空白多了听着好像是噪音一样, 我把buffer设置为5个, 尽可能避免buffer全用完还没有取出新的frame情况, 就明显没有噪音了。只改了buffer数量,其他都没动, 这是我能想到的合理解释了😂😂, 后面我在详细验证下。
2024-02-02
共9条回复

经典再升级-FFmpeg5.0核心技术精讲,打造音视频播放器

学好FFmpeg核心技术,做高效,高薪,有竞争力的音视频工程师

2732 学习 · 814 问题

查看课程