ffmpeg - 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 和速度下降,流回到“状态:不正确”
解决方案
推荐阅读
- android - GridLayout 的列跨度在 Xamarin.android 中不起作用
- java - 非阻塞套接字客户端和选择器
- php - 按品牌过滤的产品数量 - Cakephp 3
- spring-boot - No converter found capable of converting from type com.mongodb.BasicDBObject to type org.springframework.security.oauth2.provider.OAuth2Authenticatio
- python - Python Pandas - 同时通过列索引和列标题提取excel数据
- c++ - 通过父 lambda 捕获值的副本捕获 C++ lambda
- label - Amazon Mechanical Turk 中人群语义分割小部件的初始值属性出现错误标识符错误
- json - 在 IONIC 框架中使用 Angular JS 从 API 访问 JSON 数据
- windows - 如何在powershell中通过Get-WinEvent订阅事件?
- bash - 通过 ssh 在远程服务器上运行 awk 命令