ffmpeg如何将解码后的音频数据保存到pcm

时间:2015-04-21 11:54:51

标签: android audio ffmpeg

我使用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;
&#13;
&#13;

但是pcm听起来很奇怪,我也尝试过如下指导

&#13;
&#13;
fwrite(frame->data[0], 1, frame->linesize[0], fp_audio);
&#13;
&#13;
&#13;

或:

&#13;
&#13;
fwrite(frame->data[0], 1, frame->linesize[0], fp_audio);
fwrite(frame->data[1], 1, frame->linesize[0], fp_audio);
&#13;
&#13;
&#13;

我知道解码的pcm是AV_SAMPLE_FMT_FLTP 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

FLTP是平面浮点数,因此在立体声的情况下,你有两个缓冲区,data [0]和data [1],它们是每个通道的平面。

对于像.wav这样的东西,你通常想要写入交错数据,所以基本上是一个数组,其中每个偶数条目都被留下而每个奇数条目都是右通道。为此,请转换为FLT(不含P)。另请注意,.wav通常使用int16,而不是float,因此,转换为S16。

解码器输出平面因为压缩流通常如何布局数据,所以对于各个解码器来说,这更有意义。