【问题标题】:Audio decoding using ffms2(ffmegsource)使用 ffms2(ffmegsource) 进行音频解码
【发布时间】:2013-04-25 10:49:58
【问题描述】:

我正在使用 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 没有为这种解释提供任何好的文档。如果有人能提供更多这方面的信息,那将是非常有帮助的。

【问题讨论】:

    标签: ffmpeg libav


    【解决方案1】:

    FFMS2 目前不支持输出平面音频。较新的版本(2.17 后)自动交错平面音频,而 libav 之前的旧版本添加了对平面音频的支持,只是忽略了第一个之后的所有平面。

    【讨论】:

    • 你确定吗?我从 FFMS_GetAudioProperties 获得的示例格式是 8。现在根据 ffms2 api 文档,示例格式的值可以从 0 到 4。它没有提及平面格式的任何内容。所以我认为这 8 对应于 AV_SAMPLE_FMT_FLTP(8) 根据 libav 样本格式。这是否意味着我从 ffms2 获得的解码样本总是交错的。请确认您能否指出一些确认这一点的文件或代码。
    • 通过代码调试后,似乎ffms2确实按照我的假设在同一个大缓冲区中输出平面格式。并且样本之间的偏移量等于缓冲区的一半。所以前半部分包含通道 1 缓冲区,而后半部分包含 2 个数据。我还通过将数据音频数据从 ffms2 输出到音频设备来验证这一点,对于 2 个通道,听起来好像有人在锡内唱歌,这也意味着音频样本没有交错。
    • 但是 2 2 的音频质量很嘈杂,无论我尝试什么,它仍然保持不变
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2015-08-07
    • 2020-10-13
    • 2014-02-25
    • 2023-03-14
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多