FFmpeg同时推流至三个不同RTMP地址的配置错误排查
你的FFmpeg多推流命令错误分析及修正方案
嘿,我仔细检查了你写的FFmpeg推流命令,发现了几个关键问题导致运行出错,下面给你逐一拆解并给出修正后的命令:
核心错误点
1. -streamloop 参数位置错误且使用不当
-streamloop是控制输入流循环的全局参数,必须放在对应的输入文件前面,而不是塞进输出段里。你把它放在第二个输出的参数中,FFmpeg根本无法正确解析这个参数:
- 如果你的需求是让第二路音频循环播放以匹配原视频的时长,应该把
-streamloop -1(-1表示无限循环)加在第二个输入文件的前面; - 如果不需要循环音频,直接删掉这个参数就行。
2. 第三个输出的编码参数语法错误
第三个输出里的 -map 0:a aac 缺少了编码参数的标识 -c:a,正确写法应该是 -map 0:a -c:a aac。没有 -c:a 的话,FFmpeg会把 aac 误认为是输出路径的一部分,直接触发语法错误。
修正后的完整命令
情况1:不需要循环第二路音频
ffmpeg -re -i /usr/VIDEO/my_video.mp4 -i /usr/VIDEO/x_audio.mp3 \ # 第一个输出:原视频+原音频 -map 0:v -c:v libx264 -vf format=yuv420p -b:v 2000k -bufsize 3000k -maxrate 2000k -s 1024x576 -g 60 \ -map 0:a -c:a aac -b:a 192k -ar 44100 \ -f flv rtmp://my_ip/live/pass \ # 第二个输出:原视频+第二路音频(时长取最短输入的长度) -map 0:v -c:v libx264 -vf format=yuv420p -b:v 2000k -bufsize 3000k -maxrate 2000k -s 1024x576 -g 60 \ -map 1:a -c:a aac -b:a 192k -ar 44100 -shortest \ -f flv rtmp://my_ip/noaudio/pass \ # 第三个输出:仅原音频 -map 0:a -c:a aac -b:a 192k -ar 44100 \ -f flv rtmp://my_ip/only_audio/pass
情况2:需要循环第二路音频以匹配视频时长
ffmpeg -re -i /usr/VIDEO/my_video.mp4 -streamloop -1 -i /usr/VIDEO/x_audio.mp3 \ # 第一个输出:原视频+原音频 -map 0:v -c:v libx264 -vf format=yuv420p -b:v 2000k -bufsize 3000k -maxrate 2000k -s 1024x576 -g 60 \ -map 0:a -c:a aac -b:a 192k -ar 44100 \ -f flv rtmp://my_ip/live/pass \ # 第二个输出:原视频+循环的第二路音频(用-shortest截断到视频时长) -map 0:v -c:v libx264 -vf format=yuv420p -b:v 2000k -bufsize 3000k -maxrate 2000k -s 1024x576 -g 60 \ -map 1:a -c:a aac -b:a 192k -ar 44100 -shortest \ -f flv rtmp://my_ip/noaudio/pass \ # 第三个输出:仅原音频 -map 0:a -c:a aac -b:a 192k -ar 44100 \ -f flv rtmp://my_ip/only_audio/pass
额外说明
-shortest参数的作用是让输出时长等于所有输入中最短的那个,避免其中一路流无限循环导致推流永不停止;- 你前两个输出的视频编码参数完全一致,也可以用全局参数来简化命令(比如把视频编码参数放在所有输出之前),不过这不是报错原因,只是让命令更简洁。
内容的提问来源于stack exchange,提问作者Antonio Gargiulo
相关产品推荐
相关产品推荐

