【问题标题】:How are audio frames decoded by libavcodec?libavcodec 如何解码音频帧?
【发布时间】:2012-11-15 21:06:26
【问题描述】:

这是我使用 ffmpeg 的 libav* 解码音频流的过程

[videofile]-->(读取音频包)--> [pkts queue]-->(解码器)--> 说话人的样本缓冲区

由于某种原因,我需要在解码器之后插入一个缓冲区

[videofile]-->(读取音频包)--> [pkts queue]-->(解码器)--> [samples buffer] --> 说话人的样本缓冲区

samples buffer 中的音​​频样本是 LPCM 16 位。为了保存音频sample buffer 的 pts,我保存了第一个样本的 pts。通过这种方式,我可以计算缓冲区中任何样本的 pts。

问题是只有当音频流包含连续的音频样本时计算才是正确的。 ffmpeg 解码后的音频帧是否总是包含连续的样本?

【问题讨论】:

    标签: ffmpeg libavcodec libav libavformat


    【解决方案1】:

    为什么不是这样呢?解码器将按照呈现给上层的顺序给出数据。

    【讨论】:

    • 假设解码器解码包含来自第二个 1->10 的样本的音频帧,下一帧包含来自第二个 15->20 的样本。如果我将所有这些样本推入缓冲区,则缓冲区将类似于 [1..10 15..20]。因为我只保存第一个样本的 pts,所以从 15 到 20 的样本的计算将是错误的,因为从第二个 11 到 14 有静音部分。希望这有意义!。
    • 如果 11 到 14 丢失,下一帧将包含 15->20 的样本,对吗?否则它应该按顺序出来,对吧?因此,如果输入样本中有间隙,是的,输出也会有间隙,解码器无能为力。但是如果输入的比特流是完整的并且具有有效的语法和语义,那么你应该得到连续的输出。
    • 有没有可能是11到14(静音部分)没有采样,帧没有丢失,只是这段时间内没有音频采样?
    • @jAckOdE,为什么会存在这种情况?如果有静音,编码器会插入静音数据包。
    【解决方案2】:

    ffmpeg 的解码音频帧可能包含平面或非平面格式的样本。 您可以使用

    进行检查
    av_sample_fmt_is_planar(frame->format) 
    

    检查documentation 您应该确保以正确的格式将样本传递给扬声器。

    如果没有,那么您可以使用 libswresample 进行示例格式转换。

    here中解释了AVFrame如何包含平面和非平面数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 2014-10-07
      • 2012-04-05
      • 2011-01-25
      • 2012-01-04
      • 2011-05-10
      • 2015-03-08
      • 2013-01-16
      相关资源
      最近更新 更多