// 1s = 90000 time scale , 一帧就应该是 90000/video_frame_rate 个timescale static uint32_t video_frame_rate = 30; static uint32_t video_pts_increment = 90000 / video_frame_rate; //用一秒钟除以帧率,得到每一帧应该耗时是多少,单位是 timescale单位 static uint64_t video_pts = 0; pts初始值可以是任意的,我一般定为0,后面每一帧加上增量就可以了。 音频pts的计算方法同上,只不过不是通过帧率,而是通过采样率。 uint32_t audio_pts_increment = (90000 * audio_samples_per_frame) / audio_sample_rate; audio_samples_per_frame这个值对aac和mp3是不同的,aac固定为1024,mp3固定为1152.
还没结帖么,那再说一些这几天理解到的东西,RTP规范里,RTP包的TIMESTAMP字段应该指示图像的显示时间,而且时间单位是tick.像视频的话单位就是90K,那一段25fps的视频每增长一帧,时间戳就应该增加3600.但是同样是通过RTSP播实时流,ffplay和vlc对于时间戳的处理是不一样的.如果在ffplay里.它直接把rtp包里的timestamp当作是解码前的pts传入avcodec_decode_video2().ffmpeg进行重排序(如果没有B帧,一般是原样复制到解码后的AVFrame里),然后将它乘以1/90K还原成us的单位,然后直接用来usleep();而vlc的rtsp传输模块用的是live555,live555在我看来多此一举了,它对上层屏蔽了RTP包里的TIMESTAMP.而是直接帮你还原好了.单位就是us.也就是说,afterGettingFrame()函数的pts单位是us.可以直接拿来用usleep了
live555只发送时间戳和npt时间,VLC是直接把时间戳换算一下当pts?
2,543
社区成员
20,281
社区内容
加载中
试试用AI创作助手写篇文章吧