2

libavcodec/ffmpeg API を使用して、AAC-LC、AAC-HE-V1、AAC-HE-V2 でオーディオをエンコードしようとしています。

しかし、次の構成と API 呼び出しを使用すると、「無効な AAC プロファイル」と表示されます。

AVCodecContext *encoder_ctx;
encoder_ctx->codec_id           =   AV_CODEC_ID_AAC;
encoder_ctx->sample_fmt         =   AV_SAMPLE_FMT_S16; 
encoder_ctx->profile            =   FF_PROFILE_AAC_HE;

encoder = avcodec_find_encoder(encoder_ctx->codec_id);
avcodec_open2(encoder_ctx, encoder, NULL);

これの何が悪いのか説明していただけますか?

4

3 に答える 3

4

まず、次の ドキュメントをご覧ください。

ドルビーデジタル:ac3

ドルビーデジタルプラス:eac3

MP2: libtwolame、mp2

Windows Media オーディオ 1: wmav1

Windows Media オーディオ 2: wmav2

LC-AAC: libfdk_aac、libfaac、aac、libvo_aacenc

HE-AAC: libfdk_aac、libaacplus

Vorbis: libvorbis、vorbis

MP3: libmp3lame、libshine

作品: libopus

上記の読みから、HE-AAC/HE-AAC-V2 でオーディオをエンコードするには、libfdk_aac または libaacplus を使用する必要があることが明らかです。

libfdk_aac を使用してそれを行う方法を説明します。

まず、次のオプションとともに ffmpeg を設定してください。

--enable-libfdk_aac --enable-nonfree

ffmpeg をビルドし、次のコマンドを実行して、動作するかどうかを確認します。

ffmpeg -i <input file> -vcodec copy -acodec libfdk_aac -profile:a aac_he <output file>

これが機能する場合、libav が libfdk_aac とリンクされていることを意味します。

コードでそれを使用するために:

次の手順を使用してエンコーダーを開きます。

AVCodecContext *encoder_ctx;
encoder_ctx->codec_id           =   AV_CODEC_ID_AAC;
encoder_ctx->sample_fmt         =   AV_SAMPLE_FMT_S16; 
encoder_ctx->profile            =   FF_PROFILE_AAC_HE;

encoder = avcodec_find_encoder_by_name("libfdk_aac");
// if you still try to open it using avcodec_find_encoder it will open libfaac only.
avcodec_open2(encoder_ctx, encoder, NULL);

これで libfdk_aac エンコーダーが開きました! 使用できるプロファイルは、この ソースに記載されているとおりです

于 2013-09-19T16:53:01.100 に答える