ffmpeg的PTS,DTS的问题

xmfish 发布于 2013/01/28 09:30
阅读 7K+
收藏 0
我将ffmpeg(版本0.8.1)移植到android上,想自己试下AV解码。 现在音视频解码正常,但是想把电影放出来,还几个想不明白的地方,请高手指点下。 
1、所谓的时间基,就是pts的单位,就是num/den ?  ,我不是很明白这个时间基或者num,den具体有什么用或者代表什么意思

2,pts 显示时间戳。许多资料都说 pts * num/den 才是视频帧的播放时间,但是我把一个rmvb文件解码后,当解析出一帧时,里面读取到的pts 看起来是以ms为单位的,并且整部片的最后一帧的pts值与 片长是一致的。 那么显示帧的时候,是不是就按照pts的时间来显示,还是说需要结合num,den做一些处理呢?

3、解析出来的视频帧,有些相邻的帧的pts就相差1ms, 这该怎么播放? 相差1ms的帧在视觉上没什么意义吧。  并且普通操作系统的计时、调度精度应该都达不到1ms吧。



以下是我解码rmvb文件时,打印的一些信息,请高手指点下,谢谢。





E/FFMPEGSample(  566): Opened file:/sdcard/beijin.rmvb
E/FFMPEGSample(  566): 3 streams found.
E/FFMPEGSample(  566): video stream found,index=0
E/FFMPEGSample(  566): audio stream found,index=1
E/FFMPEGSample(  566): From AVStream:
E/FFMPEGSample(  566): video num=12,denum=1
E/FFMPEGSample(  566): audio num=0,denum=1
E/FFMPEGSample(  566): From CodecContext:
E/FFMPEGSample(  566): video num=1, denum=12
E/FFMPEGSample(  566): audio num=0, denum=1
E/FFMPEGSample(  566): From Codec arrays:
I/FFMPEGSample(  566): Video size is [320 x 240]
E/FFMPEGSample(  566): packet pts 160, dts=0, rpt_cnt=0, dec_len=10299,pktsize=10299
E/FFMPEGSample(  566): packet pts 161, dts=160, rpt_cnt=0, dec_len=202,pktsize=202
E/FFMPEGSample(  566): packet pts 162, dts=161, rpt_cnt=0, dec_len=378,pktsize=378
E/FFMPEGSample(  566): packet pts 163, dts=162, rpt_cnt=0, dec_len=2623,pktsize=2623
E/FFMPEGSample(  566): packet pts 320, dts=163, rpt_cnt=0, dec_len=10554,pktsize=10554
E/FFMPEGSample(  566): packet pts 321, dts=320, rpt_cnt=0, dec_len=3422,pktsize=3422
E/FFMPEGSample(  566): packet pts 322, dts=321, rpt_cnt=0, dec_len=3587,pktsize=3587
E/FFMPEGSample(  566): packet pts 323, dts=322, rpt_cnt=0, dec_len=3316,pktsize=3316
E/FFMPEGSample(  566): packet pts 480, dts=323, rpt_cnt=0, dec_len=11582,pktsize=11582
E/FFMPEGSample(  566): packet pts 481, dts=480, rpt_cnt=0, dec_len=2930,pktsize=2930
E/FFMPEGSample(  566): packet pts 482, dts=481, rpt_cnt=0, dec_len=3715,pktsize=3715
E/FFMPEGSample(  566): packet pts 483, dts=482, rpt_cnt=0, dec_len=3263,pktsize=3263
E/FFMPEGSample(  566): packet pts 560, dts=483, rpt_cnt=0, dec_len=7344,pktsize=7344
E/FFMPEGSample(  566): packet pts 561, dts=560, rpt_cnt=0, dec_len=2832,pktsize=2832
E/FFMPEGSample(  566): packet pts 640, dts=561, rpt_cnt=0, dec_len=5348,pktsize=5348
E/FFMPEGSample(  566): packet pts 641, dts=640, rpt_cnt=0, dec_len=1857,pktsize=1857
E/FFMPEGSample(  566): packet pts 720, dts=641, rpt_cnt=0, dec_len=4496,pktsize=4496
E/FFMPEGSample(  566): packet pts 721, dts=720, rpt_cnt=0, dec_len=1394,pktsize=1394
E/FFMPEGSample(  566): packet pts 800, dts=721, rpt_cnt=0, dec_len=4058,pktsize=4058
E/FFMPEGSample(  566): packet pts 801, dts=800, rpt_cnt=0, dec_len=1392,pktsize=1392
E/FFMPEGSample(  566): packet pts 880, dts=801, rpt_cnt=0, dec_len=4369,pktsize=4369
E/FFMPEGSample(  566): packet pts 881, dts=880, rpt_cnt=0, dec_len=1454,pktsize=1454
E/FFMPEGSample(  566): packet pts 960, dts=881, rpt_cnt=0, dec_len=4350,pktsize=4350
E/FFMPEGSample(  566): packet pts 961, dts=960, rpt_cnt=0, dec_len=1211,pktsize=1211
E/FFMPEGSample(  566): packet pts 1040, dts=961, rpt_cnt=0, dec_len=4319,pktsize=4319
E/FFMPEGSample(  566): packet pts 1041, dts=1040, rpt_cnt=0, dec_len=1279,pktsize=1279
E/FFMPEGSample(  566): packet pts 1120, dts=1041, rpt_cnt=0, dec_len=3974,pktsize=3974
E/FFMPEGSample(  566): packet pts 1121, dts=1120, rpt_cnt=0, dec_len=1368,pktsize=1368
加载中
0
小魔
小魔
我建议你去看一看mpeg2/4的标准,里面有都介绍,
0
x
xmfish

 

魔帮忙解释下呗,看标准我更找不到方向了。

有些资料说pts换算成时间时,要乘上时间基,但是我看着打印的pts,跟测试影片的时间时非常符合的,如果乘上时间基了,那肯定就对不上了。。。

0
x
xmfish
补充下,我换了一个mp4文件来测试,发现打印出来的pts是从0开始一直递增的,这样通过检测到的帧率(1,25),确实可以正常播放。  但是像我提到的那个rmvb文件该怎么处理呢? 求高手指点啊
0
k
kitter123321
rmvb容器本身的原因,它提供的pts是不精确的。相差1ms的应该是一个packet,而不是一个完整帧。
返回顶部
顶部