ffmpeg 录制和播出复用流(多节目流)

ffmpeg 录制和播出复用流(多节目流)
此处的播放还是录制的意思,
录制是存成文件,播放是用udp的协议发送出去, 故此处播放的含义还是录制的意思

复用流录制:
假如有一个复用流,包含4个节目,如下:
ffmpeg  -probesize 10000000 -analyzeduration 5000000  -i multiVideo.ts
Program 1
  Stream #0:0[0x259]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 24 fps, 24 tbr, 90k tbn, 48 tbc
  Stream #0:1[0x321](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 384 kb/s

Program 2
  Stream #0:5[0x25a]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0:4[0x322](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 384 kb/s
Program 3
  Stream #0:6[0x25b]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0:2[0x323](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 384 kb/s
Program 4
  Stream #0:7[0x25c]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0:3[0x324](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 384 kb/s

看到了吗? 流索引号顺序是有点乱的,这会导致流影射时需要更高的技巧! 简单的敲不仔细指定流顺序可能达不到你的要求.
完整的录制命令:
ffmpeg -y -i multiVideo.ts -map 0:p:1 -map 0:p:2 -map 0:p:3 -map 0:p:4  -c copy -program title=A1:st=0:st=1 -program title=A2:st=2:st=3 -program title=A3:st=4:st=5 -program title=A4:st=6:st=7 t1.ts
这是什么含义呢?
用map 来选择流,包括音频流,视频流,字幕流.
-map 0:v        文件0的视频流
-map 0:a        文件0的音频流            
-map 0:2        文件0的第3个流, 索引号,指定一个流,但有个缺点,udp流可能这次的索引与下次的索引不一致
-map 0:p:1        文件0的节目号为1的所有流, 这个指定了某节目的所有流,一般是2个,小索引号的流会排前面
-map 0:i:0x100    文件0的流ID 为0x100的流, 这个最细致,指定了具体的一个流
既然这些流想全部输出,可以简写为-map 0 表示第一个文件流全部选择, 但是它跟一个个描述出来
-map 0:p:1 -map 0:p:2 -map 0:p:3 -map 0:p:4 影射的流顺序是不一样的,为保证正确性,还是写多点
顺序控制性更好, 更细致的就是直接指定流PID了.

用program 来指定输出哪些节目
-program [title=title:][program_num=program_num:]st=stream[:st=stream...] (output)
    Creates a program with the specified title, program_num and adds the specified stream(s) to it.
这里的st指定的是输入流索引,看输入流是怎样排布的.(所以每一个节目影射顺序更容易控制,而-map 0这个默认顺序就可能有些乱)
如果录制想包含多个节目,必需用-program 选项指定,并且要加上title,st说明,否则达不到效果
具体还要看实战,
节目中p2,p3,p4音频序号在前,视频序号在后,不是我希望的. 需要进一步把-map 0:p:1 分解为-map 0:i:xxx 来准确控制了!!!
不过已经够用,就这样吧.

title 是metadata,指明节目Servie_name


1. 单流试验
ffmpeg -i test1.ts -c copy -program title=A1 t.ts
title 是一个metadata, 将代表流中的service_name, 默认Service01
ffmpeg  -y -i multiVideo.ts -c copy -map 0:p:1 -program title=A1:st=100:st=101 p1.ts
搞清了以上问题,就可以随便选择流,打包录制或发出了.
2. 将复用流解包成4个单流
ffmpeg -y -i multiVideo.ts -c copy -map 0:p:1 p1.ts -c copy -map 0:p:2 p2.ts -c copy -map 0:p:3 p3.ts -c copy -map 0:p:4 p4.ts
我查看了一下p2.ts,p3.ts,p4.ts 都是音频流在前,视频流在后, 因为multiVideo.ts中音频流的序号小,所以排在了0位, 这样已经不影响播放了.
如果想按传统让视频在前,可以用-map 0:i:xx 的方式准确指定顺序
这破玩意,关键就是用-map 影射不同的流,有了一个顺序,再用-program 去选择它,从而完成从多节目到多节目的映射!

猜你喜欢

转载自blog.csdn.net/hejinjing_tom_com/article/details/129345505