2013-05-01 41 views
0

我正在使用ffms2(ffmpegsource)libav的包装来从文件中获取视频和音频帧。 视频解码工作正常。不过,我正面临音频解码的一些问题。 FFMS2提供了一个简单的函数FFMS_GetAudio(FFMS_AudioSource *A, void *Buf, int64_t Start, int64_t Count, FFMS_ErrorInfo *ErrorInfo); api来获取解码后的缓冲区。解码后的数据返回到用户提供的缓冲区中。使用ffms2进行音频解码(ffmegsource)

对于单通道,数据解释是直接的,数据字节从用户缓冲区的第一个位置开始。但是,对于两个通道,有两种可能性,根据FFMS_GetAudioProperties返回的样本格式,解码后的数据可能是平面或交错的。在我的情况下,样本格式总是平面的,这意味着解码数据将在两个数据平面数据[0]和数据[1]中。这是libav/ffmpeg和portaudio解释的,它将平面数据视为在两个单独的数据平面中。

但是FFMS_GetAudio只是从用户处取得单一缓冲区。所以我可以假设平面数据为 data [0] = buf,data [1] = buf + offset,其中offset是FFMS_GetAudio缓冲区返回长度的一半。

FFMS并未为此解释提供任何良好文件。如果有人能够提供更多的信息,这将是很大的帮助。

回答

1

FFMS2目前不支持输出平面音频。更新的版本(2.17版后)自动插入平面音频,而libav之前的旧​​版本增加了对平面音频的支持,在第一个版本之后简单地忽略所有平面。

+0

您确定吗?我从FFMS_GetAudioProperties获取的示例格式是8.现在根据ffms2 api文档,示例格式可以具有从0到4的值。它没有提及有关平面格式的任何内容。所以我认为这个8根据libav样本格式应答到AV_SAMPLE_FMT_FLTP(8)。那么这意味着我从ffms2获得的解码样本总是交错的。请确认也可以指出一些确认这一点的文件或代码。 – praks411 2013-05-01 23:24:26

+0

通过代码进行调试后,似乎ffms2根据我的假设在同一个大缓冲区中输出平面格式。样本被偏移量等于缓冲区的一半。所以前半部分包含通道1缓冲区,而后半部分包含2个数据。我也通过将ffms2的数据音频数据输出到音频设备来验证这一点,对于2个声道,它听起来像有人在锡盒里唱歌,这也意味着音频采样不是交错的。 – praks411 2013-05-02 09:30:17

+0

然而,两个人的音频质量很嘈杂,无论我尝试什么,它仍然保持不变 – praks411 2013-05-02 09:32:01