MPEG-TS编码

adi*_*msc 10 encoding vlc video-streaming mpeg2-ts dvb

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

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

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

其他必需组件:PAT 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
Run Code Online (Sandbox Code Playgroud)

使用上面的脚本编码后,一切似乎都可以(视频和音频比特率编解码器都是常量)除了两件事:容器的比特率也应该保留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
Run Code Online (Sandbox Code Playgroud)

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

Dip*_*hta 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(在100毫秒内约240个数据包)可以被认为是一个总线.每个座位都必须填满,以确保运输连续.通常情况下,这样做可以使很少的座位保持空置.

可悲的是,VLC和开源中的任何其他工具都不适合你.

我们曾经使用的黑客是,我们曾经通过IP发送这样的VLC产生的流(其中发送没有空包的TS流是可以的 - 并且通过具有ASI的Muxer或这样的接口的输出接收它,这将添加muxer .

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

编辑:
基于评论 - 如果你需要做的就是禁用SDT - 有两件事需要做.

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

  2. 删除PAT表中SDT PID值的引用.这实际上意味着你产生一个3到4个数据包,这是纠正 PAT; 并通过这些更正的数据包替换流中的所有PAT数据包序列.