Правильно открывайте аудиофайлы с помощью libav/ffmpeg
Я пытаюсь декодировать аудио образцы из различных форматов файлов, используя ffmpeg. Поэтому я начал некоторые эксперименты, основанные на коде в этом обсуждении: Как декодировать аудио через FFmpeg в Android. Я использую последний выпуск FFMPEG (1.0) и компилирую его, используя https://github.com/halfninja/android-ffmpeg-x264
AVFormatContext * pFormatCtx;
avcodec_register_all();
av_register_all();
int lError;
if ((lError = avformat_open_input(&pFormatCtx, filename, NULL, 0))
!= 0) {
LOGE("Error open source file: %d", lError);
return;
}
if ((lError = avformat_find_stream_info(pFormatCtx, 0)) < 0) {
LOGE("Error find stream information: %d (Streams: %d)", lError, pFormatCtx->nb_streams);
return;
}
LOGE("audio format: %s", pFormatCtx->iformat->name);
LOGE("audio bitrate: %d", pFormatCtx->bit_rate);
audioStreamIndex = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_AUDIO,
-1, -1, &codec, 0);
//if (audioStreamIndex < 0 || audioStreamIndex >= pFormatCtx->nb_streams)
// audioStreamIndex = 0;
LOGE("Stream: %d (total: %d)", audioStreamIndex, pFormatCtx->nb_streams);
LOGE("audio codec: %s", codec->name);
FFMPEG компилируется с использованием enable-decoder=mp1/mp2/mp3/ogg/vorbis/wav/aac/theora и без каких-либо внешних библиотек (например, libmp3lame, libtheora и т. Д.)
Открытие файлов mp3 и wav работает без проблем, выдает следующий вывод, например, для mp3:
аудио формат: mp3
битрейт аудио: 256121
поток: 0 (всего: 1)
аудиокодек: mp3
Но когда я пытаюсь открыть файл ogg, я получаю это:
Ошибка поиска информации о потоке: -1 (потоки: 1)
Когда я вручную установил audioStreamIndex=0
и закомментируйте ответное заявление:
Ошибка поиска информации о потоке: -1 (потоки: 1)
аудио формат: mp3
аудио битрейт: 0
поток: 0 (всего: 1)
аудиокодек: mp3
Для m4a (AAC) я получаю это:
аудио формат: mp3
аудио битрейт: 288000
поток: 0 (всего: 1)
аудиокодек: mp1
но позже это терпит неудачу в avcodec_decode_audio3
,
Я также попытался вручную форсировать формат без успеха:
AVInputFormat *pForceFormat= av_find_input_format("ogg");
if ((lError = avformat_open_input(&pFormatCtx, filename, pForceFormat, 0))
// continue
Что-то не так с загрузочным кодом, который позволяет работать только с mp3 и wav и не работает для других форматов?
С Уважением,