Ffmpeg libavcodec如何解码音频帧?

Ffmpeg libavcodec如何解码音频帧?,ffmpeg,libavcodec,libav,libavformat,Ffmpeg,Libavcodec,Libav,Libavformat,下面是我如何使用ffmpeg的libav对音频流进行解码的过程* [视频文件]-->(读取音频数据包)-->[pkts队列]-->(解码器)--> 说话人样本缓冲区 出于某种原因,我需要在解码器之后插入一个缓冲区 [视频文件]-->(读取音频数据包)-->[pkts队列]-->(解码器)--> [样本缓冲区]-->说话人的样本缓冲区 采样缓冲区中的音频采样为LPCM 16位。要保存音频样本缓冲区的pts我保存第一个样本的pts。这样,我可以计算缓冲区中任何样本的pts 问题是,仅当音频流包含连续

下面是我如何使用ffmpeg的libav对音频流进行解码的过程*

[视频文件]-->(读取音频数据包)-->[pkts队列]-->(解码器)--> 说话人样本缓冲区

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

[视频文件]-->(读取音频数据包)-->[pkts队列]-->(解码器)--> [样本缓冲区]-->说话人的样本缓冲区

采样缓冲区中的音频采样为LPCM 16位。要保存音频
样本缓冲区的pts
我保存第一个样本的pts。这样,我可以计算缓冲区中任何样本的pts


问题是,仅当音频流包含连续的音频样本时,计算才正确。ffmpeg的解码音频帧总是包含连续的样本吗?

为什么不是这样?解码器将按照向上层显示数据的顺序发出数据。

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

av_sample_fmt_is_planar(frame->format) 
检查 您应该确保以正确的格式将样本传递给演讲者

如果没有,则可以使用libswresample进行样本格式转换


AVFrame如何包含平面和非平面数据在

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