2013-11-15 1 views
1

Я успешно загрузкой сжатых звуковых файлов с помощью FFmpeg и запрашивая их channel_layouts используя код я написал:AVCodecContext :: channel_layout 0 для WAV файлов

AVFormatContext* fmtCxt = nullptr; 
avformat_open_input(&fmtCxt, "###/440_sine.wav", nullptr, nullptr); 
avformat_find_stream_info(fmtCxt, nullptr); 
av_find_best_stream(fmtCxt, AVMEDIA_TYPE_AUDIO, -1, -1, nullptr, 0); 

AVCodecContext* codecCxt = fmtCxt->streams[ret]->codec; 
AVCodec* codec = avcodec_find_decoder(codecCxt->codec_id); 
avcodec_open2(codecCxt, codec, nullptr); 

std::cout << "Channel Layout: " << codecCxt->channel_layout << std::endl; 
av_dump_format(fmtCxt, 0, "###/440_sine.wav", 0); 

Я удалил все проверки ошибок для краткости. Однако для файлов WAV Microsoft (моно или стерео) AVCodecContext::channel_layout члена всегда 0 - несмотря на ffprobe и av_dump_format(..) и возвращение достоверной информация:

Input #0, wav, from '###/440_sine.wav': 
Duration: 00:00:00.01, bitrate: 740 kb/s 
Stream #0:0: Audio: pcm_s16le ([1][0][0][0]/0x0001), 44100 Hz, 1 channels, s16, 705 kb/s 

Также codecCxt->channels возвращает правильное значение. Используя файл flac (с точно те же аудиоданные, сгенерированные из того же приложения), дает channel_layout 0x4 (AV_CH_FRONT_CENTER).

+0

Я должен заявить, я использую FFmpeg 2.1. – cmannett85

ответ

3

В вашем WAV-файле используется кодек pcm_s16le FFmpeg, который не имеет информации о компоновке канала. Вы можете иметь только количество каналов. Много объяснений можно найти here

У вас есть правильный channel_layout с файлом flac, потому что FAC-код FFmpeg заполняет это поле. Вы можете найти таблицу соответствия в файле libavcodec/flac.c, массиве flac_channel_layouts.

Если вам нужно заполнить channel_layout вручную, вы можете позвонить:

codecCxt->channel_layout = av_get_default_channel_layout(codecCxt->channels);