【发布时间】: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用于平面数据。