ffmpeg获取组播中指定视频流、音频流(通过pid、program)首发
👦👦一个帅气的boy,你可以叫我Love And Program
🖱 ⌨个人主页:Love And Program的个人主页
💖💖如果对你有帮助的话希望三连💨💨支持一下博主
ffmpeg从组播流中找到特定流
- 前情提要
- 工具
- 背景提要
- 分析流
- ffmpeg通过pid识别流
- ffmpeg通过program识别流
- 参考
- 最后
前情提要
全网未搜索到相关资料,故研究ffmpeg手册终于解决问题,关键字:组播流、rtsp流、rtp流通过pid、program ID选择特定视频流与音频流数据。
工具
- ffmpeg7.1
- python3.10
背景提要
众所周知,想要获取流信息,有一个必不可少的参数,那就是map,正常使用map可以应对绝大多数情况,比如:
(-map参数用于精确控制输入文件中的流(如音频、视频、字幕等)如何映射到输出文件中。它允许用户选择特定的流,并决定它们在输出文件中的排列顺序。)
ffmpeg -i udp://* -map 0:0 -c copy output_h264_aac.ts -y
本身只有一个流,-map参数不用加也可以直接选择,然后问题来了,如果存在两个,甚至10个流,该如何选择呢?
分析流
首先我们要分析流情况,通过下面这条命令进行查询:
ffprobe -i temp.mp4
看到以下数据,这里需要关注Stream后数据,正常通过#0:0、#0:1即可完成数据流选择,但是当前我们希望要 Program 2该如何操作呢?
Program 1 Metadata:service_name : service_provider: Stream #0:0[0xc8]: Audio: mp2 (mp3float) ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/sStream #0:1[0x64]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn
Stream mapping:Stream #0:0 -> #0:0 (copy)
Output #0, mpegts, to 'output_h264_aac.ts':Metadata:encoder : Lavf61.7.100Stream #0:0: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/sProgram 2 Metadata:service_name : service_provider: Stream #0:3[0xc9]: Audio: mp2 (mp3float) ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/sStream #0:9[0x63]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn
回复:你可以直接使用-map对应0:3、0:9**(如下)**,也是没问题的,如果这部分数据是变化的呢?经过多次测试,Stream #0:4[0xc9]、Stream #0:5[0xc9]都有可能名单时后面的16进制数不会改变,也就是他的 pid 值 和 program ID。
ffmpeg -i udp://* -map 0:0 -map 0:1 -c copy output_h264_aac.ts -y
ffmpeg通过pid识别流
- 通过流 ID(例如 MPEG-TS 容器中的 PID)来匹配流。
ffmpeg -i udp://* -map 0:#0xc8 -map 0:#0x64 -c copy output_h264_aac.ts -y
成功获取到指定数据流
ffmpeg通过program识别流
- 匹配程序中 ID 为program_id的流。如果 使用additional_stream_specifier,则它匹配既属于程序一部分又匹配additional_stream_specifier的流
ffmpeg -i udp://* -map 0:p:1 -c copy output_h264_aac.ts -y
成功获取到指定数据流
参考
最后
同样图片里面还有其他方式可以获取到指定数据流,欢迎评论交流