ffmpeg时间戳问题汇总A:RFC3984 规定采用 90000 Hz 的时钟,因此如果编码帧频是 30,那么时间戳间隔就该是 90000 / 30 3000,根据抓包来看,似乎时间戳间隔的确是 3000。
时间戳的间隔不固定,比如有的时间戳间隔是 2990 有的是 3002,会导致解析出来的视频快播的效果么Q:各位大侠好:我现在正在开发视频实时流播放,简单的过程如下:采集视频流 - 视频流转换为 Sorenson H.263 编码格式 - 把编码的实时流通过RTMP 协议发送 - flash 客户端进行播放。
现在我的时间戳颗粒是这样生成的:第一帧的时间戳为 0;第二帧的时间戳的算法为:第一个字符编码的当前时间 -上一帧第一个字符编码的当前时间根据这个时间颗粒的算法,我在 flash 客户端播放就会产生延时。
请问各位大侠有什么好的建议或是文档之类的,以前 firstime 管管建议我看 RFC4629 文档,但是效果不太明显,谢谢~A;时间戳顺序累加就行了,每次加 1Q:最近做了一个捕捉摄像头并保存 FLV 的小东西,发现转换完毕后的FLV 文件,用播放器播放的时候,速度特别快,大概是正常速度的 4 倍。
请问这是怎么回事,网上搜了一下,说是时间戳的问题,可是 PTS 我跟了,AVPacket 的PTS 是每帧增长 40,time_base 为: 25/s.。
DTS 是个无效值。
PTS 的计算是根据ffmpeg 的例子写的。
pkt.pts av_rescale_qoAcc-coded_frame-pts oAcc-time_base audio_st-time_base1. dts 到底需不需要自己计算,2. 还有播放速度过快的可能原因,3. 还有 PTS 和 DTS 的具体含义,int64_t pts /// presentation time stamp in time_base unitsint64_t dts /// decompression time stamp in time_base units上面的意思是不是说,播放器根据 PTS 进行播放。
然后 DTS 是在编码的时候自己设置,刚用 ffmpeg,好些东西不懂,还请大侠多多指教------刚才又试了一下,把time_base 降为 10 帧每秒。
播放速度和正常速度接近。
但是不知道 FLV 文件的帧率该设置多少合适。
有没有一个权威的说法。
A:我也做摄像头捕捉,跟你出现一样的问题,我自己分析的话,应该是捕捉摄像头的图像的速度只有 10 帧每秒,但是保存成视频25 帧每秒的话播放看起来就非常快,但是我摄像头捕捉设定的是 25 帧每秒,难道是速度达不到,反正我还没解决,LZ 解决了的话告诉下,谢谢。
暂时认为是摄像头捕捉速率问题。
换了一个高清无驱摄像头就好了Q:在每个音视频数据包中都含有PTS 和 DTS,一个数据包中应该含有多个数据帧以及音频数据,那么这里的PTS和 DTS 它是如何来标识数据帧的,PTS 和 DTS 的单位是什么,视频的最小单位是帧,可通过 PTS 来指定它何时播放,那音频的最小单位是什么,这里的PTS对音频而言它标识的是什么,是这个时间点采样点吗,在网上找了很久关于音视频编解码的资料,都没有合适的A:audio_timebaseav_q2dfmtctx-streamsaudio_index-time_basevideo_timebaseav_q2dfmtctx-streamsvideo_index-time_baselast_video_pts ptsvideo_timebaselast_audio_pts pts audio_timebasetimebase 就是单位以 audio 为基准同步 video。
只要设置好了 ao 的参数,如 sample rate channels sample size 等,audio 驱动就能以正确的速度播放,所以只要程序里 write不出大问题的话,这种同步是非常有效的。
在 video out 里如下做:pre_timeav_gettimegl_vo-vo_displaypicafter_time av_gettimerest_time 10001000/fps -after_time - pre_timeav_diff last_audio_pts - last_video_ptsifav_diff 0.2 ifav_diff 0.5 rest_time - rest_time / 4 else rest_time - rest_time /2else if av_diff-0.2 if av_diff -0.5 rest_time rest_time / 4 else rest_timerest_time / 2if rest_time0 usleeprest_timeQ:谢谢 kf701 的回复,看后明白了不少这种同步是音频抽样一次就与一帧图像去同步的吗,A:上面的代码是每 display 一个 picture就与audio 的PTS 比较一下如果没有 audio只有 video那么 video 就会以 fps 显示靠的就是那个 usleeprest_timeQ:如何利用 AVPacket 包里的 ptsdts 实现音视频同步,声频播放是只管自己播放,视频有一个初始化播放帧率,如何根据 AVPacket 里的ptsdts还实现两者的同步,现在我的视频播放一直按原始播放帧率播放,声音有点卡~哪位知道,尽快告知小弟~A:DTS:decoding time stampPTS:presentation time stampGenerally the PTS and DTS will only differ when the stream we are playing has Bframes in it.Q: 关于 b 帧和时间戳的问题我从 mpeg2 视频中用av_read_frame读取视频帧并解码,顺序是IPBBPBB...它们的 pts 顺序是 1423756...现在我要把这个视频再用 mpeg2 编码,最大 b帧数还是 2.那么我在编码时是否要将视频数据调整为按显示时间先后的顺序,再交给 avcodec_encode_video编码,即把第 2 帧放在3、4 帧之后,第 7帧放在 5、6 帧之后,A:你不能这么做,编码器会给你这么做的。
如果你有 B 帧,那么所有的 B 帧都会被放在缓冲区里直到下一个 I/P 帧到来例如:你的输入序列是 IBBPBBPBBI那么输出的序列是输入 I,编码 I,输出 I 输入 B输入 B输入 P,编码 P,输出 P编码 B,输出 B编码 B,输出 B输入 P编码P,输出 P。
在解码端所有的 P 帧都会被放在缓冲力直到下一个 I/P 真的到来如:解码 I,输出 I解码 P放入缓冲 P解码 B,输出 B解码 B,输出 B 解码 P,输出上一次 P 帧Q:解码出来的图片的时间戳问题 MPEG 一个包中包含有时间戳而可能几个包才能解码出一张图象也可能一个包能解码出几张图请问包中的时间戳与解码出来的图象如何对应上A:在 ffmpeg 中通过 parser 部件把从avformat 部件取下来的原始包重新“合成”为有仅包含一个完整帧的包。
从 MPEG2 部份的代码中看出,如果“几个包才能解码出一张图象”的话,会取第一个包的 PTS 和DTS,如果“也可能一个包能解码出几张图”,则会跟据这个包的 PTS 和 DTS通过帧频推算出其它帧的 DTS。
Q: ffmpeg 的 avcodec_decode_video 函数解码时间戳问题,在VLC 中调用 avcodec_decode_video 函数进行解码时,AVFrame-pts 时间戳不对,导致我的图像不能够显示, 请问有谁知道它的解码原理,这个 PTS 怎么得出的吗,还是外部传入的,A: / NOTE: ipts is the PTS of the _first_ picture beginning in this packet if any / is-video_st-codec-reordered_opaque pkt-pts len1 avcodec_decode_videois-video_st-codec frame got_picture pkt-data pkt-size if decoder_reorder_pts pkt-dts AV_NOPTS_VALUE frame-reordered_opaque AV_NOPTS_VALUE pts frame-reordered_opaque else ifpkt-dts AV_NOPTS_VALUE pts pkt-dts else pts 0 pts av_q2dis-video_st-time_baseQ:我贴下 VLC 的代码,(vlc-0.9.8a/modules/codec/avcodec/video.c 文件中) i_usedavcodec_decode_videop_sys-p_context p_sys-p_ff_pic b_gotpicture p_sys-i_buffer b_flush NULL :uint8_tp_sys-p_buffer p_sys- i_buffer 中间省略取得 PTS , ifp_sys-p_ff_pic-pts printf p_sys-p_ff_pic-pts Lxn p_sys-p_ff_pic-pts p_sys-i_pts p_sys-p_ff_pic-pts 从 AVFrame 结构中取得这个 PTS ,但是这个AVFrame 结构中取得这个 PTS 从哪里取得的呢,A:时间戳一般是在编码的时候加入到媒体文件中的,所以在解码时可以从中分析出 PTS。