1. ホーム
  2. c++

[解決済み] FFmpegでステレオサウンドをモノラルに変換する方法は?

2022-02-10 01:20:35

質問

私は個人的なプロジェクトでFFmpegライブラリを使用していますが、1つのことについて助けが必要です。私はステレオサウンドの音楽ファイルを持っており、私はこのステレオサウンドをモノラルサウンドに変換したいですか?それはこのライブラリで可能ですか?この仕事をするための関数が内部にあるのでしょうか?私のプロジェクトはC/C++で作られています。

FFmpegのウェブサイトのDoxygenドキュメントやこのフォーラムで検索してみましたが、面白いものは見つかりませんでした。

お読みいただきありがとうございます。

どのように解決するのですか?

使用方法 swr_convert を libswresample から取得して、フォーマット間の変換を行います。のようなものです。

#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 を出力サンプルレートとして指定します。

最も柔軟で簡単な解決策です。