Как декодировать AAC с помощью avcodec_decode_audio4?

Я изменил в своем коде avcodec_decode_audio3 на avcodec_decode_audio4 и добавил обработку кадров. Но теперь я больше не могу декодировать кадры AAC.

Почему avcodec_decode_audio4 возвращает -22 (недопустимый аргумент)? Следуя приведенному ниже ответу, имеет ли это какое-то отношение к параметрам в AVContext, которые необходимо установить?

Мне пришлось использовать avcodec_decode_audio4, потому что я обновил свой ffmpeg и получил следующую ошибку:

[NULL @ 0xb14f020] Custom get_buffer() for use withavcodec_decode_audio3() detected. 
         Overriding with avcodec_default_get_buffer
[NULL @ 0xb14f020] Please port your application to avcodec_decode_audio4()

Согласно Ошибка буфера в avcodec_decode_audio4(), это регрессия, есть ли другое решение для этого, чем вернуться к ffmpeg ‹ 0.8?

Декодер, использующий avcodec_decode_audio4:

AVCodec *codec;
AVCodecContext *avCtx;
AVFrame * decoded_frame = NULL;
uint8_t *outbuf = static_cast<uint8_t *>(malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE));
AVPacket avPacket;

main(){
    av_register_all();
    codec = avcodec_find_decoder(CODEC_ID_AAC);

    //set parameters
    avCtx = avcodec_alloc_context3(codec);
    avCtx->channels = 1;
    avCtx->sample_rate = 44100;
    avCtx->bit_rate=16;

    if (avcodec_open2(avCtx, codec, NULL) < 0) printf("Could not open codec\n");

    av_init_packet(&avPacket);

    //Main decoder loop
    while(1) 
        my_frame_decoder();
    return 0;
}

void my_frame_decoder() {
    //get data
    ...
    avPacket.size = numBytes;
    avPacket.data = inputBytes;
    int len;

    while (avPacket.size > 0) {

    int got_frame = 0;
    if (!decoded_frame) {
        if (!(decoded_frame = avcodec_alloc_frame())) {
            printf("out of memory");
            return;
        }
    } else {
        avcodec_get_frame_defaults(decoded_frame);
    }

    //-------------------->> returns always -22
    len = avcodec_decode_audio4(avCtx, decoded_frame, &got_frame, &avPacket); 

    //do something with the decoded frame
    ...
    avPacket.size -= len;
    avPacket.data += len;
    }

    return;
}

person user2212461    schedule 30.07.2014    source источник


Ответы (4)


После нескольких часов поиска я обнаружил, что dec_ctx из avcodec_decode_audio4 должен быть открыт dec_codec, инициализированным av_find_best_stream()

1° av_find_best_stream(in_fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1,
                &dec_codec, 0);<br>
2° dec_ctx = m_in_aud_strm->codec;<br>
3° av_opt_set_int(dec_ctx, "refcounted_frames", 1, 0);<br>
4° avcodec_open2(dec_ctx, dec_codec, NULL)<br>
.
.
.
5° avcodec_decode_audio4(dec_ctx, pFrame, &got_frame, &pkt);
person Hamdy Ben Salah    schedule 10.07.2015

Я думаю, проблема в параметрах, установленных в контексте вашего кодека. См. https://www.ffmpeg.org/doxygen/trunk/structAVCodecContext.html для установки параметров, которые изменились с avcodec_decode_audio3 на avcodec_decode_audio4.

person Community    schedule 30.07.2014
comment
Вы должны предоставить более подробную информацию, иначе этот ответ может быть бесполезен. - person user3521269; 30.07.2014

Нет решения, но обходной путь - вернуться к более старым сборкам. После тестирования различных сборок, работающих с avcodec_decode_audio3, я подумал, что другим будет полезно узнать, что ffmpeg-0.10.14.tar.bz2 из https://ffmpeg.org/releases/ работает.

person user2212461    schedule 30.07.2014

person    schedule
comment
наконец-то я понял, как вставить код в stackoverflow... - person ricardospk__; 15.10.2020