Encoding MPEG-TS编码

Encoding MPEG-TS编码,encoding,video-streaming,vlc,mpeg2-ts,dvb,Encoding,Video Streaming,Vlc,Mpeg2 Ts,Dvb,我有一个文件需要转换为MPEG-TS,以便符合以下规范: 基本流比特率[kbit/s] 视频:2575 音频:2x192 副标题:- PAT/PMT:- 填料:- 组件TS比特率[kbit/s] 视频:2652 音频:395 字幕:45 PAT/PMT:45 填料:62 总数:3200 CBR 所需的其他组件: 拍打 支付款 空包 可能弹出的组件: NIT、SDT、EIT等 vcodec="h264" acodec="mpga" bitrate="2500" arate="192" sample

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

基本流比特率[kbit/s] 视频:2575 音频:2x192 副标题:- PAT/PMT:- 填料:-

组件TS比特率[kbit/s] 视频:2652 音频:395 字幕:45 PAT/PMT:45 填料:62 总数:3200 CBR

所需的其他组件: 拍打 支付款 空包

可能弹出的组件: 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)-null数据包。您是否可以更正脚本以使空数据包以及容器的比特率保持不变(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表?

鉴于您知道空数据包的概念,您可能已经在该领域使用了商用级软件或硬件

CBR(视频)和系统速率(或多路复用器速率)之间存在差异。当视频被编码为CBR时,比如说在3.2Mbps,它在这个边缘上下波动几百kbps是很正常的。因此,峰值比特率可以是3.3Mbps。这很好。再加上100 kbps的音频,总最大比特率可以达到3.4。通常,在这种情况下,可以将系统速率设置为3.6 Mbps或更高;其中余额为空数据包

系统速率3.5 Mbps完全不能波动。如果是这样的话,基于PCR的同步将不起作用,而且基本上,在现场环境中也不会起作用。所以基本上,你可以把3.5Mbps(大约240个数据包在100毫秒内)看作一条总线。每个座位都必须加满,以确保运输的连续性。通常,这样做的方式很少有座位是空的

可悲的是,无论是VLC还是开源中的任何其他工具都不能为您做到这一点

我们曾经使用的黑客是,我们曾经通过IP发送这种VLC生成的流(在IP上发送没有空数据包的TS流是可以的-并且通过带有ASI的Muxer或这样的接口的输出来接收,这将添加Muxer)

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

编辑:
根据评论——如果你只需要禁用SDT——有两件事需要做

  • 从与SDT表相对应的PID中删除所有数据包。如果您没有完全解组和重新解组-一种快速的方法是用空数据包PID号重新标记13位PID号

  • 删除PAT表中SDT PID值的引用。这基本上意味着您生成一个3到4个经过纠正的PAT数据包;并用这些纠正的数据包替换流中的所有PAT数据包序列


  • 第二个命令工作正常,但如何从文件中删除SDT表?