Ошибка анализа аудиофайлов с более чем одним потоком - ffmpeg - PullRequest
0 голосов
/ 15 сентября 2018

Я работаю над небольшим приложением в cpp, которое будет конвертировать аудио, применять фильтры и генерировать сигнал с помощью ffmpeg. Я использую ffmpeg в качестве библиотеки, а не бинарный файл ffmpeg.

Моя ссылка была отсюда. https://ffmpeg.org/doxygen/4.0/transcode_aac_8c-example.html

Я прокомментировал часть, где они выходят из метода, выдавая исключение ниже.

Expected one audio input stream, but found 2

Я использую пример ffmpeg для транскодирования. Однако я получаю сообщение об ошибке при попытке перекодировать аудиофайл, содержащий более 1 потока. Обычно аудио - это аудио в формате mp3 с файлом изображения в качестве второго потока. Я получаю ошибку

[mp3 @ 0x1d487a0] Header missing
Could not decode frame (error 'Invalid data found when processing input')

Однако, когда я открываю аудиофайл в Audacity и экспортирую без файла изображения, он работает. Какие изменения необходимы для обработки более 1 потока?

1 Ответ

0 голосов
/ 16 сентября 2018

Я нашел источник проблемы.Пожалуйста, обратитесь к этой ссылке для примера.https://ffmpeg.org/doxygen/4.0/transcode_aac_8c-example.html

После дополнительной отладки кажется, что decode_audio_frame необходимо изменить, чтобы игнорировать или пропускать не аудио потоки.Я пропускаю их, как показано ниже.Вместо непосредственного вызова avcodec_decode_audio4 метода, я проверяю индекс потока пакета и игнорирую при необходимости.audio_index - это поле, объявленное глобально, которое будет установлено при открытии входного файла.

int strm_index = input_packet.stream_index;
    av_log(NULL, AV_LOG_INFO, "Stream index %i\n",
                           strm_index);
    if(strm_index!=audio_index){
        *data_present=0;
    }else{
        if ((error = avcodec_decode_audio4(input_codec_context, frame,
                                               data_present, &input_packet)) < 0) {
                av_log(NULL, AV_LOG_ERROR, "Could not decode frame (error '%s')\n",
                        av_err2str(error));
                av_packet_unref(&input_packet);
                return error;
        }
    }
...