AVCodecContext :: channel_layout 0 для файлов WAV

Я успешно загружаю сжатые аудиофайлы с помощью 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).

1

Решение

В вашем 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 );

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]