加载中…
个人资料
南冠彤
南冠彤
  • 博客等级:
  • 博客积分:0
  • 博客访问:411,282
  • 关注人气:59
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

(转)TS流 pts dts

(2013-01-31 17:39:58)
分类: 音视频
目标:输入为H.264 ES流,输出为TS流,暂不考虑音频。
问题:按照iso-13818协议介绍的格式和ffmpeg的mpegtsenc.c的代码封装出来的TS包无法使用VLC播放。通过VLC播放器的debug信息,可以看到PAT、PMT成功解析,也找到了视频流(H.264 ES)对应的PES包。
  mpegtsenc.c将PES头信息写入了一些固定的值,比方PTS_DTS=10,即只有PTS没有DTS,要想正确解码是否每个PES header必须要DTS和PTS?无法解码是不是因为没有DTS导致的?
  此外,因为ffmpeg的TS封装都是针对MPEG-2的,例如PMT中的视频stream_type都是0x2。除此以外,还有哪些字段的值对于MPEG-2和H.264是不同的?

  请做过TS封装的各位大侠给予解答,十分感谢!
===================================================
tufaqing #1楼 得分:10回复于:2009-12-30 10:05:09
应 该可以吧,stream_type=0x1b,编码器自己会去填啊,不用自己管,关键是你送进来的数据对不对,H264数据流格式有两种,一种是带NAL 的,前几个字节是长度,通常这种格式叫AVC,第二种是像MPEG Video,每帧是一0x00 0x00 0x00 0x01开始的。TS只接受第二种。要是第一种的话要转换一下。

===================================================
mediaWorker #2楼 得分:0回复于:2009-12-30 10:28:29
感谢tufaqing!
 
编码之后的H.264码流开始的几bit是0x00 00 00 01 67 42 00 28 E9 01 68 24 C8 00 00 00 01 68 CE 38 80 ......,应该是你所说的“第二种像MPEG Video”,那就不需要转换了。
请问如果TS流中没有PCR、ESCR、PTS、DTS信息是不是视频解码器就无法获得正确的输入码流?
===================================================
blackboyofsnp
#3楼 得分:5回复于:2009-12-31 00:10:40

里面有同步信息,没有它,怎么同步。。。
===================================================
mediaWorker #4楼 得分:0回复于:2010-01-04 09:43:19
我 暂时还不考虑同步,现在的问题是经过H.264编码压缩后的码流可以使用VLC player播放,可以在封装成TS之后就无法播放了。请问如果是TS包,播放器一定要找到DTS才能会启动解码器吗?如果是.h264码流,一样也没有 DTS和PTS,VLC player是如何知道解码及显示顺序的呢?

我 用VLC player调试了这种无法播放的ts码流,发现PAD表、PMT表,还有ES的PID、stream_type这些都能正确解析,但是在解到video PES数据时,h264_packetize解析了所有NAL包,但是送入H264解码器的码流却不完整,不知道是什么原因导致这部分码流数据的丢失?

另 外一个问题请问tufaqing或其他知道答案的人:编码之后的H.264码流开始的几bit是0x00 00 00 01 67 42 00 28 E9 01 68 24 C8 00 00 00 01 68 CE 38 80 ......,这种码流是“第一种是带NAL的,前几个字节是长度,通常这种格式叫AVC”?还是“第二种是像MPEG Video,每帧是一0x00 0x00 0x00 0x01开始的。”?
===================================================
tufaqing #5楼 得分:15回复于:2010-01-04 17:16:43
楼主的这种是第二种格式,应该是正确的,你的几个字节正好也是h264的sps和pps头。
时间戳只会影响播放,不会导致解码器解码失败。我没调试过VLC,不知道TS流时间戳不对时送进解码器会不会丢数据,但通常丢帧处理应该是在显示模块里面做的,应该不影响解码过程。
h264能照常播放是因为播放器按照帧率理论值来播放的,显示顺序是解码器解码出来就已经调整好了,然后打上时间戳给显示模块处理。
建 议先用其他播放器播放看看,可能是VLC的问题,也可能是你打包时丢掉了数据。因为TS是将每一帧拆分打包的,一个TS包数据大概就184字节,肯定不是 一个完整帧的,一般h264的解码器都需要一帧一帧的给,ffmpeg需要调用h264 parser来查找每一帧才行,不知道你送到解码器是不是一个完整帧,每一帧开头应该是0x00 00 00 01。
===================================================
ttxk #7楼 得分:10回复于:2010-01-13 15:18:13
h264封装到TS中,stream_type和stream_id的值跟mpeg2有所不同,另外还需要把sps+pps的信息写到PMT的decoder_specific_info当中。
===================================================
mediaWorker #8楼 得分:0回复于:2010-01-13 16:16:41
H264的stream_type=0x1B,MPEG-2的stream_type = 0x02; H264的stream_id和MPEG-2的相同,都为0xE0。

请问ttsk,decoder_specific_info是PMT中的一个字段吗?我在协议中没找着啊。

请问各位,如果ts文件没有PCR、PTS和DTS能用vlc或者暴风影音播放吗?有没有哪位做过这种实验的?软件播放器还需要这种时间信息吗?ES数据也没有时间信息,vlc也可以播放,是不是软件播放器必须要获取到ts中的时间信息才能将正确的码流数据送给解码器?
===================================================
tonydel #11楼 得分:0回复于:2010-05-10 15:37:26
VLC必须要打PCR才能解
===================================================
zoulie #12楼 得分:0回复于:2010-06-22 22:32:48
试过将H264的TS包parser出来的ES流,暴风影音能播放
===================================================
LIUSHIJUN123456789 #13楼 得分:0回复于:2010-08-21 21:23:03
哪位有ES(h.264编码)到TS的打包源码呀

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有