用ffmpeg读取系统声音时,如下所示
av_read_frame(pFormatCtx_Audio, &packet) ;
packet中pts,dts,duration都是基于pFormatCtx_Audio里面对应AVStream的time_base。
下面我们看下AVStream里面的time_base是1000 0000,即1千万一秒。

然后我们读取一个packet,其值如下所示:

pts和dts都是1303426380000,这个值太大,我们先不管,我们看下duration字段,值100000,1千万的百分之一,所以读取到的这个音频包是10ms的长度。
我们再通过下面的语句对packet进行解码,解码器的time_base是48000(根据解码器的采样率进行设置)
ret = avcodec_send_packet(pReadCodecContext, &packet);
ret = avcodec_receive_frame(pReadCodecContext, pFrame);
我们观察下pFrame的值,如下:

可以看到转换成AVFrame结构后的样例数nb_samples为480,而解码器的time_base是48000,故AVFrame中的480个样例数刚好代表着10ms,与AVPacket中的duration能够对应上。
同时,我们可以看到,pts和dts相对于AVPacket没有发

本文详细探讨了使用FFmpeg库读取系统声音时,如何处理AVPacket和AVFrame的时间戳(pts、dts和duration)。通过示例展示了不同音频包之间的时序关系,以及解码过程中样例数与时间的关系,揭示了音频数据处理中的时间基转换和采样率计算原理。
最低0.47元/天 解锁文章
819

被折叠的 条评论
为什么被折叠?



