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 浮点数的主要内容,如果未能解决你的问题,请参考以下文章

如何在ffmpeg中使用滤镜技术

如何在android上使用ffmpeg录制视频?

如何在 ReactJS 项目中使用 ffmpeg.js

如何使用 FFmpeg 直播本地视频

如何使用ffmpeg库把从摄像头传回的bmp图像不断保存成视频?

如何使用 ffmpeg 记录特定窗口?