我有一个将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
]);
编辑:只要套接字接收到数据,输入就会通过stdin输入。
在我完全没有受过教育的观点中,“-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和速度下降,流回到“状态:不正确” < / p>