【问题标题】:FFMPEG Understanding AVFrame::linesize (Audio)FFMPEG 理解 AVFrame::linesize (音频)
【发布时间】:2015-12-04 12:10:39
【问题描述】:

根据 AVFrame 的文档,对于音频,lineSize 是每个平面的字节大小,只能设置 linesize[0]。但是,我不确定lineszie[0] 是保持每个平面缓冲区大小还是完整的缓冲区大小,我们必须将其除以通道数才能获得每个平面缓冲区大小。

例如,当我打电话时 int data_size = av_samples_get_buffer_size(NULL, iDesiredNoOfChannels, iAudioSamples, (AVSampleFormat)iDesiredFormat, 0) ; 对于 iDesiredNoOfChannels = 2,iAudioSamples = 1024 & iDesiredFormat = AV_SAMPLE_FMT_FLTP data_size=8192。非常简单,因为每个样本是 4 个字节,并且由于有 2 个通道,因此总内存将是 (1024 * 4 * 2) 字节。因此对于平面音频,lineSize[0] 应该是 4096。 data[0] & data[1] 应该是每个大小 4096。但是,pFrame->lineSize[0] 给出 8192。所以要获得每个平面的大小,我必须做 pFrame->lineSize[0] / pFrame - >频道。这种行为是否与文档建议的不同,或者我对文档的理解是错误的。

【问题讨论】:

  • 我最近被这个咬了! ffmpeg docs 有关于 linesize 的注释,上面写着“linesize 可能大于可用数据的大小”。我的结论是......不要相信它,自己计算字节数,sizeof(sample) * channels * samples 用于打包数据,sizeof(sample) * samples 用于平面数据。

标签: audio ffmpeg


【解决方案1】:

老问题,但我想我还是会为可能想知道同样事情的人回答这个问题。

在所有音频 AVFrames 中,只能设置 linesize[0] 并且它们都必须是相同的大小。您不应该使用 linesize[1] 等。我不知道他们为什么选择这样做,因为它与视频帧不一致,但无论如何。请记住,仅交错或平面的 linesize[0] 很重要,因此您必须除以平面的通道数。

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多