2011-11-25 75 views
9

我有需要转换为MPEG-TS,使其适合以下规范文件:MPEG-TS编码

基本流的比特率[千比特/秒] 视频:2575 音频:2×192 字幕: - PAT/PMT: - 填料: -

元器件TS的比特率[千比特/秒] 视频: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 

与上面的脚本编码之后一切似乎没问题(视频和音频比特率编解码器都是恒定的),除了两件事:容器的比特率也应该保持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

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

CBR(视频)和系统速率(或多路复用器速率)之间存在差异。当视频编码为CBR,比如3.2 Mbps时,可以确定它在这个边界上波动几百kbps。所以峰值比特率可以说是3.3 Mbps。这很好。增加另一个100kbps的音频,总的最大比特率可以是3.4。通常,在这种情况下,系统速率可以高于3.6 Mbps或更高;平衡是NULL分组。

系统速率3.5 Mbps CAN NOT波动。如果是这样,基于PCR的同步不会工作,基本上,事情不会在现场环境中工作。所以基本上,您可以将3.5 Mbps(100毫秒内的约240个数据包)想象为BUS。每个座位都必须装满以确保运输连续。通常情况下,这样做的方式是少数席位将保持空置。

可悲的是,无论是VLC还是其他开源工具都不会为您做到这一点。我们曾经使用过的破解是,我们用来通过IP发送这样的VLC产生的流(其中发送没有NULL分组的TS流是确定的 - 并且通过具有ASI或这种接口的Muxer的输出来接收该流将会添加复用器

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

编辑:基于注释
- 如果你需要做的是禁用SDT - 有两件事情需要做。

  1. 从与SDT表对应的PID中删除所有数据包。如果你没有完全解复用和重新合并 - 一个快速的方法可能是用一个空包PID号重新标记13位PID号。

  2. 删除PAT表中SDT PID值的引用。这基本上意味着你产生了3到4个数据包,它是纠正的 PAT;并用这些校正的分组替换流中的所有PAT分组序列。

+1

第二个命令工作正常,但我怎样才能从文件中删除SDT表? – adismsc