我制作了一个测试台应用程序来测试LibAV的FilterGraph。我想使用它(在其他过滤器中)以48kHz采样率将任何给定的音轨转换为有符号的16位立体声PCM(news.msg
)。目前,我的测试声音文件位于以下位置:https://commons.wikimedia.org/wiki/File:Median_test.ogg
当我采用文件44,100Hz的采样率并使afromat返回该精确采样率时,转换就很好。但是,当尝试转换为48000Hz时,会出现明显的弹出声。
查看所生成的波形,似乎是通过随时间间隔隔开波形并将生成的空间保留为0来粗略地转换音频文件。
据我所知和文档,s16
应该根据需要创建aformat
,以处理这种情况as specified here。
我正在使用的代码如下所示。接收resample
并将../test.ogg
输出为16bit PCM @ 48000Hz。
../out_filter.raw
答案 0 :(得分:0)
下面显示的代码片段错误地使用了输入帧来确定要从新的转换帧中复制出来的字节。此代码块使用名为frame
的输入帧,而不是称为oframe
的输出帧。
int nb_channels = av_get_channel_layout_nb_channels(frame->channel_layout);
int bytes_per_sample = av_get_bytes_per_sample(frame->format);
int data_size = frame->nb_samples * nb_channels * bytes_per_sample;
fwrite(oframe->data[0], 1, (size_t) data_size, out);
更正后的版本如下所示:
int nb_channels = av_get_channel_layout_nb_channels(oframe->channel_layout);
int bytes_per_sample = av_get_bytes_per_sample(oframe->format);
int data_size = oframe->nb_samples * nb_channels * bytes_per_sample;
fwrite(oframe->data[0], 1, (size_t) data_size, out);
卡顿是由于未复制正确的字节数引起的。