我有一个文件,我需要转换为MPEG-TS,以便符合以下规范:
基本流比特率[kbit / s] 视频:2575 音频:2 x 192 副标题: - PAT / PMT: - 填充: -
组件TS比特率[kbit / s] 视频:2652 音频:395 副标题:45 PAT / PMT:45 填充:62 总计:3200 CBR
其他必需组件: 拍 PMT 空包
可能弹出的组件: 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表?
答案 0 :(得分:6)
鉴于您了解NULL数据包的概念,您可能一直在使用该领域的商业级软件或硬件。
CBR(视频)与系统速率(或多路复用器速率)之间存在差异。当视频被编码为CBR时,比如3.2 Mbps,它可以在该边缘附近波动几百kbps。所以峰值比特率可以说是3.3 Mbps。这很好。添加另外100 kbps的音频,总的最大比特率可以是3.4。通常,在这种情况下,可以将系统速率设置为3.6 Mbps或更高;其中balance是NULL包。
系统速率3.5 Mbps CAN NOT 根本不会发生波动。如果确实如此,基于PCR的同步将不起作用,基本上,事情在现场环境中不起作用。所以基本上,你可以认为3.5 Mbps(在100毫秒内约240个数据包)可以被认为是一个总线。每个座位都必须填满,以确保运输连续。通常情况下,这样做可以使很少的座位保持空置。
可悲的是,VLC和开源中的任何其他工具都不适合你。
我们曾经使用的hack是,我们曾经通过IP发送这样的VLC产生的流(其中发送没有空包的TS流是可以的 - 并且通过带有ASI的Muxer或这样的接口的输出接收它)添加了muxer。
或者,您可以使用Manzanita muxer将非空TS流转换为正确的TS流。
修改强>
根据评论 - 如果你需要做的就是禁用SDT - 有两件事需要做。
从与SDT表对应的PID中删除所有数据包。如果您没有完全解复用和重新复用 - 快速执行此操作的方法可能是通过NULL数据包PID编号重新标记13位PID编号。
删除PAT表中SDT PID值的引用。这实际上意味着您生成3到4个更正 PAT的数据包;并通过这些更正的数据包替换流中的所有PAT数据包序列。