【问题标题】:FFmpeg AVFrame Audio Data ModificationFFmpeg AVFrame 音频数据修改
【发布时间】:2017-01-12 19:31:54
【问题描述】:

我试图弄清楚 FFmpeg 在音频解码后如何将数据保存在AVFrame 中。

基本上,如果我打印 AVFrame->data[] 数组中的数据,我会得到一些无符号 8 位整数,它们是原始格式的音频。

据我从 FFmpeg doxygen 中了解到,数据的格式以enum AVSampleFormat 表示,主要有 2 个类别:交错式和平面式。在交错类型中,数据全部保存在AVFrame->data 数组的第一行,大小为AVFrame->linesize[0],而在平面类型中,音频文件的每个通道都保存在AVFrame->data 数组的单独行中,并且数组的大小为AVFrame->linesize[0]

是否有说明数组中的数字对每种格式的含义的指南/教程?

【问题讨论】:

    标签: c audio ffmpeg


    【解决方案1】:

    每个data 数组(平面)中的值是根据指定格式的实际音频样本。例如。如果格式为AV_SAMPLE_FMT_S16P,则意味着data 数组实际上是int16_t PCM 数据的数组。如果我们处理单声道信号——只有data[0]有效,如果是立体声——data[0]data[1]有效,以此类推。

    我不确定是否有任何指南可以帮助您解释每个特定案例,但无论如何,所描述的方法非常简单且易于理解。你应该玩一下它,事情应该会变得清晰。

    【讨论】:

    • 如果AVFrame.h中的数组声明为uint8_tAVFrame->data怎么可能包含int16_t
    • 只需使用演员表:int16_t *pcm16 = (int16_t*) frame->data[0]
    • AVFrame->data 中的数组中的每个元素是否代表 1 个音频样本?
    • 不完全是:) data[N] 是指向某个数据平面的指针。 linesize[N] 是某个平面中的字节数。例如。对于AV_SAMPLE_FMT_S16P,如果linesize[0]100,那么data[0] 是指向50 int16_t 样本的指针。
    • 这是否意味着每个样本都用data[0]数组的2个元素表示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2021-10-26
    • 2016-01-10
    • 2017-05-05
    相关资源
    最近更新 更多