ffmpeg编解码中涉及到的pts详解

ffmpeg里什么最难?相信大家都会说音视频同步最难,单单视频或者视频的时候,简单地设置下pts,就能顺利地完成转码或者推流,但一旦音视频一起的时候,就头痛了,本该好好的音视频却发现出来的效果音视频不同步了,所以我们有必须了解一下ffmpeg中是如何做到音视频同步的。

我们都知道在ffmpeg里pts的重要性,我们拿一个最简单的例子来说,如果我们自己来播放一个视频(不借助ffmpeg),我们同样也是拿到视频画面和音频数据,然后呢,对比一下它们的时间,让他们的时间对齐,再放入到显示器和扬声器中播放,注意,这里所说的时间,是我们最习惯用的多少点多少分多少秒,ffmpeg里同样也是,只不是过是在ffmpeg里,它把这个概念复杂化了,我们习惯的时间是一秒一秒地增加的,在ffmpeg里就不一样,对于视频,它把画面一帧一帧地增加认为是一个单元,因此对于视频来说,例如一个帧率为10帧每秒的视频,那么在1秒内它就是1 2 3 4 5 6 7 8 9 10这样的一个计数,可以简单地认为这里的1 2 3 4 5 6 7 8 9 10就是其中的一个PTS。

对PTS有简单的了解后,我们来详细地了解下利用ffmpeg进行编解码时会遇到哪些难懂的PTS。

解码部分:

av_read_frame读取到数据到AVPacket,这里的AVPacket里的PTS是以1/90000为基准的,我们需要将此PTS转换成解码的PTS,通过av_packet_rescale_ts来实现,从stream的time_base转换成AVCodecContext的time_base,对于视频来说,这里的AVCodecContext的time_base是帧率的倒数,注意到上面提到的pts是AVPacket里的,通过解码后得到视频帧AVFrame,这里的AVFrame会有一个pts,当然了这个pts是AVCodecContext基准的,如果我们要拿这帧画面去显示的话,我们还要转换成显示的时间,即从AVCodecContext的time_base转换成1000000的timebase。一般的代码如下:


AVRational av;
av.den = 1000000;
av.num = 1;
int64_t mypts = av_rescale_q(pFrame->pts, videoCodecCtx->time_base, av);

上面得到的mypts就是我们习惯的微秒单位,我们拿声音来对比,对于声音来说,也拿到一个pts,那么此时两个pts就是同一个时间基上的了,并且是我们习惯的时间,这个时候再去显示或者播放就没有问题了。

编码部分:

前面解码部分我们得到了一个AVFrame,并且得到了微秒为基准的pts,我们要去编码的话,就要逆过来,我们将这个pts通过调用av_rescale_q将pts转换成编码器的pts,转换成功后,就可以开始压缩了,压缩调用avcodec_send_frame和avcodec_receive_packet得到一个AVPacket,这里又有一个pts,这个pts当然是编码器基准下的,所以在调用av_interleaved_write_frame之前需要再次次调用av_packet_rescale_ts将编码器的pts转换成AVStream的pts。最后才可以写入到文件或者流中。


本文《ffmpeg编解码中涉及到的pts详解》为52ffmpeg原创,链接地址为:http://www.52ffmpeg.com/article/353.html,转载请标明来源,如您有任何相关问题,均可通过本站中的"联系我们"与我们取得联系。

上一篇:

下一篇:

微信打赏 支付宝扫码打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

发表评论

电子邮件地址不会被公开。 必填项已用*标注

推荐大家看

ffmpeg音频FIFO的使用

ffmpeg音频FIFO的使用

ffmpeg中音频队列有一套好用的接口来处理,头文件就在libavutil\audio_fifo.h里,要使用 […]

ffmpeg音频转码时重采样的处理方法

ffmpeg音频转码时重采样的处理方法

我们使用ffmpeg进行音频转码时,有可能遇到一个这样的问题,原来的音频采样率为8000Hz,但我们要转化后的 […]

ffmpeg音频重采样

ffmpeg音频重采样

ffmpeg中音频重采样比较重要,我来解释一下什么叫重采样,例如有一个声音文件里的声音是8000Hz的,我们要 […]

用ffmpeg进行代码转换

用ffmpeg进行代码转换

在这一部分中,您将了解如何在MPEG2中编码,这是DVD创作的格式。 DVD使用MPEG 2作为压缩格式。图片 […]

windows平台在ffmpeg中的AVFrame中绘图输出文字

windows平台在ffmpeg中的AVFrame中绘图输出文字

在ffmpeg中,我们从文件读取到的图像都封装成了AVFrame,如果我们要在图像中绘制其它图形,例如图片,文 […]

ffmpeg编解码中涉及到的pts详解

ffmpeg编解码中涉及到的pts详解

ffmpeg里什么最难?相信大家都会说音视频同步最难,单单视频或者视频的时候,简单地设置下pts,就能顺利地完 […]

C#调用ffmpeg命令获取进度信息

C#调用ffmpeg命令获取进度信息

ffmpeg命令现在特别的强大,一行命令就可以轻松地实现视频的转码、推流、滤镜等效果,所以如果我们的需求刚好f […]

ffmpeg pts初始音视频pts dts

ffmpeg pts初始音视频pts dts

有一定常识的人都应该知道,视频中的画面实际上是一张张图片组成的,就像小时候快速翻阅连环画一样,速度快了,我们就 […]

windows平台ffmpeg开发环境搭建

windows平台ffmpeg开发环境搭建

在windows平台下,ffmpeg的开发环境搭建还是比较简单的。我们都知道,我们可以从官网下载到最新的最全的 […]

ffmpeg实现内存播放器

ffmpeg实现内存播放器

一般地,我们播放一个媒体,会是文件、网络视频等等,它们是存在硬盘或是网络上的,但有时我们想从内存中给ffmpe […]