首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >手动编码成MPEG-TS

手动编码成MPEG-TS
EN

Stack Overflow用户
提问于 2014-07-03 23:29:20
回答 1查看 7K关注 0票数 2

所以..。

我试图获取一个H264附件B字节流视频,并将其编码到纯Java的MPEG-TS中。我的目标是创建一个最小的MPEG-TS,单一程序,有效的流,不包括任何时间信息信息(PCR,PTS,DTS)。

目前,我正在将生成的文件传递给ffmpeg (ffmpeg -i myVideo.ts)和ffmpeg报告.

代码语言:javascript
复制
[NULL @ 0x7f8103022600] start time is not set in estimate_timings_from_pts

Input #0, mpegts, from 'video.ts':
Duration: N/A, bitrate: N/A
Program 1 
  Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc

...it似乎对开始时间的警告不是什么大事.而ffmpeg无法确定视频的长度。如果我从我的视频文件创建另一个mpeg-ts文件(ffmpeg -i myVideo.ts -vcodec copy validVideo.ts)并运行ffmpeg -i validVideo.ts,我得到.

代码语言:javascript
复制
Input #0, mpegts, from 'video2.ts':
Duration: 00:00:11.61, start: 1.400000, bitrate: 3325 kb/s
Program 1 
  Metadata:
    service_name    : Service01
    service_provider: FFmpeg
  Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc

...so,您可以看到计时信息和比特率在那里,元数据也是如此。

我的H264视频只包含I和P帧(当然是i帧之前的SPS和PPS ),我创建MPEG-TS流的方式是.

  1. 在文件的开头写一个PAT
  2. 在文件开头写一个PMT
  3. 从SPS、PPS和I帧创建TS和PES数据包(如果需要的话,也是AUD?)
  4. 从P帧创建TS和PES数据包(如果需要的话,也是AUD NAL)
  5. 对于I帧或P帧的最后有效负载,向适配字段中添加填充字节,以确保其适合于完整的TS数据包
  6. 对整个文件重复3-5。

...my帕特看起来像这样..。

代码语言:javascript
复制
4740 0010 0000 b00d 0001 c100 0000 01f0
002a b104 b2ff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff

...and我的PMT看起来像这样..。

代码语言:javascript
复制
4750 0010
0002 b012 0001 c100 00ff fff0 001b e100
f000 c15b 41e0 ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff

...notice在c100 00之后," ff ",f0.说我们不使用PCR..。还请注意,我已经更新了我的CRC,以反映这一变化的PMT。我的第一个帧包看起来像..。

代码语言:javascript
复制
4741 0010 0000 01e0
0000 8000 0000 0000 0109 f000 0000 0127
4d40 288d 8d60 2802 dd80 b501 0101 4000
00fa 4000 3a98 3a18 00b7 2000 3380 2ef2
e343 0016 e400 0670 05de 5c16 345d c000
0000 0128 ee3c 8000 0000 0165 8880 0020
0000 4fe5 63b5 4e90 b11c 9f8f f891 10f3
13b1 666b 9fc6 03e9 e321 36bf 1788 347b
eb23 fc89 5772 6e2e 1714 96df ed16 9b30
252d ceb7 07e9 a0c7 c6e7 9515 be87 2df1
81f3 b9d2 ba5f 243e 2d5c cba2 8ca5 b798
6bec 8c43 0b5d bbda bc5b 6e7c e15c 84e8
2f13 be84 

.你会注意到在01e00000之后,8000是PES头扩展,我没有指定PTS / DTS,剩下的长度是零。我的第一个P帧包看起来像..。

代码语言:javascript
复制
4741 001d
0000 01e0 0000 8000 0000 0000 0109 f000
0000 0141 9a00 0200 0593 ff45 a7ae 1acd
f2d7 f9ec 557f cdb6 ba38 60d6 a626 5edb
4bb9 9783 89e2 d7e1 102e 4625 2fbf ce16
f952 d8c9 f027 e55a 6b2a 81c3 48d4 6a45
050a f355 fbec db01 6562 6405 04aa e011
50ec 0b45 45e5 0df7 2fed a3f8 ac13 2e69
6739 6d81 f13d 2455 e6ca 1c6b dc96 65d5
3bad f250 7dab 42e4 7ba9 f564 ee61 29fb
1b2c 974c 6924 1a1f 99ef 063c b99a c507
8c22 b0f8 b14c 3e4d 01d0 6120 4e19 8725
2fda 6550 f907 3f87

...and当I帧或P帧结束时,我有一个TS包,其中有一个适配字段,如.

代码语言:javascript
复制
4701 003c b000 ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff

...where第一个b0字节是适配字段填充字节,其余的是I或P帧的最后字节。因此,您可以告诉我,我可以使用ffmpeg并将其传递给我的文件,以创建任何格式的有效电影。然而,我需要我创建的文件以正确的格式,我无法完全弄清楚我错过的最后一块是什么。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-04 01:02:44

你有矛盾的要求。“有效流”和“不包括任何计时信息”是不兼容的。TS要求至少每100毫秒进行一次PCR。当玩家特定时,大多数玩家不会在没有“演示时间戳”的情况下“呈现”一个框架。您可以从VUI数据派生时间戳,但它必须存在于容器中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24564680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档