10

我有一个需要转换为 MPEG-TS 的文件,以使其符合以下规范:

基本流比特率 [kbit/s] 视频:2575 音频:2 x 192 字幕:- PAT/PMT:- 填充:-

分量 TS 比特率 [kbit/s] 视频:2652 音频:395 字幕:45 PAT/PMT:45 填充:62 总计:3200 CBR

其他必需组件:PAT PMT Null 数据包

可能弹出的组件:NIT、SDT、EIT 等。

vcodec="h264"
acodec="mpga"
bitrate="2500"
arate="192"
samplerate=48000
ext="mpg"
mux="ts"
vlc="/usr/bin/vlc"
fmt="mpg"
dst="/home/adam/test/"

for a in *$fmt; do
$vlc -I dummy -vvv "/home/adam/test/" --sout "#transcode{vcodec=$vcodec,venc=x264{profile=main,level=3.0,hrd=cbr,bframes=2},vb=$bitrate,acodec=$acodec,ab=$arate,samplerate=$samplerate,channels=2}:standard{mux=$mux,dst=\"$dst$a.$ext\",ac$
done

使用上述脚本编码后,除了两件事之外,一切似乎都正常(视频和音频比特率编解码器都是恒定的):容器的比特率也应该保持 CBR,但事实并非如此。此外,填充组件 (0x1 ffff) - 缺少空包。您是否可以更正脚本以制作空数据包以及容器常量的比特率(3,2 Mbps CBR)?

第二个选项是使用 ffmpeg 编码:

ffmpeg -i video_input.mpg -i audio_input.mp2 -acodec copy -tune zerolatency -x264opts bitrate=2600:vbv-maxrate=2600:vbv-bufsize=166:nal_hrd=cbr -vpre libx264-iptv -vcodec libx264 -f mpegts -muxrate 3200K -y output.ts

但如何取消/禁用/删除 SDT 表?

4

1 回答 1

7

鉴于您了解 NULL 数据包的概念,您可能一直在使用该领域的商业级软件或硬件。

CBR(视频)和系统速率(或多路复用器速率)之间存在差异。当视频被编码为 CBR 时,比如 3.2 Mbps,它可以在该余量附近波动几百 kbps。所以峰值比特率可以说是 3.3 Mbps。这还可以。添加另外 100 kbps 的音频,总最大比特率可以是 3.4。在这种情况下,通常会将系统速率设置为 3.6 Mbps 或更高;其中 balance 是 NULL 数据包。

系统速率 3.5 Mbps根本不会波动。如果是这样,基于 PCR 的同步将无法正常工作,并且基本上,事情将无法在实时环境中工作。所以基本上,您可以将 3.5 Mbps(大约 240 个数据包在 100 毫秒内)视为 BUS。每个座位都必须坐满,以确保运输的连续性。通常,这样做的方式是很少有座位是空的。

可悲的是,VLC 和任何其他开源工具都不会为你做这件事。

我们过去使用的 hack 是,我们曾经通过 IP 发送此类 VLC 生成的流(其中发送没有 NULL 数据包的 TS 流是可以的 - 并通过具有 ASI 或此类接口的 Muxer 的输出接收它,这将添加 muxer .

或者,您可以使用Manzanita muxer将非空 TS 流转换为正确的 TS 流。

编辑:
根据评论 - 如果您需要做的只是禁用 SDT - 需要做两件事。

  1. 从对应于 SDT 表的 PID 中删除所有数据包。如果您没有完全解复用和重新复用 - 一种快速的方法可能是通过 NULL 数据包 PID 编号重新标记 13 位 PID 编号。

  2. 删除 PAT 表中 SDT PID 值的引用。这实质上意味着您生成了 3 到 4 个经过校正的PAT 数据包;并用这些更正的数据包替换流中的所有 PAT 数据包序列。

于 2011-11-27T17:56:01.043 回答