我使用avcodec_decode_audio4成功解码了mp4的音频数据,我想保存已解码的帧,所以我试过下面
if (got_frame) {
int size;
uint8_t *data;
int ref = 0;
ret = swr_convert(swr, &data, frame->nb_samples, (const uint8_t **)frame->extended_data, frame->nb_samples);
//fwrite(data, 1, frame->nb_samples, fp_audio);
ref++;
int szie = av_samples_get_buffer_size(NULL, 2, 1024, AV_SAMPLE_FMT_FLTP, 1);
for (int i = 0; i < frame->linesize[0]/4; i++)
{
fwrite(frame->data[0] + 4*i, 1, 4, fp_audio);
fwrite(frame->data[1] + 4*i, 1, 4, fp_audio);
ref++;
}
av_frame_unref(frame);
}
&#13;
但是pcm听起来很奇怪,我也尝试过如下指导
fwrite(frame->data[0], 1, frame->linesize[0], fp_audio);
&#13;
或:
fwrite(frame->data[0], 1, frame->linesize[0], fp_audio);
fwrite(frame->data[1], 1, frame->linesize[0], fp_audio);
&#13;
我知道解码的pcm是AV_SAMPLE_FMT_FLTP 任何帮助将不胜感激
答案 0 :(得分:2)
FLTP是平面浮点数,因此在立体声的情况下,你有两个缓冲区,data [0]和data [1],它们是每个通道的平面。
对于像.wav这样的东西,你通常想要写入交错数据,所以基本上是一个数组,其中每个偶数条目都被留下而每个奇数条目都是右通道。为此,请转换为FLT(不含P)。另请注意,.wav通常使用int16,而不是float,因此,转换为S16。
解码器输出平面因为压缩流通常如何布局数据,所以对于各个解码器来说,这更有意义。