手动编码为 MPEG-TS

2024-06-26

SO...

我正在尝试采用 H264 附件 B 字节流视频并将其编码为纯 Java 中的 MPEG-TS。我的目标是创建一个最小的 MPEG-TS、单节目、有效流,并且不包含任何定时信息(PCR、PTS、DTS)。

我目前处于可以将生成的文件传递给 ffmpeg (ffmpeg -i myVideo.ts) 和 ffmpeg 报告的位置...

[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

...看来这个开始时间警告没什么大不了的...并且 ffmpeg 无法确定视频的长度。如果我从视频文件创建另一个 mpeg-ts 文件(ffmpeg -i myVideo.ts -vcodec copy validVideo.ts)并运行 ffmpeg -i validVideo.ts 我得到...

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

...所以您可以看到计时信息和比特率以及元数据。

我的 H264 视频仅由 I 帧和 P 帧组成(当然,I 帧之前有 SPS 和 PPS),我创建 MPEG-TS 流的方式是...

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

...我的 PAT 看起来像这样...

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

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

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

...请注意,在 c100 00 之后,“ff ff”、f0...表示我们没有使用 PCR...另请注意,我已更新了 CRC 以反映 PMT 的此更改。我的第一个 I Frame 数据包看起来像......

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 

...您会注意到在 01e0 0000 之后,8000 00 是 PES 标头扩展,其中我没有指定 PTS / DTS 并且剩余长度为零。我的第一个 P 帧数据包看起来像......

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

...每当 I 帧或 P 帧结束时,我都会有一个带有适应字段的 TS 数据包,例如...

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

...其中前 b0 字节是适应字段填充字节,其余字节是 I 或 P 帧的最后字节。正如您所知,我可以使用 ffmpeg 并将我的文件传递给它以创建任何格式的有效电影。但是,我需要创建的文件采用正确的格式,但我无法完全弄清楚我缺少的最后一块是什么。有任何想法吗?


你们的要求是相互矛盾的。 “有效流”和“不包括任何计时信息”是不兼容的。 TS 要求至少每 100 毫秒进行一次 PCR。虽然特定于玩家,但大多数玩家不会“呈现”没有“呈现时间戳”的帧。您可以从 VUI 数据中获取时间戳,但它必须存在于容器中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手动编码为 MPEG-TS 的相关文章

  • ffmpeg视频已压缩但无法在浏览器中播放

    我已经集成了ffmpeg4android lib 视频压缩工作正常 但视频无法在除 safari 浏览器之外的浏览器中播放 上传到服务器后 我使用了以下命令 ffmpeg y i
  • 为 Windows Phone 8 构建 ffmpeg

    我如何为 Windows Phone 8 arm 构建 ffmpeg 我找不到任何有关它的信息 我可以在 Windows Phone 8 中从 C 调用 h 264 硬件编码器 解码器吗 看来媒体基金会太有限了 谢谢 据我所知 由于缺少工具
  • FFmpeg 代码无法在用于缩略图提取的 http url 上工作

    我正在尝试从 sharepoint 2013 视频库中提取缩略图 我找到了一个可以使用 ffmpeg 提取的链接 这是链接 如何将视频的第一帧保存为图像 https stackoverflow com questions 3575311 h
  • 使用 libavcodec 提取音频样本

    我对如何从 AVFrame 中的数据提取双值感到困惑 我正在尝试提取帧 我尝试检查用 CPython 编写的 av 模块背后的源代码 尤其是 AudioFrame 来尝试了解它从何处解码样本 https github com PyAV Or
  • HTML5 MediaSource 适用于某些 mp4 文件,但不适用于其他文件(相同的编解码器)

    我正在玩 MediaSource API 代码直接取自 Mozilla 的示例页面 https developer mozilla org en US docs Web API MediaSource endOfStream https d
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • Bash while 循环等待任务完成

    我创建了一个 bash 脚本来处理文件夹及其子文件夹中的视频 find type f name mkv while read file do ffmpeg i file done 问题 它不是 while 循环等待 ffmpeg 完成 而是
  • 强制 Mpeg2 解复用器使用 ffdshow 渲染 H 264 数字电视视频

    不幸的是 我花了很多时间尝试使 DirectShow 的 DTVViewer 示例正常工作 但没有成功 DVBT网络的视频格式是H264 我发现IntelliConnect行为IFilterGraph更喜欢使用 Mpeg2 视频格式 对于那
  • 从图像创建视频时,每秒减慢 ffmpeg 的图像速度

    我有一系列演示的屏幕截图 我想将其放入视频中 我正在使用 ffmpeg 为此目的 命令是ffmpeg f image2 i screenshot 5d png vcodec mpeg4 demo avi 不过 视频长度比我想要的要短 而且移
  • Python 视频框架

    我正在寻找一个 Python 框架 它将使我能够播放视频并在该视频上绘图 用于标记目的 我尝试过 Pyglet 但这似乎效果不是特别好 在现有视频上绘图时 会出现闪烁 即使使用双缓冲和所有这些好东西 而且似乎没有办法在每帧回调期间获取视频中
  • 如何使用Java从网络摄像头获取视频和音频流?

    如何使用 Java 以跨平台方式 从网络摄像头获取视频和音频流 例如 我们有一台带有3 4个USB网络摄像头的计算机 我们希望获取它们的流并使它们在用户界面中可见 我们怎样才能做到这样的事情呢 我需要一个简单应用程序的代码 该应用程序可以找
  • 未对齐的内存访问

    我正在开发不支持未对齐内存访问的嵌入式设备 对于视频解码器 我必须处理 8x8 像素块中的像素 每个像素一个字节 该设备具有一些 SIMD 处理功能 使我能够并行处理 4 个字节 问题是 8x8 像素块不能保证从对齐的地址开始 并且函数需要
  • 如何使用 ffmpeg 和 h264_videotoolbox 标志提高输出视频质量?

    目前我正在使用这个命令来转换 ffmpeg i
  • OpenCV/FFMpeg 图像捕获问题

    我正在尝试从网络摄像机实时捕获图像 该流在 VLC 中运行得很好 但 OpenCV 的cvQueryFrame 似乎使传入的图像变得混乱和损坏 以至于无法识别 同样 从文件捕获可以正常工作 但实时流则不行 为了以防万一 我使用了 rtsp
  • 如何平铺视频/创建视频蒙太奇?

    我有四个视频 我想以 2x2 的方式平铺它们来制作一个新视频 有没有一种方法可以轻松地做到这一点 最好是免费的并且在 Linux 下 我愿意编写适量的程序 也许是为了与某些库交互 但不愿意自己编写整个视频处理程序 您可能会假设输入和输出视频
  • 使用ffmpeg转换文件时PHP内部服务器错误500

    我有一个 PHP 脚本 在我的服务器中通过 cron 作业调用它来运行上传的视频转换 它对于某些视频效果很好 但是当视频稍大一点 例如 21MB 时 我会得到一个500 Internal Server Error并且没有其他输出 我认为这个
  • 手动编码为 MPEG-TS

    SO 我正在尝试采用 H264 附件 B 字节流视频并将其编码为纯 Java 中的 MPEG TS 我的目标是创建一个最小的 MPEG TS 单节目 有效流 并且不包含任何定时信息 PCR PTS DTS 我目前处于可以将生成的文件传递给
  • Safari 无法从缓存中检索 mp4 视频,并且有时在下载相同资源时超时

    我正在运行一个显示全屏视频故事的 VueJS 应用程序 我不会在故事中创建与媒体数量一样多的标签 我只是在每次播放新视频时更改组件视频源 但看起来 Safari 桌面版和移动版 在加载后仍然不会缓存 HTML 视频 当我再次播放以前的媒体时
  • 如何为Android编译最新的FFmpeg库?

    努力将当前 FFmpeg 的工作和一般最佳实践构建在一起 似乎没有最新的文档或教程 现有的内容充满了过时的链接或不起作用的构建脚本 构建独立的 NDK 工具链 下载最新的NDK并运行make standalone toolchain py
  • 为什么 mp4 视频在 iPad 上可以正常播放,而在 iPhone 上却不行?

    我对这个问题很困惑 我有一个大型 H 264 mp4 视频文件库 需要在 iOS 上播放 最初 我只针对 iPad 但要求发生了变化 现在我需要包括 iPhone 但我注意到 我的 iPod Touch 与我的 iPad 具有完全相同的操作

随机推荐