FFMPEG:2x2 网格摄像机流式传输到 Youtube
FFMPEG: 2x2 Grid Cameras stream to Youtube
所以这是我的“有效”ffmpeg 命令:
ffmpeg -rtsp_transport tcp -i "input1" -rtsp_transport tcp -i "input2" -rtsp_transport tcp -i "input3" -rtsp_transport tcp -i "input4" -filter_complex "[0:v] setpts=PTS-STARTPTS, scale=480x270 [a0];[1:v] setpts=PTS-STARTPTS, scale=480x270 [a1];[2:v] setpts=PTS-STARTPTS, scale=480x270 [a2];[3:v] setpts=PTS-STARTPTS, scale=480x270 [a3];[a0][a1][a2][a3]xstack=inputs=4:layout=0_0|0_h0|w0_0|w0_h0[out]" -map "[out]" -map 3:a -video_size 1920x1080 -tune zerolatency -profile:v baseline -level 3.0 -b:v 5000k -vcodec libx264 -preset medium -q:v 3 -crf 15 -r 15 -c:a aac -ac 2 -f flv rtmp://a.rtmp.youtube.com/live2/...
我遇到的问题是 Youtube 仅将此流识别为“360p”,我认为每个流的质量都比这些摄像机的实际质量差得多。
是不是我做错了什么,或者它应该像那样“工作”,因为将它缩放到 2x2 网格?
每个视频应占宽度的一半和高度的一半,因此 960x540:
ffmpeg -rtsp_transport tcp -i "input1" -rtsp_transport tcp -i "input2" -rtsp_transport tcp -i "input3" -rtsp_transport tcp -i "input4" -filter_complex "[0:v] setpts=PTS-STARTPTS, scale=960x540 [a0];[1:v] setpts=PTS-STARTPTS, scale=960x540 [a1];[2:v] setpts=PTS-STARTPTS, scale=960x540 [a2];[3:v] setpts=PTS-STARTPTS, scale=960x540 [a3];[a0][a1][a2][a3]xstack=inputs=4:layout=0_0|0_h0|w0_0|w0_h0,format=yuv420p[out]" -map "[out]" -map 3:a -c:v libx264 -preset medium -tune zerolatency -b:v 5000k -maxrate 5000k -bufsize 10000k -r 15 -c:a aac -ac 2 -f flv rtmp://a.rtmp.youtube.com/live2/
不相关的更改:
- 已删除
-video_size 1920x1080
,因为它通常是某些多路分解器的输入选项,因此被忽略。
- 删除了
-q:v 3
因为 libx264 忽略了 -q:v
。请改用 -crf
或 -b:v
。
- 删除了
-crf 15
,因为它与 -b:v
互斥。这意味着您一次只能使用一个。如果您同时使用两者,那么其中一个将被忽略。对于流式传输,除非您知道自己在做什么,否则您应该使用 -b:v
而不是 -crf
。
- 已删除
-level 3.0
。级别 3.0 对于 1920x1080 来说太低了(libx264 会在日志输出中通过“级别限制”警告告诉您这一点)。反正你应该不需要限制水平。
- 已删除
-profile:v baseline
。无需定位 2008 年以后的设备。
- 添加了格式过滤器
format=yuv420p
,因此对于色度子采样,输出始终为 YUV 4:2:0。
- 添加了
-bufsize
和 -maxrate
以启用 VBV,强烈推荐用于流式传输。
所以这是我的“有效”ffmpeg 命令:
ffmpeg -rtsp_transport tcp -i "input1" -rtsp_transport tcp -i "input2" -rtsp_transport tcp -i "input3" -rtsp_transport tcp -i "input4" -filter_complex "[0:v] setpts=PTS-STARTPTS, scale=480x270 [a0];[1:v] setpts=PTS-STARTPTS, scale=480x270 [a1];[2:v] setpts=PTS-STARTPTS, scale=480x270 [a2];[3:v] setpts=PTS-STARTPTS, scale=480x270 [a3];[a0][a1][a2][a3]xstack=inputs=4:layout=0_0|0_h0|w0_0|w0_h0[out]" -map "[out]" -map 3:a -video_size 1920x1080 -tune zerolatency -profile:v baseline -level 3.0 -b:v 5000k -vcodec libx264 -preset medium -q:v 3 -crf 15 -r 15 -c:a aac -ac 2 -f flv rtmp://a.rtmp.youtube.com/live2/...
我遇到的问题是 Youtube 仅将此流识别为“360p”,我认为每个流的质量都比这些摄像机的实际质量差得多。
是不是我做错了什么,或者它应该像那样“工作”,因为将它缩放到 2x2 网格?
每个视频应占宽度的一半和高度的一半,因此 960x540:
ffmpeg -rtsp_transport tcp -i "input1" -rtsp_transport tcp -i "input2" -rtsp_transport tcp -i "input3" -rtsp_transport tcp -i "input4" -filter_complex "[0:v] setpts=PTS-STARTPTS, scale=960x540 [a0];[1:v] setpts=PTS-STARTPTS, scale=960x540 [a1];[2:v] setpts=PTS-STARTPTS, scale=960x540 [a2];[3:v] setpts=PTS-STARTPTS, scale=960x540 [a3];[a0][a1][a2][a3]xstack=inputs=4:layout=0_0|0_h0|w0_0|w0_h0,format=yuv420p[out]" -map "[out]" -map 3:a -c:v libx264 -preset medium -tune zerolatency -b:v 5000k -maxrate 5000k -bufsize 10000k -r 15 -c:a aac -ac 2 -f flv rtmp://a.rtmp.youtube.com/live2/
不相关的更改:
- 已删除
-video_size 1920x1080
,因为它通常是某些多路分解器的输入选项,因此被忽略。 - 删除了
-q:v 3
因为 libx264 忽略了-q:v
。请改用-crf
或-b:v
。 - 删除了
-crf 15
,因为它与-b:v
互斥。这意味着您一次只能使用一个。如果您同时使用两者,那么其中一个将被忽略。对于流式传输,除非您知道自己在做什么,否则您应该使用-b:v
而不是-crf
。 - 已删除
-level 3.0
。级别 3.0 对于 1920x1080 来说太低了(libx264 会在日志输出中通过“级别限制”警告告诉您这一点)。反正你应该不需要限制水平。 - 已删除
-profile:v baseline
。无需定位 2008 年以后的设备。 - 添加了格式过滤器
format=yuv420p
,因此对于色度子采样,输出始终为 YUV 4:2:0。 - 添加了
-bufsize
和-maxrate
以启用 VBV,强烈推荐用于流式传输。