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

ffmpeg how to save decoded audio data to pcm

我已经使用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);
}

但是pcm听起来很奇怪,我也试过直接写成如下

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

或:

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

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

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

对于 .wav 之类的东西,您通常希望写入交错数据,因此基本上是一个数组,其中每个偶数条目都在左侧,每个奇数条目都在右声道。为此,请转换为 FLT(无 P)。另请注意,.wav 通常使用 int16,而不是 float,因此为此,请转换为 S16。

解码器输出平面,因为这是压缩流通常布局其数据的方式,因此对于各个解码器,这更有意义。