首页 > 解决方案 > ffmpeg 流被 youtube 拒绝,因为它太慢了

问题描述

我有一个应用程序将 WebM 视频发送到我服务器中的套接字,然后套接字执行 ffmpeg 将视频转换为 flv 并将其发送到 youtube rtmp ingester。

事情是,youtube拒绝流,说广播状态不正确,不管我做什么。

在我的天真中,我最初尝试流式传输 1080p 和 720p,但失败了,所以我放弃了,假设这可能有助于我解决比特率问题......它没有。

Youtube 给我的错误是西班牙语,但它基本上说流太慢,我应该降低分辨率或比特率(我已经是 @ 240p 并且它不工作)。

编辑:这是错误,翻译:

主要广播:YouTube 没有收到足够的视频来保证流畅的广播。会发生缓冲。

主广播:我们没有以足够快的速度接收视频数据。您的观众可能会遇到缓冲。确保您的连接速度足够快,或者考虑使用较低的比特率。

到目前为止,这是我对 ffmpeg 的调用(如果重要的话,语言是 node.js。):

const ffmpeg = child_process.spawn('ffmpeg', [

    '-f', 'lavfi', '-i', 'anullsrc',

    //    '-re', // I was told i shouldnt use this parameter. i dont know, honestly.



    // FFmpeg will read input video from STDIN
    '-i', '-',

    // Because we're using a generated audio source which never ends,
    // specify that we'll stop at end of other input.  Remove this line if you
    // send audio from the browser.
    '-shortest',

    '-vcodec', 'libx264',

    '-acodec', 'aac',

    //ffmpeg
    //-re -loop 1
    //-framerate 2 -i test1.jpg -i https://xxxxxxxxxxx:8443/live.ogg
    //-c:a aac
    //-s 2560x1440
    //-ab 128k -vcodec libx264 -pix_fmt yuv420p -maxrate 2048k -bufsize 2048k
    //'-framerate', '30',
    '-r', '24',
    //'-s', '2560x1440',


    '-force_key_frames','expr:gte(t\,n_forced/2)',

    '-preset', 'ultrafast',
    '-pix_fmt', 'yuv420p',
    '-s', '426x240',
    '-crf', '23',
    '-bf', '2',
    '-q:a', '1',
    '-ac', '2',
    '-ar','48000',
    '-use_editlist','0',
    '-movflags','+faststart',
    //  '-ab', '128k',
    '-g', '48',

    //'-minrate', '1500k',
    '-minrate', '1000k',
    '-maxrate', '2000k',

    '-bufsize', '2000k',/*
    '-g', '30',*/
    //'-keyint_min', '30',
    //'-t', '30',

    ////
    '-deadline', 'realtime',
    '-cpu-used','-16',

    '-tune', 'zerolatency',

    '-threads', '4',

    //-g 2 -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/xxxxxxxxxxxxx


    // FLV is the container format used in conjunction with RTMP
    '-f', 'flv',



    // The output RTMP URL.
    // For debugging, you could set this to a filename like 'test.flv', and play
    // the resulting file with VLC.  Please also read the security considerations
    // later on in this tutorial.
    rtmpUrl
]);

编辑:只要套接字接收到数据,输入就会通过标准输入提供。

在我完全没有受过教育的意见中,“-deadline realtime”和“-tune zerolatency”部分似乎有所帮助,但不足以让我流连忘返。

这是ffmpeg的一些输出:

FFmpeg STDERR: frame=   35 fps=3.1 q=23.0 size=     104kB time=00:00:08.44 bitrate= 100.4kbits/s dup=0 drop=3 speed=0.76x    
FFmpeg STDERR: frame=   35 fps=3.0 q=23.0 size=     104kB time=00:00:08.44 bitrate= 100.4kbits/s dup=0 drop=3 speed=0.726x    
FFmpeg STDERR: frame=   35 fps=2.9 q=23.0 size=     104kB time=00:00:08.44 bitrate= 100.4kbits/s dup=0 drop=3 speed=0.696x    
FFmpeg STDERR: frame=   36 fps=2.8 q=23.0 size=     109kB time=00:00:09.45 bitrate=  94.6kbits/s dup=0 drop=3 speed=0.747x    
FFmpeg STDERR: frame=   36 fps=2.7 q=23.0 size=     109kB time=00:00:09.45 bitrate=  94.6kbits/s dup=0 drop=3 speed=0.719x    
FFmpeg STDERR: frame=   38 fps=2.8 q=23.0 size=     121kB time=00:00:11.45 bitrate=  86.7kbits/s dup=0 drop=3 speed=0.839x   

这非常令人沮丧。

拜托,伙计们,任何指导都是好的。我应该最大化或最小化什么?我怎么做?老实说,我并不关心其他一切会走向地狱(例如视频冻结或有时被严重像素化)我只关心能够流式传输

提前感谢您对我有帮助的任何事情!

更新:我创建了一个具有可变比特率的新广播,我向它广播,它处于“状态:最佳”几秒钟,然后 fps 和速度下降,流回到“状态:不正确”

标签: ffmpegvideo-streamingyoutube-data-api

解决方案


推荐阅读