我正在使用 ffms2(ffmpegsource) 一个围绕 libav 的包装器来从文件中获取视频和音频帧。视频解码工作正常。但是我在音频解码方面遇到了一些问题。FFMS2 提供了一个简单的函数FFMS_GetAudio(FFMS_AudioSource *A, void *Buf, int64_t Start, int64_t Count, FFMS_ErrorInfo *ErrorInfo);
api 来获取解码后的缓冲区。解码后的数据在用户提供的缓冲区中返回。
对于单通道,数据的解释是直接的,数据字节从用户缓冲区的第一个位置开始。然而,当涉及到两个通道时,根据 FFMS_GetAudioProperties 返回的样本格式,解码的数据有两种可能是平面的或交错的。在我的例子中,样本格式总是平面的,这意味着解码的数据将在两个独立的数据平面数据[0]和数据[1]中。这就是 libav/ffmpeg 和 portaudio 所解释的,它们认为平面数据位于两个单独的数据平面中。
但是 FFMS_GetAudio 只从用户那里获取单个缓冲区。所以我可以假设平面数据 data[0] = buf, data[1] = buf + offset,其中 offset 是 FFMS_GetAudio 返回的缓冲区长度的一半。
FFMS 没有为这种解释提供任何好的文件。如果有人能提供更多有关这方面的信息,那将是很大的帮助。