ffmpeg在录制时即时切换输入映射。

问题描述 投票:0回答:1

我有一个rtsp视频源 stream1 和一个音频源,我目前合并并发送至rtmp服务器使用。

stream1="rtsp://streamurl1"

/usr/bin/ffmpeg                    \
    [...]
    -i "$stream1"                  \
    [...]
    -itsoffset $AUDIOVIDEOOFFSET   \
    -f pulse                       \
    -i default                     \
    [...]
    -vcodec copy                   \
    -map 0:v -map 1:a              \
    [...]
    -f flv "rtmp://streamingserver"

现在我想添加第二个视频源: stream2 辗转 stream1stream2 在不中断音频的情况下来回传输。两个流是相同的来自相同的相机。

有什么合理的方法来做到这一点与 ffmpeg? 或者你建议怎么做?

只需停止进程,然后重新启动它,用 stream2 而不是 stream1 工作,但会导致流媒体上几秒钟的中断,是目前最糟糕的情况,我想改善。

ffmpeg streaming on-the-fly
1个回答
0
投票

我无法让它与纯的 ffmpeg 在合理的时间内,但 nginx-rtmp 模块的工作原理是开箱即用。

它基本上是 apt install libnginx-mod-rtmp nginx,在nginx.conf中添加....

rtmp {
        server {
                listen 1935;
                chunk_size 4096;

                application live {
                        live on;
                        record off;
                        # Only localhost is allowed to publish
                        allow publish 127.0.0.1;
                        deny publish all;
                }
        }
}

...到nginx.conf。systemctl restart nginxnginx 作为本地环回设备,在 rtmp://localhost/live.

如果你现在有 n 流的复用,您可以创建 n 系统服务 camera_i.service

[Unit]
Description=Send stream i to local nginx loopback device
# List all other
Conflicts=camera_1.service, camera_2.service, [...]

[Service]
ExecStart=/usr/bin/ffmpeg -i rtsp://mystreamurl_i -c copy -f flv rtmp://localhost/live
Type=simple
Restart=on-failure
KillSignal=SIGINT
SuccessExitStatus=255

[Install]
WantedBy=xsession.target

并切换到流 i 开始 camera_i.service:

systemctl --user start camera_i.service

所有其他服务 Conflicts= 选项自动终止,从而有效地将摄像机流复用。

然后,产生的流可以使用类似下面的记录器使用。

/usr/bin/ffmpeg                    \
    [...]
    -use_wallclock_as_timestamps 1 \
    -fflags +genpts                \
    -i "rtmp://localhost/live"     \
    [...]
    -itsoffset $AUDIOVIDEOOFFSET   \
    -f pulse                       \
    -i default                     \
    [...]
    -vcodec copy                   \
    -map 0:v -map 1:a              \
    [...]
    OUTPUT

结果是一个相当流畅的翻转和连续的音频.

-use_wallclock_as_timestamps 1 -fflags +genpts 如果你不使用这个选项,可能就不需要了。-vsync 0. 但我还没有测试过。


附录

如同在ffmpeg邮件列表中所提议的那样,有一个叫做 zmq 过滤器,据说可以改变过滤器的设置,在飞行.这个想法是覆盖两个流和切换的不透明度的顶部流,有效地切换流。

我不能让它工作,但任何人都可以尝试。

# compiled with --enable-libzmq
ffmpeg -i INPUT -filter_complex 'null[main];movie=INPUT2,zmq,lumakey@toggle=tolerance=1,[main]overlay,realtime' OUTPUT
echo lumakey@toggle tolerance 0 | zmqsend

{fnTahomafs10bord0shad01cH00FFFF}Where... zmqsend 结果来自:

git clone https://github.com/FFmpeg/FFmpeg
cd FFmpeg/
./configure
cd tools/
gcc zmqsend.c -o zmqsend -I.. `pkg-config --libs --cflags libzmq libavutil`
© www.soinside.com 2019 - 2024. All rights reserved.