所以这是我的“工作” 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
.对于 1920x1080,级别 3.0 太低(libx264 会在日志输出中通过“级别限制”警告告诉您这一点)。无论如何,您不需要限制级别。 -profile:v baseline
.无需针对 2008 年以来的设备。format=yuv420p
因此对于色度二次采样,输出始终为 YUV 4:2:0。 -bufsize
和 -maxrate
启用强烈推荐用于流式传输的 VBV。 关于FFMPEG:2x2 网格相机流到 Youtube,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66983033/