Я успешно загружаю сжатые аудиофайлы с помощью FFmpeg и запрашиваю их channel_layouts с помощью некоторого кода, который я написал:
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 );
Я удалил все проверки ошибок для краткости. Однако для файлов Microsoft WAV (моно или стерео) 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
).
В вашем WAV-файле используется кодек FFmpeg pcm_s16le, в котором нет информации о разметке канала. Вы можете иметь только количество каналов. Много объяснений можно найти Вот
У вас есть правильный channel_layout
с файлом flac, потому что кодек flac FFmpeg заполняет это поле. Вы можете найти таблицу соответствия на кодек / flac.c файл, flac_channel_layouts
массив.
Если вам нужно заполнить channel_layout
вручную вы можете позвонить:
codecCxt->channel_layout = av_get_default_channel_layout( codecCxt->channels );
Других решений пока нет …