使用FFmpeg转码扩展nginx-rtmp直播流

3
我目前使用广泛的nginx-rtmp库搭建了功能完备的直播流设置,并使用ffmpeg为我的流提供各种分辨率。唯一的问题是,只有2个输出的ffmpeg会占用大约50%的CPU。我希望能够支持最多20个同时直播的用户 - 根据当前需求,这意味着我需要10倍于我目前拥有的CPU计算能力!如何在nginx-rtmpffmpeg的基础上扩展我的转码设置?
rtmp {
server {
    listen 1935;

    application src {
        live on;
        exec_push ffmpeg -i rtmp://localhost/src/$name
            -c:v copy -preset:v ultrafast -b:v 512K -c:a copy -tune zerolatency -f flv rtmp://localhost/hls/$name_hi
            -c:v libx264 -preset:v ultrafast -s 852x480 -b:v 128K -c:a copy -tune zerolatency -f flv rtmp://localhost/hls/$name_low;

            # -c:v libx264 -s 852x480 -b:v 128K -c:a copy -tune zerolatency -f flv rtmp://localhost/hls/$name_low;
            # -c:v libx264 -s 1280x720 -b:v 256k -c:a copy -tune zerolatency -f flv rtmp://localhost/hls/$name_mid;
    }

    application hls {
        live on;
        hls on;
        hls_path /tmp/hls;

        # hls_fragment 1s;
        # hls_playlist_length 4s;
        hls_fragment 4s;
        hls_playlist_length 12s;
        hls_nested on;
        hls_variant _low BANDWIDTH=160000;
        # hls_variant _mid BANDWIDTH=320000;
        hls_variant _hi  BANDWIDTH=640000;
    }
}

}


你最终是如何解决这个问题的?也就是说,你最终使用了什么解决方案。 - Uchit Kumar
2个回答

1

如果没有牺牲质量的话是不可能的。如果有这种方法,ffmpeg就会默认启用它。您最好的选择是添加一个或两个硬件编码器,比如带有nvenc的Nvidia卡(确保您获得无限流的昂贵版本,大多数版本仅限于两个)。


谢谢您的回复 - 云解决方案怎么样?我在考虑使用ECS + Fargate来根据需求扩展我的转码任务...... 不过我不确定实践中会是什么样子。 - hoodsy
如果你选择这条路线,只需使用像mux.com或Zencoder这样的服务。 - szatmary
我担心使用服务对我来说会变得太昂贵...虽然在AWS上使用自动扩展,成本也很容易失控。 - hoodsy
1
我更关注在一个非常流动的市场中开发和维护一个视频系统,这个市场有非常复杂的工作流程。 - szatmary
这是一个很好的观点。我想不使用服务的另一个好处就是能够将我的视频服务与我的应用程序集成。例如,在直播后创建VOD时,能够将该VOD的URL存储在我的应用程序数据库中。 - hoodsy

0

我们经过时间考验的生产系统具有成本效益 -

使用Linode(或任何其他云VPS)-在我们的情况下,一个带有60fps多播的全高清流媒体到YouTube / FB的成本约为2-3美元,对于一台16GB RAM专用服务器和320GB SSD。

从OBS /硬件编码器发送到此RTMP服务器...

使用Linode StackScript,我们可以自动配置和提供RTMP服务器...

因此,这是一种便宜的即用即丢服务器...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接