我试图找到一种解决方案,将不同的输入(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
其中,videots是由mkfifo命令生成的fifo管道。以下代码在接收端产生了结果:
http://i.stack.imgur.com/BZugM.jpg
在ffmpeg中有一个-map函数,我可以在其中添加多个音频频道/或视频频道,但它们不会在接收器端被检测为不同的服务电视频道,因为在我的理解中,必须创建足够的PMT表(iso13818)。
我能找到的唯一开放源码是这个http://www.scara.com/~schirmer/o/mplex13818/,但我仍然想知道ffmpeg是否可以为我做这项工作?
发布于 2017-09-12 11:07:49
以下是生成一个包含多个程序的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中的特定elementry流。将从零开始对流进行索引。在这里,我们为两个文件选择第一个和第二个流。通常,它们对应于视频流和音频流。参见the Advance options chapter of FFmpeg documentation和wiki for -map。
-program title=ProgOne:st=0:st=1 -program ProgTwo:st=2:st=3
告诉FFmpeg在输出MPTS中生成两个程序。这里,title
给出了SDT中的service_name。st=
指定放入相应程序中的流。请参阅the Main options chapter of FFmpeg ddocumentation
-f mpegts
告诉FFmpeg在无法从输出文件的后缀推断的情况下使用mpegts多路复用器。
关键选项是在一个输出中多路复用多个程序的-map和-program。根据issue 4734和issue 4525在this commit中添加了增强功能。
显然,可以添加更多选项来调整行为,例如编解码器类型、比特率控制、质量控制等。
https://stackoverflow.com/questions/31413992
复制相似问题