计算视频播放的时间(pts)
http://yejun8500.blog.163.com/blog/static/463360020095298410979/
在解码视频流的时候对每一个视频帧都会有一个时间戳pts(显示时间戳),得到这个pts的值,并记下最开始的一个pts值(pts_00),以后画面显示的时间就可以用当前播放的帧的时间戳(pts_now-pts_00)/90000获得了,单位是秒,
至于为什么是除以90000,这个问题还不清楚,我会继续跟踪下去,哈哈
A:RFC3984规定采用90000Hz的时钟,因此如果编码帧频是30,那么时间戳间隔就该是90000/30=3000,根据抓包来看,似乎时间戳间隔的确是3000。时间戳的间隔不固定,比如有的时间戳间隔是2990有的是3002,会导致解析出来的视频快播的效果么
参考网页:
http://topic.csdn.net/u/20080429/18/E4DF1098-0326-41B5-B744-D30475F221B0.html
http://www.cnblogs.com/loveclover/archive/2011/03/23/1993065.html
http://hi.baidu.com/y_x_b_s/item/a9d2e907146f1fed3499026b
问题是这样的 用一个 VLC(流媒体客户端) 去请求流媒体服务器上的数据, 但是获得的数据播放速度明显快于1倍速,大概是 timestamp 不对, 不知道是服务器的错误,还是客户端解码时出错, 总感觉服务器那边有问题, 由于服务器端是客户端提供的,客户说是我们的问题, 我还不知道如何证明是谁的错。
A:RFC3984 规定采用 90000 Hz 的时钟,因此如果编码帧频是 30,那么时间戳间隔就该是 90000 / 30 = 3000,根据抓包来看,似乎时间戳间隔的确是 3000。
时间戳的 间隔不固定,比如有的时间戳间隔是 2990 有的是 3002,会导致解析出来的视频快播的效果么
Q:各位大侠好:我现在正在开发视频实时流播放,简单的过程如下:采集视频流 -> 视频流转换为Sorenson H.263编码格式 -> 把编码的实时流通过RTMP协议发送 -> flash客户端进行播放。现在我的时间戳颗粒是这样生成的:第一帧的时间戳为0;第二帧的时间戳的算法为:第一个字符编码的当前时间 - 上一帧第一个字符编码的当前时间根据这个时间颗粒的算法,我在flash客户端播放就会产生延时。请问各位大侠有什么好的建议或是文档之类的,以前firstime管管建议我看RFC4629文档,但是效果不太明显?谢谢!
A;时间戳顺序累加就行了,每次加1
Q:最近做了一个捕捉摄像头并保存FLV的小东西,发现转换完毕后的FLV文件,用播放器播放的时候,速度特别快,大概是正常速度的4倍。请问这是怎么回事?网上搜了一下,说是时间戳的问题,可是PTS我跟了,AVPacket的PTS是每帧增长40,time_base为: 25/s.。DTS是个无效值。PTS的计算是根据ffmpeg的例子写的。pkt.pts= av_rescale_q(oAcc->coded_frame->pts, oAcc->time_base, audio_st->time_base);
1. dts到底需不需要自己计算?2. 还有播放速度过快的可能原因? 3. 还有PTS和DTS的具体含义?int64_t pts; ///time_base);video_timebase = av_q2d(fmtctx->streams[video_index]->time_base);
last_video_pts = pts * video_timebase;last_audio_pts = pts * audio_timebase;
timebase就是单位
以audio为基准同步video。只要设置好了 ao 的参数,如sample rate, channels, sample size等, audio驱动就能以正确的速度播放,所以只要程序里write不出大问题的话,这种同步是非常有效的。
在video out里如下做:
pre_time = av_gettime();gl_vo->vo_display(pic);after_time = av_gettime();rest_time = 1000*1000/fps - (after_time - pre_time);
av_diff = last_audio_pts - last_video_pts;
if ( av_diff > 0.2 ){ if( av_diff 0 ) usleep(rest_time);
Q:谢谢kf701的回复,看后明白了不少这种同步是音频抽样一次就与一帧图像去同步的吗?
A:上面的代码是每display一个picture,就与audio的PTS比较一下,如果没有audio,只有video,那么video就会以fps显示, 靠的就是那个 usleep(rest_time)
Q:如何利用AVPacket包里的pts,dts实现音视频同步?声频播放是只管自己播放,视频有一个初始化播放帧率,如何根据AVPacket里的pts,dts还实现两者的同步?现在我的视频播放一直按原始播放帧率播放,声音有点卡!哪位知道,尽快告知小弟!
A:DTS:decoding time stamp PTS:presentation time stamp
Generally the PTS and DTS will only differ when the stream we are playing has B frames 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: is->video_st->codec->reordered_opaque= pkt->pts; len1 = avcodec_decode_video(is->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 if(pkt->dts != AV_NOPTS_VALUE) pts= pkt->dts; else pts= 0; pts *= av_q2d(is->video_st->time_base);
Q:我贴下 VLC 的代码,(vlc-0.9.8a/modules/codec/avcodec/video.c 文件中)
i_used = avcodec_decode_video( p_sys->p_context, p_sys->p_ff_pic, &b_gotpicture, p_sys->i_buffer b_flush ? NULL : (uint8_t*)p_sys->p_buffer, p_sys- >i_buffer );
中间省略
取得 PTS , if( p_sys->p_ff_pic->pts ) { printf(" p_sys->p_ff_pic->pts = %Lx ", p_sys->p_ff_pic->pts); p_sys->i_pts = p_sys->p_ff_pic->pts; }从 AVFrame 结构中取得 这个 PTS ,但是这个 AVFrame 结构中取得 这个 PTS 从哪里取得的呢?
A:时间戳一般是在编码的时候加入到媒体文件中的,所以在解码时可以从中分析出PTS。
日本人工智能展
qcAIEXPO日本人工智能展是日本最大规模人工智能商贸展!该展汇聚人工智能相关研究、应用、设备和服务等相关的各种展览产品。并将同期举行高质量的人工智能专家论坛。AIEXPOTOKYO是您了解人工智能行业动向,开拓市场的绝佳平台!日本正在从“工业4.0”向“社会5.0”转型,试图打造真正意义上的“智慧社会”,人工智能市场如今蓬勃发展,而AIEXPO将会吸引全世界的关注,成为全球领先的人工智能贸易展。 东京人工智能展[秋季展]的参展企业囊括人工智能相关的基础技术,硬件,应用程序到各类服务!展会期间还将举办多场由全球行业先锋进行演说的高峰论坛。人工智能近年来备受社会各界关注,参加本展将是贵司拓展日本市场的最佳平台!
2023深圳人工智能展览会(4月深圳召开)
参展时间:
报道布展:2023年4月07-08日(08:30-16:30)开幕式:4月09日9:30
展示交易:2023年4月09-11日(08:30-16:30)撤展:4月11日(15:30-18:00)
展出范围:
1、人工智能基础:神经网络芯片、智能传感器、智能PID、控制器、专家控制器、神经元网络控制器、混合/集成智能控制系统、分级递阶控制系统、人工神经网络控制系统、模糊控制系统、学习控制系统、大数据、物联网、智慧城市、芯片、传感器、算法框架、云服务、人工智能硬件解决方案、人工智能实验室等无人机等;
2、消费类无人机:航拍无人机、竞技无人机、AR无人机、自拍无人机、娱乐无人机、无人机+模型的系统及服务:控制系统、导航定位设备、云台、运动相机、全景摄像机、FPV眼镜、遥控系统、监视器、电源、发动机、马达、电调、发射接收系统、无人机模型定制方案、培训认证、投融资、保险等;
3、人工智能应用:智能制造、智能工厂、智慧物流、智能教育、智能医疗、智能安防、智慧城市、智慧交通、智能停车、智能汽车、智能驾驶辅助系统、智慧充电、智能金融、智能零售、物联网/车联网、AR/VR、虚拟现实、增强现实、智能穿戴设备、RFID/一卡通、智能家居、智能家电、智能玩具、智能消费电子等;
4、智能穿戴设备:智能手表,智能眼镜,智能手环,手套式手机、穿戴式电脑,智能耳机,智能项链,智能头盔,智能腕带,可穿戴摄像机,头戴式显示设备,智能手套,智能首饰,智能钱包,智能秤,智能手杖,智能服装,智能鞋,智能服饰,运动追踪器,智能眼镜镜片,镜架,智能手环(手表)硬质塑料,金属及橡胶材料,模具开发制造商,金属外壳,金属支架,ITO导电玻璃,纳米材料,控制面板,玻璃基板,OCA光学胶,液晶背光模组/模块,新型USB接口设备,蓝牙无线连接控制设备产品等;
5、智能机器人:家用服务机器人、客服机器人、餐饮服务机器人、迎宾机器人、儿童机器人、仿生真机器人、拟脑机器人、教育机器人、医用机器人、清洁机器人、传感型机器人、交互型机器人、自主型机器人、娱乐机器人、无人机、智能巡逻机器人等;
6、模式识别:生物识别、指纹识别、虹膜识别、人脸识别、静脉识别、文字识别、视网膜识别、遥感图像识别、智能语言识别、车牌识别、驻波识别、语音识别、2D3D识别、多维识别等;智能控制智能PID、控制器、专家控制器、神经元网络控制器、混合/集成智能控制系统、分级递阶控制系统、人工神经网络控制系统、模糊控制系统、学习控制系统等;
7、知识工程:智能搜索引擎、计算机视觉、图像处理、机器翻译、自然语言理解、数据挖掘、知识发现、知识表示、知识处理系统等;
8、自动规划:自动程序设计、遗传编程、智能信息检索、全文信息检索系统、自动文摘系统、机器视觉、机器人学、机器感知等;
9、人工智能其他:人机交互界面、知识库、推理机、解释器、综合数据库、人工智能实验室、知识获取、定理证明、博弈、遗传编程、信息感应与辨证处理、人工生命、复杂系统、算法框架、遗传算法等;
参观参展梁家金返回搜狐,查看更多