使用ffmpeg将多个单视频MPEG-TS多路复用为mts



我试图找到将不同输入(ts)多路复用到一个MPTS的解决方案,以便可以用作DVB-T调制器的输入。基本上,我想要的是选择卫星接收器提供的某些TS,将它们重新打包成一个MPTS并发送给调制器。目前,我已经使用以下命令在一个流中完成了此操作:

  ~/DATVRelease/ffmpeg 
 -re -i URL_SINGLE_INPUT_TS_STREAM  -vcodec copy -acodec copy 
 -f mpegts -mpegts_original_network_id 1 -mpegts_transport_stream_id 1 
 -mpegts_service_id 1 -mpegts_pmt_start_pid 1000 -mpegts_start_pid 1001 
 -metadata service_provider="YOUR CALL" 
 -metadata service_name="N1 (ALEKSANDAR)" 
 ~/dvb/videots

其中的视频是由mkfifo命令产生的fifo管道。以下代码在接收端产生了结果:

https://i.stack.imgur.com/BZugM.jpg

在ffmpeg中有一个-map函数,我可以在其中添加多个音频通道/或视频通道,但它们不会在接收器端检测到不同的服务电视频道,因为在我的理解中必须创建适当的PMT表(iso13818)

我能找到的唯一开源是这个http://www.scara.com/~schirmer/o/mplex13818/,但我仍然想知道ffmpeg是否可以为我做这项工作?

下面是生成包含多个程序的MPEG2 TS文件的基本命令。

ffmpeg -i FirstInput -i SecondInput 
-map 0:0 -map 0:1 -map 1:0 -map 1:1 
-program title=ProgOne:st=0:st=1 -program title=ProgTwo:st=2:st=3 
-f mpegts mpts.ts

下面是每个选项的简单说明。

-i FirstInput -i SecondInput 

选择包含要复用到输出MPTS的基本流的源文件

-map 0:0 -map 0:1 -map 1:0 -map 1:1

选择您想要复用到输出MPTS的特定元素流。流将从零开始索引。这里我们为两个文件选择第一和第二流。通常它们对应于视频流和音频流。关于-map,请参阅FFmpeg文档和wiki的高级选项章节。

-program title=ProgOne:st=0:st=1 -program ProgTwo:st=2:st=3

告诉FFmpeg在输出的MPTS中生成两个程序。这里title给出了SDT中的service_name。st=指定放入相应程序的流。参见FFmpeg ddocumentation

的主要选项章节
-f mpegts

告诉FFmpeg使用mpegts muxer,以防无法从输出文件的后缀推断。

关键选项是-map和-program,用于在一个输出中复用多个程序。此增强是根据问题4734和问题4525在此提交中添加的。

显然可以添加更多的选项来调整行为,如编解码器类型,比特率控制,质量控制等

最新更新