ffmpeg 如何使用 AV_SAMPLE_FMT_FLT 从 AVFrame 获取 PCM 浮点数
Posted
技术标签:
【中文标题】ffmpeg 如何使用 AV_SAMPLE_FMT_FLT 从 AVFrame 获取 PCM 浮点数【英文标题】:ffmpeg How to get PCM floats from AVFrame with AV_SAMPLE_FMT_FLT 【发布时间】:2020-11-20 22:10:17 【问题描述】:我有一个通过解码器获得的 AVFrame,其格式为AVSampleFormat::AV_SAMPLE_FMT_FLT
。我的问题是我想转换里面存储的数据
avFrame->data; // returns uint8_t *
到 [-1, +1] 之间的浮点数组。我看到avFrame->data;
返回uint8_t *
如何使用它来获取音频每个通道的浮点 pcm 数据?
我尝试了以下方法:
auto *floatArrPtr = (float *)(avResampledDecFrame->data[0]);
for (int i = 0; i < avResampledDecFrame->nb_samples; i++)
// TODO: store interleaved floats somewhere
floatArrPtr++;
但我不确定这是否是获取数据的正确方法
【问题讨论】:
您必须转换数据。在resampling audio 示例中,它们执行相同的操作(例如,fill_samples fn)。说清楚点,解码后的格式是FMT_FLT,基本就是你想要的,唯一的原因就是指针类型吧? 我设置了一个重采样器,输出为 FMT_FLT。我编辑了我的问题,你能检查它是否有意义吗? 演员表似乎还可以(c-cast),但根据AVFrame::nb_samples'音频样本数(每个通道)' 和例如,这是最接近的以你的例子print_frame. 由于数据已打包,我忘了乘以通道数。后来它起作用了。 感谢您提供的信息,我自己也不确定,现在“我们”知道了。 【参考方案1】:auto *floatArrPtr = (float *)(avResampledDecFrame->data[0]);
for (int i = 0; i < avResampledDecFrame->nb_samples * avResampledDecFrame->channels; i++)
// TODO: do as you please with data
floatArrPtr[i];
【讨论】:
以上是关于ffmpeg 如何使用 AV_SAMPLE_FMT_FLT 从 AVFrame 获取 PCM 浮点数的主要内容,如果未能解决你的问题,请参考以下文章