如何用FFmpeg将立体声转换为单声道?

时间:2016-09-14 10:00:31

标签: c++ function audio ffmpeg

我将FFmpeg库用于个人项目,我需要一些帮助。我有一个立体声音乐文件,我想把这个立体声转换为单声道声音?这个图书馆可以吗?内部有功能来完成这项工作吗?我的项目是用C / C ++。

我搜索了FFmpeg网站和论坛上的Doxygen文档,但我没有找到有趣的东西。

感谢阅读!

3 个答案:

答案 0 :(得分:3)

使用libswresample中的swr_convert来转换格式。类似的东西:

#include "libswresample/swresample.h"

au_convert_ctx = swr_alloc();

out_channel_layout = AV_CH_LAYOUT_MONO;
out_sample_fmt = AV_SAMPLE_FMT_S16;
out_sample_rate = 44100;
out_channels = av_get_channel_layout_nb_channels(out_channel_layout);

in_sample_fmt = pCodecCtx->sample_fmt;
in_channel_layout=av_get_default_channel_layout(pCodecCtx->channels);

au_convert_ctx=swr_alloc_set_opts(au_convert_ctx,out_channel_layout, out_sample_fmt, out_sample_rate,
            in_channel_layout, in_sample_fmt, pCodecCtx->sample_rate, 0, NULL);
swr_init(au_convert_ctx);
//Generate your frame of original audio, then use swr_convert to convert to mono,
//converted number of samples will now be in out_buffer.
int converted = swr_convert(au_convert_ctx, &out_buffer, MAX_AUDIO_FRAME_SIZE, (const uint8_t **)&pFrame->data , pFrame->nb_samples);
//...
swr_free(&au_convert_ctx);

让你入门。这将转换原始格式为44100 kHz单声道。您也可以使用pCodecCtx->sample_rate作为输出采样率。

这是最灵活,最简单的解决方案。

答案 1 :(得分:2)

您可以只使用ffmpeg。出于此目的,存在直接命令-

ffmpeg -i stereo.flac -ac 1 mono.flac

将您的立体声文件转换成单声道。有关更多详细信息,您可以查看此页面-

https://trac.ffmpeg.org/wiki/AudioChannelManipulation

答案 2 :(得分:1)

正如我在评论中提到的,您可以自己重新取样。这取决于您已拥有的以及您使用的格式。我不能给你一些可以立即工作的代码,但是给你一个例子(伪/真码混合)。

在对帧进行编码并完成了必须执行的操作后,您的数据缓冲区将被音频填充。现在,这取决于您的格式(请参阅here)以及您拥有的频道数量。我们假设它是带符号的16位立体声,比你的缓冲区看起来像:

+-----+-----+-----+-----+-----+
| LS1 | RS1 | LS2 | RS2 | ... |
+-----+-----+-----+-----+-----+
// LS = LEFT SAMPLE 16 Bit
// RS = RIGHT SAMPLE 16 Bit

现在遍历缓冲区并一起计算左右样本。

for(int i=0; i<sample_size; i+=2) {
    auto r = (static_cast<int32_t>(buffer[i]) + buffer[i+1]) / 2;
    buffer[i] = buffer[i+1] = r;
}