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。
解码器输出平面,因为这是压缩流通常布局其数据的方式,因此对于各个解码器,这更有意义。
我已经使用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。
解码器输出平面,因为这是压缩流通常布局其数据的方式,因此对于各个解码器,这更有意义。