FFmpeg:1 个输入流,2 个具有不同属性的输出流

FFmpeg: 1 input stream, 2 output streams with different properties

我正在使用 ffmepg 通过 RTSP 从网络摄像头流式传输到我的服务器。

此流以仅 2fps 的高分辨率 (2560 x 1980) 输入。

我想创建两个 hls 流:

  1. 使用 h264 编码和 0.5fps 的 800x600 分辨率
  2. 裁剪部分输入流并将其转换为 h264 以及 0.5fps

所以基本上我想要流的一个输出以降低的 fps 和分辨率,其次输出只显示原始流的特写部分。

我正在使用以下命令:

 sudo ffmpeg \
-fflags nobuffer \
-rtsp_transport tcp \
-i 'rtsp://XXXXXX' \
-timeout 6000000 \
-r 0.5 \
-copyts \
-an \
-hls_flags delete_segments+append_list \
-filter_complex "[0:v]split=2[in1][in2];[in2]crop=640:360:800:600[out2]" \
-map "[in1]" \
-s:v 800x600 -c:v libx264 -preset slower -g 0.5 -sc_threshold 0 \
-f segment \
-segment_list_flags live \
-segment_time 3 \
-segment_list_size 3 \
-segment_format mpegts \
-segment_list_type m3u8 \
-segment_list_entry_prefix /stream/ \
-segment_list /var/www/website/statisch/stream/index_s1.m3u8 \
/var/www/website/statisch/stream/s1_%d.ts \
-map "[out2]" \
-f segment \
-segment_list_flags live \
-segment_time 3 \
-segment_list_size 3 \
-segment_format mpegts \
-segment_list_type m3u8 \
-segment_list_entry_prefix /stream/ \
-segment_list /var/www/website/statisch/stream/index_s2.m3u8 \
/var/www/website/statisch/stream/s2_%d.ts

我的问题是:当我从

切换
-map "[out2]" \
-f segment \

-map "[out2]" \
-c:v libx264 -preset slower -g 0.5 -sc_threshold 0 \
-f segment \

我希望 第二个输出 将以 0.5fps 的指定尺寸显示。

对于第一个输出,我得到:

Stream #0:0: Video: h264 (libx264), yuv420p, 800x600, q=-1--1, 0.50 fps, 90k tbn, 0.50 tbc

这很好。但是对于 第二个输出 我得到:

Stream #1:0: Video: h264 (libx264), yuv420p, 640x360, q=-1--1, 90k fps, 90k tbn, 90k tbc
Frame rate very high for a muxer not efficiently supporting it.
More than 1000 frames duplicated

所以似乎转换没有正确完成,或者我的状态没有像我期望的那样被解析。我一直在寻找解决方案...

同样检查这里并没有给我带来解决方案: https://trac.ffmpeg.org/wiki/Creating%20multiple%20outputs

有什么想法吗?

顺便说一句:知道如何写得更好吗?

每个输出应用输出选项。

来自Official Documentation

As a general rule, options are applied to the next specified file. Therefore, order is important, and you can have the same option on the command line multiple times. Each occurrence is then applied to the next input or output file. Exceptions from this rule are the global options (e.g. verbosity level), which should be specified first.

因此,第一个 -r(和 -an)仅适用于第一个输出。您需要为每个输出重复所有常用选项 url.