Ale*_*eks 3 video ffmpeg transport-stream multiplexing
我试图找到一种解决方案,将不同的输入 (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
Run Code Online (Sandbox Code Playgroud)
其中 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
Run Code Online (Sandbox Code Playgroud)
下面是每个选项的简单说明。
-i FirstInput -i SecondInput
Run Code Online (Sandbox Code Playgroud)
选择包含要复用到输出 MPTS 的基本流的源文件
-map 0:0 -map 0:1 -map 1:0 -map 1:1
Run Code Online (Sandbox Code Playgroud)
选择要复用到输出 MPTS 中的特定基本流。流将从零开始索引。这里我们为两个文件选择第一个和第二个流。通常它们对应于视频和音频流。有关 -map ,请参阅FFmpeg 文档和wiki的高级选项章节。
-program title=ProgOne:st=0:st=1 -program ProgTwo:st=2:st=3
Run Code Online (Sandbox Code Playgroud)
告诉 FFmpeg 在输出 MPTS 中生成两个程序。这里title
给出了SDT中的service_name。st=
指定放入相应程序的流。请参阅FFmpeg 文档的主要选项章节
-f mpegts
Run Code Online (Sandbox Code Playgroud)
告诉 FFmpeg 使用 mpegts muxer,以防无法从输出文件的后缀推断出来。
关键选项是 -map 和 -program,用于在一个输出中复用多个程序。根据问题 4734和问题 4525在此提交中添加了增强功能。
显然,可以添加更多选项来调整行为,例如编解码器类型、比特率控制、质量控制等。
归档时间: |
|
查看次数: |
10138 次 |
最近记录: |