请教从ts中抽取video PES的问题

goldenlinn 2009-05-18 10:50:06
我要做TS转PS,从ts中抽取PES的时候因为pes packet length==0故只能看下一个188的ts包里面pay_load_unit_start_indicator是否==1,
这样来判断是否是新的PES packet,不知这样判断对不对?
因为这样检查出来的PES packet远大于2048,我看资料上说一般间隔2k就有一个PES header。
如果pay_load_unit_start_indicator不是1的话后面的数据中虽有00 00 01,但接下来的stream id和pes length不对,故我认为是pes packet的数据,
而不是包头。
请各位看看,我的理解和做法有无问题。
因为这样抽取出来的PES转成PS后,纯audio可以播放;纯video或者AV的话则会黑屏。
...全文
630 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingxin505 2011-11-29
  • 打赏
  • 举报
回复
确实很无语.PES包长度为0.那如何判断其已结束了呢?
判断后继数据确实可以.但是万一它就是最后呢?不是要丢数据?
期待高人解释.
xht80 2011-03-21
  • 打赏
  • 举报
回复
09年的帖子看看还得回复!!!
goldenlinn 2009-05-20
  • 打赏
  • 举报
回复
音视频数据包会在解码端按照PES里的streamID区分开,所以不会是这个问题。
我怀疑原因有2:
1、PES包抽取不正确
2、PTS、DTS、SCR没有设置好

第一点我反复验证应该是OK的,就是不清楚除了第2点外还有没有其它的原因。
rotus 2009-05-20
  • 打赏
  • 举报
回复
"就是AV在一起的时候用VLC播放没有声音且马赛克很严重"

不会是音视频数据包没有区分开来吧?

PS的不太清楚,有PID什么的需要设置么?
goldenlinn 2009-05-20
  • 打赏
  • 举报
回复
图像能够正确显示,且能够拖放,证明PTS、DTS和SCR是好的,
单独的video和audio都是好的,合在一起就没有声音加马赛克,故可能是抽取PES 的问题或
拼接音视频资料不正确造成误认audio为video资料,但我是按照原始ts中的音视频顺序抽取资料填到PS中的。
故抽取PES出错的可能性居多,难道PES结尾我还有什么没有处理到的吗,让后来的audio资料没被误认为前一个video PES包的延续?
rotus 2009-05-20
  • 打赏
  • 举报
回复
PTS、DTS、SCR 没有设置好的话,应该不会有马赛克啊,最多是画面停顿不连续吧。
  • 打赏
  • 举报
回复
goldenlinn 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rotus 的回复:]
引用 4 楼 goldenlinn 的回复:
谢谢3楼的回复,我用你说的办法把PES抽出来后加上PS header转换出PS文件,ps header中的SCR用pes header中的PTS填充。
得到的ps文件如果是audio可以播放,video则不能播放,AV都有的话则kmplayer只认识audio,vlc播放画面马赛克和严重。
不清楚到底是哪里出了问题。


这样做的前提是 要 标准码流 。实际上 当PES包结束但长度不够188,会出现不填充,直接跟上新的PES包。

LZ可以先排…
[/Quote]

我查过了,没有你说的在中间出现PES header的情况,0x000001倒是后,不过后面跟的都是有规律的1、2、3、4。。。。。,没有大过0xC0的情况。
顺便说一下,我要转换的ts只含有video和audio数据,目前单独转换audio和video都可以播放,就是AV在一起的时候用VLC播放没有声音且马赛克很严重。
用kmplayer则不能识别。
rotus 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 goldenlinn 的回复:]
谢谢3楼的回复,我用你说的办法把PES抽出来后加上PS header转换出PS文件,ps header中的SCR用pes header中的PTS填充。
得到的ps文件如果是audio可以播放,video则不能播放,AV都有的话则kmplayer只认识audio,vlc播放画面马赛克和严重。
不清楚到底是哪里出了问题。
[/Quote]

这样做的前提是 要 标准码流 。实际上 当PES包结束但长度不够188,会出现不填充,直接跟上新的PES包。

LZ可以先排除这种情况。

zengdezhi 2009-05-18
  • 打赏
  • 举报
回复
我解PES包也是按楼主的方法解的,存放为纯视频文件和纯音频文件都能正常播放放出来,我现在想把视频PES包和音频PES包存放到同一一个文件内,现在我遇到的问题就是PACK Header的SRC_BASE和SRC_EXT字段如何求?不知道你是如何用代码实现的。
jinlking 2009-05-18
  • 打赏
  • 举报
回复
关注!!
audio可以播放应该是因为audio一帧比较小
goldenlinn 2009-05-18
  • 打赏
  • 举报
回复
谢谢3楼的回复,我用你说的办法把PES抽出来后加上PS header转换出PS文件,ps header中的SCR用pes header中的PTS填充。
得到的ps文件如果是audio可以播放,video则不能播放,AV都有的话则kmplayer只认识audio,vlc播放画面马赛克和严重。
不清楚到底是哪里出了问题。
rotus 2009-05-18
  • 打赏
  • 举报
回复
13818-1

payload_unit_start_indicator
When the payload of the Transport Stream packet contains PES packet data, the payload_unit_start_indicator has the
following significance: a '1' indicates that the payload of this Transport Stream packet will commence with the first byte
of a PES packet and a '0' indicates no PES packet shall start in this Transport Stream packet. If the
payload_unit_start_indicator is set to '1', then one and only one PES packet starts in this Transport Stream packet.
看意思应该是有效负载将以PES的第一个字节开始


For Transport Stream packets carrying PES packets, stuffing is needed when there is insufficient PES packet data
to completely fill the Transport Stream packet payload bytes. Stuffing is accomplished by defining an adaptation field
longer than the sum of the lengths of the data elements in it, so that the payload bytes remaining after the adaptation field
exactly accommodates the available PES packet data. The extra space in the adaptation field is filled with stuffing bytes.
This is the only method of stuffing allowed for Transport Stream packets carrying PES packets.

按这里的意思如果PES包结束但长度不够188时,需要在adaptation field 加入填充字节。这也是TS流carrying PES 唯一的填充方法



综上,"看下一个188的ts包里面pay_load_unit_start_indicator是否==1,这样来判断是否是新的PES packet" 应该是正确的
gebifangjian 2021-07-15
  • 举报
回复
@rotus 看讨论还需要回复,顶起来

2,543

社区成员

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

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