在ts流中,MPEG2编码中,音视频包是交错出现的。
分析其pts可以发现,在同等交错位附近,音频的pts要比视频的靠前得多。
比如一段实际码流数据如下:
--------------------------
valid video packet count1
video packet 视频包1:
packet.pts -9223372036854775808
packet.dts 3529565163
packet.duration 3600
packet.size 37460
packet.pos -1
--------------------------
valid video packet count1
audio stream packet: 音频包1:
packet.pts 3529553320
packet.dts 3529553320
packet.duration 2160
packet.size 384
packet.pos -1
--------------------------
valid video packet count2
video packet: 视频包2:
packet.pts 3529568763
packet.dts 3529568763
packet.duration 3600
packet.size 18508
packet.pos -1
--------------------------
valid video packet count2
audio stream packet 音频包2:
packet.pts 3529555480
packet.dts 3529555480
packet.duration 2160
packet.size 384
packet.pos -1
--------------------------
valid video packet count3
video packet 视频包3
packet.pts 3529572363
packet.dts 3529572363
packet.duration 3600
packet.size 17960
packet.pos -1
--------------------------
valid video packet count3
audio stream packet 音频包3
packet.pts 3529557640
packet.dts 3529557640
packet.duration 2160
packet.size 384
packet.pos -1
--------------------------
valid video packet count3
audio stream packet 音频包4
packet.pts 3529559800
packet.dts 3529559800
packet.duration 2160
packet.size 384
packet.pos -1
--------------------------
valid video packet count4
video packet 视频包4
packet.pts -9223372036854775808
packet.dts 3529575963
packet.duration 3600
packet.size 39632
packet.pos -1
--------------------------
valid video packet count4
audio stream packet 音频包5
packet.pts 3529561960
packet.dts 3529561960
packet.duration 2160
packet.size 384
其实这样的理由是,在播放器实际播放过程中,音频是持续播放,以视频来同步音频。
这样的好处是,音频缓冲,而视频实时解码。音频占用存储量较小,而用视频来同步音频,如果解码速度实在跟不上,可以调帧。
人的肉眼对每秒比如25帧的视频跳帧是没有太大察觉度的,但如果音频出问题,很容易听出来,会影响到用户体验。
这就是为什么ts流中音频数据比视频数据优先传输的原因。
如果我们需要对音视频进行同步,关键就是找一个绝对的基准点。而之后所有的音视频数据都可以根据帧率、码率算出来偏移量。如何寻找这个绝对基准点呢?
比如从我要找到某个视频帧对应的确切PCM,可以在音频包上向前寻找附近pts与视频包较为吻合的两个音频包。
然后由于PCM和音频包大小都是固定的,就可以计算出具体的偏移量了。(根据前后pts及视频帧pts计算偏移)
这样,我从ts流任意一个地方开始播放,可能刚开始的视频帧是没有声音的。(因为刚开始的音频包对应的是之后的视频帧)
那在播放过程中,如何指定从确切的某视频帧开始播放?(一般播放器可能不能精确定位到一帧,而是附近的I帧)。
我们只需要向前索引最近的I帧,然后从I帧解出来当前帧就可以了。为了加快速度,甚至可以刚开始建力帧数据的索引信息,用于迅速定位I帧。
分享到:
相关推荐
MPEG2的TS流找同步程序,连续找到5个188字节的同步包才认为同步上,否则未同步;
该程序能够从输入的MPEG2 传送流(TS)中提取出MPEG2序列流。其中包括将TS流拆包得到视频原始流(PES),再把视频PES流拆去包头,去掉填充字节等最后得到视频序列流。提取得到的视频序列流可以用作转码,关键帧提取等与...
基于C/C++提供一个TS流的打包库TsMuxer.dll,并提供DEMO测试程序
默认是接收网络udp组播窜流,然后解析TS,播放音视频。也可以做些小改动,改为读取本地TS文件。里面核心的代码是解析TS流,使用ffmpeg软解,使用sdl播放三大块。希望对你们有所帮助。
TS流 包 结构以及同步
MFC-MPEG2TS流转PS流软件,并且能分析TS流中的PSI节目信息,并且予以显示
该文档详细描述了如何将MPEG2TS转换为MPEG2PS的具体方法,同时并不需要重新转码,速度相当的快。具体操作流程详见文档。
Womble MPEG2VCR 是一款小巧实用的 MPEG1、MPEG2 剪切编辑软件,可编辑 DVD、VCD 文件,将 DVD 文件的视频转换为 m2v格式速度很快,可截取 DVD 画面成为 BMP 图片,与 PowerDVD 的载图效果不太一样。 Womble MPEG-...
演示如何用FFmpeg读取内存的PS/TS流,分离出视频和音频,用VC2008编译的,支持读取TS文件或PS文件到内存,支持分离、解码
从MPEG2_TS流中提取视频序列流,文档是从其它地方搞的,思路还算清晰
ts流的分析ts流的分析ts流的分析ts流的分析
本文档提供了13818标准的TS协议, 用于分析TS流, 主要用于音视频流的编解码
MPEG2TS流解析程序,输入为TS流文件,可以将视频和音频解析出来.zip
MPEG2 ts流的解析,PAT,PMT,PES MPEG2 ts流的解析,PAT,PMT,PES
TS流中的EPG数据分析,方便TS流分析人员分析EPG数据
MPEG2_TS流基本概念和数据结构
在一些视频服务中,如VOD推流的快进、快退中,经常需要快速从ts节目流中找出I帧(I-frame)来,以便推流服务器可以推送只包含视频画面而没有声音的ts数据到终端,而终端并不需要做任何特殊处理,即可实现快进/快退的...
通过本文档的学习,让你在短时间内掌握ffmpeg中mpeg2-ts的解码流程!
Mpeg2 TS 音视频解析程序,根据媒体的pid类型解析出音视频类型及格式。
简单小巧的ts文件提取音频视频es文件,提取ps流,改变scr,去dtspts。生成es文件可以只提取视频或音频也可以一起提取。适合学习ts流解码编码