我已经使用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
)。
答案 0 :(得分:3)
您的WAV文件使用FFmpeg的pcm_s16le编解码器,它没有关于通道布局的信息。您只能拥有频道数量。可以找到很多解释here
你有正确的channel_layout
flac文件,因为FFmpeg的flac编解码器填充了这个字段。您可以在libavcodec/flac.c文件flac_channel_layouts
数组中找到对应表。
如果您需要手动填写channel_layout
,可以致电:
codecCxt->channel_layout = av_get_default_channel_layout( codecCxt->channels );