MPEG2 TS的IPB帧判断问题

seanzh 2006-03-07 11:35:16
请教,在MPEG2 TS中如何判断和抽取I P B帧?
...全文
819 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
nodef 2006-03-09
  • 打赏
  • 举报
回复
seanzh(云剑),如果是基于RTSP 的Server,我想你是要做一个IPTV的系统把,要在Server端实现快放慢放回放这些功能,可是Server端是没有播放的,只提供TS流的发送,依我个人的理解是没有必要分离视频数据再复用的,而且如果一个TS流中不包含控制信息的话接受端是无法播放的。

由于TS流中基本上每个PES包都会提供播放时间PTS和解码时间DTS,我的猜测是可以在复用时更改TS流中的PTS和DTS信息,例如如果要快放的话可以把PTS和DTS提前,这样只要用户播放端的音视频解码器足够快,应该是可以的;当然目前为止没看到这方面的应用,只是个人猜测。

如果是IPTV的话,使用RTP和RTSP协议,也可以试一下MPEG-4的系统层方法,可以使用14496-1中的SL以代替TS和PES,这样会更节约带宽,SL同样也提供了音视频同步的时间信息
seanzh 2006-03-09
  • 打赏
  • 举报
回复
哦,呵呵,我说的是机顶盒的,
我主要是想做一个RTSP 的Server,
在Server端实现快放慢放回放这些功能,
我要把经过处理的TS流发出去,所以只能在最开始的地方来处理。

按照nodef(鞋带) 所说,
那是否我还是要把TS包Demux出来变成原始流,经过处理之后再Mux回TS流?
对于其他的TS控制信息包和Audio包又该如何处理?
日总是我哥 2006-03-09
  • 打赏
  • 举报
回复
IMediaSeeking接口的SetRate方法

更多信息:http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/htm/imediaseekinginterface.asp
nodef 2006-03-09
  • 打赏
  • 举报
回复
1.
“记下这个位置pic_start
3. 扫描文件, 一直到下一个PICTURE_START_CODE, 把从pic_start到当前位置的所有信息写入新文件;” 这种方法是可以的,但是由于在TS文件中视频数据时被分割成一个个TS包(188字节),而每个TS包中又包含TS包头和附加信息等,因此要依次把每个TS包中的包头等去除,提取出每个包中的有效负载(即视频数据),再把提取出的数据依次存储为一个完整的picture,相当于每隔188个字节就要进行一次这种处理,即整个文件都要修改。

2.
要根据你用来播放的新文件格式来处理,avi,mpg不同的格式有不同的需求,事实上在PC上ts文件也是可以直接播放的,只要你安装了TS demux插件

支持快放/慢放/回放需要看应用的场合,如果是机顶盒的广播应用,由于TS流的传输速率是固定的,基本上快放/慢放/回放很困难;如果是在PC上播放文件,可以使用DirectShow架构,在filter里来调整媒体数据的播放时间,是比较方便的
seanzh 2006-03-09
  • 打赏
  • 举报
回复
CoolSlob,怎么SetRate?

nodef(鞋带),经过几天苦看13818的一些资料加上CoolSlob的那份代码,已经知道一点点,
加上你的回答又明了了不少,
请教:
如果我抽取I帧, 是否可以这样做?

1. 先把TS的头写到新文件中, 这个头是从TS文件头一直到带PES头的这个帧.
2. 判断PICTURE_START_CODE所带的帧是否所需要的帧, 如果是, 记下这个位置pic_start
3. 扫描文件, 一直到下一个PICTURE_START_CODE, 把从pic_start到当前位置的所有信息写入新文件;
4. 如此循环扫描一个个的帧, 直到文件结束;

但是这样会有问题,:
1. 就是在遇到不是I帧的时候丢弃该包, 而TS封装的包必须是188个字节, 那是否相应的要修改TS包的信息? 这样会不会导致整个的TS文件都要修改?
2. 在扫描文件的过程中, 如果遇到不是Video的TS包(可能有Audio包, 以及一些TS的控制信息包), 是否该全部写入到新文件中才能正确播放?

此外, 如CoolSlob所说, 要支持快放/慢放/回放是否有更好的方法? 谢谢!
nodef 2006-03-09
  • 打赏
  • 举报
回复
1.根据TS包头中的PID找到TS流里的PAT表,其TS的PID为0x00;
2.找到PAT表后,根据其中携带的PMT表的TS包PID找到PMT表;
3.找到PMT表后,根据其中携带视频的TS包PID就可以判断出包含视频数据的TS包;
4.对于mpeg-1和mpeg-2视频,一般在TS复用时一个PES包包含一个picture,对于mpeg-2 video,picture可以是桢图像(frame)或场图像(field)
5.找到视频TS包中一个包含PES头的TS包(PID为PMT中的视频PID,TS包头中payload_unit_start_indicator标志为1),这个包里会包含picture header信息
6.找到picture header(以0x00000100开始)后,根据其中的picture_coding_type信息判断其为I,P,B或D桢,注意,D桢只在mpeg-1 video中使用

有关TS,PES,PAT,PMT信息见13818-1,有关picture header,picture_coding_type信息见13818-2和11176-2
日总是我哥 2006-03-09
  • 打赏
  • 举报
回复
>>快放慢放
不是可以通过SetRate来调节吗?

如果输出这些帧另存为文件是为了实现“快放慢放”,那工程大了吧?!
seanzh 2006-03-09
  • 打赏
  • 举报
回复
加了150分还是没有引起各位高人们的兴趣吗?呵呵
nodef 2006-03-09
  • 打赏
  • 举报
回复
有的,可以使用DitectX开发包自带的graphedit工具,在解复用filter的视频输出pin后直接连
file writer filter,就可以将纯视频数据保存成文件了
seanzh 2006-03-09
  • 打赏
  • 举报
回复
nodef(鞋带),这还真是个不错的主意,我试试看,
对了,有没有能把快放慢放之后的流输出成文件的播放器?
或者就是把I帧输出的也可以?
seanzh 2006-03-08
  • 打赏
  • 举报
回复
是否有播放器可以直接把经过快放慢放处理过后的MPEG流信息输出成文件的?
或者说就是把这些帧直接输出成文件的?
seanzh 2006-03-08
  • 打赏
  • 举报
回复
因为我最根本的是想实现MPEG2的快放慢放等问题,
而根据一些资料显示,这也不失为一种实现的方法,
虽然据我那位同事所说,会有更好的方法,只是我目前也不知道是有什么更好的方法来实现这个
日总是我哥 2006-03-08
  • 打赏
  • 举报
回复
音频和视频的PICTURE_START_CODE不一样的(而各种音频格式的START_CODE也不一样)

你不是只抽取IPB帧吗?怎么会造成不同步呢?

因只是肤浅地了解,更多问题等高人们来解答吧-_-!!
seanzh 2006-03-07
  • 打赏
  • 举报
回复
看到PS的格式里确实有这样的判断,可以根据PICTURE_START_CODE
之后来判断帧类型,
但是这对于音视频混合的怎么办呢?
抽取出来之后会不会造成不同步?
另外,对于TS格式该如何处理?因为TS是PS经过包装后的产物,
这样又该如何处理?
日总是我哥 2006-03-07
  • 打赏
  • 举报
回复
嘿嘿,问深奥了我答不上来。
等高人来回答吧:)
seanzh 2006-03-07
  • 打赏
  • 举报
回复
多谢CoolSlob,
我看到代码里仅仅是把PICTURE_START_CODE后的东东抽取出来,
这样对Audio会不会有影响?
另外,在MPEG的标准里好象没有看到这样的说明?
我请教了一位以前的同事,是根据MPEG2 TS格式来说的,
他说需要根据首部的PID来分析PAT,再找到PMT,
再把相关的信息组合成PS相关的信息,再进行判断,
能否请解释一下?
谢谢!
zhaojian999 2006-03-07
  • 打赏
  • 举报
回复
大傻的贴要顶
日总是我哥 2006-03-07
  • 打赏
  • 举报
回复
??已发往你在另一个贴里的邮箱.

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧