如何通过FFmpeg将RTSP流转换为固定包大小的MPEG-TS UDP流?
如何通过FFmpeg将RTSP流转换为固定包大小的MPEG-TS UDP流?
我完全懂你的困扰——好不容易找到能输出固定大小包的命令,却多了个没必要的RTP头,不想额外写代码处理太麻烦对吧?咱们直接用FFmpeg自带的参数就能搞定这个问题。
你之前用-f rtp_mpegts得到的1328字节固定包,其实是7个188字节的MPEG-TS包加上12字节的RTP头。而用-f mpegts加pkt_size参数时包大小波动,核心原因是FFmpeg的mpegts复用器默认有缓存延迟,不会严格按你指定的大小打包。
这里有个精准的解决方案,只需要给命令加两个关键参数,强制复用器输出固定大小的UDP包:
ffmpeg -i rtsp://localhost:123 -f mpegts -muxdelay 0 -muxpreload 0 udp://localhost:456?pkt_size=1316
参数说明:
-muxdelay 0和-muxpreload 0:这两个参数会关闭复用器的缓存机制,让它一凑够你指定的pkt_size就立刻发送UDP包,不会因为缓存等待而拆分或合并包。pkt_size=1316:这个值刚好是7个MPEG-TS包的总大小(188×7=1316),和你之前用rtp_mpegts时的TS内容大小一致,只是去掉了多余的RTP头。
如果需要其他数量的TS包聚合,只需要把pkt_size改成对应的值就行——比如要4个TS包,就设为188×4=752,以此类推。
用这个命令后,你就能得到每个UDP包大小固定为1316字节的纯MPEG-TS流,完全符合你的需求。
备注:内容来源于stack exchange,提问作者Zimri Leisher




