通道问题
在使用函数swr_alloc_set_opts给SwrContext传递输入输出的音频参数时,需要设置通道,这里通道为2,但是通道布局不能传递2.比如AV_CH_LAYOUT_STEREO 实际值为3
如果要计算通道布局的通道数使用函数av_get_channel_layout_nb_channels
int src_nb_channels = av_get_channel_layout_nb_channels(src_ch_layout);
swr_ctx = swr_alloc_set_opts(nullptr,dst_wave_fmt.ch_layout, //输出通道dst_wave_fmt.sample_fmt, //输出样本格式dst_wave_fmt.rate, //输出采样率AV_CH_LAYOUT_STEREO_DOWNMIX, //输入通道src_wave_fmt.sample_fmt, //输入样本格式src_wave_fmt.rate, //输入采样率0, nullptr);
声道map定义在 libavutil/channel_layout.c文件中
static const struct {const char *name;int nb_channels;uint64_t layout;
} channel_layout_map[] = {{ "mono", 1, AV_CH_LAYOUT_MONO },{ "stereo", 2, AV_CH_LAYOUT_STEREO },{ "2.1", 3, AV_CH_LAYOUT_2POINT1 },{ "3.0", 3, AV_CH_LAYOUT_SURROUND },{ "3.0(back)", 3, AV_CH_LAYOUT_2_1 },{ "4.0", 4, AV_CH_LAYOUT_4POINT0 },{ "quad", 4, AV_CH_LAYOUT_QUAD },{ "quad(side)", 4, AV_CH_LAYOUT_2_2 },{ "3.1", 4, AV_CH_LAYOUT_3POINT1 },{ "5.0", 5, AV_CH_LAYOUT_5POINT0_BACK },{ "5.0(side)", 5, AV_CH_LAYOUT_5POINT0 },{ "4.1", 5, AV_CH_LAYOUT_4POINT1 },{ "5.1", 6, AV_CH_LAYOUT_5POINT1_BACK },{ "5.1(side)", 6, AV_CH_LAYOUT_5POINT1 },{ "6.0", 6, AV_CH_LAYOUT_6POINT0 },{ "6.0(front)", 6, AV_CH_LAYOUT_6POINT0_FRONT },{ "hexagonal", 6, AV_CH_LAYOUT_HEXAGONAL },{ "6.1", 7, AV_CH_LAYOUT_6POINT1 },{ "6.1(back)", 7, AV_CH_LAYOUT_6POINT1_BACK },{ "6.1(front)", 7, AV_CH_LAYOUT_6POINT1_FRONT },{ "7.0", 7, AV_CH_LAYOUT_7POINT0 },{ "7.0(front)", 7, AV_CH_LAYOUT_7POINT0_FRONT },{ "7.1", 8, AV_CH_LAYOUT_7POINT1 },{ "7.1(wide)", 8, AV_CH_LAYOUT_7POINT1_WIDE_BACK },{ "7.1(wide-side)", 8, AV_CH_LAYOUT_7POINT1_WIDE },{ "octagonal", 8, AV_CH_LAYOUT_OCTAGONAL },{ "hexadecagonal", 16, AV_CH_LAYOUT_HEXADECAGONAL },{ "downmix", 2, AV_CH_LAYOUT_STEREO_DOWNMIX, },{ "22.2", 24, AV_CH_LAYOUT_22POINT2, },
};
PCMA播放问题
播放PCMA
ffplay -f s16le -ar 8000 -acodec pcm_alaw -ac 1 src.pcma
播放PCMU
ffplay -f s16le -ar 8000 -acodec pcm_mulaw -ac 1 src.pcmu