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

新手上路,请多包涵

我将 FFmpeg 库用于个人项目,我需要关于一件事的帮助。我有一个立体声音乐文件,我想将此立体声转换为单声道?这个库可以吗?里面有没有做这项工作的功能?我的项目是 C/C++。

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

谢谢阅读 !

原文由 Meugiwara 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 973
2 个回答

使用来自 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 作为输出采样率。

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

原文由 Steve M 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题