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,强烈推荐用于流式传输。