我正在尝试从Icecast / Shoutcast服务器到YouTube在线直播。我使用的命令是:
<html>
<head>
<script>
var data = [{id:12,user:'jack',email:'jack@zzz.com'},
{id:14,user:'dan',email:'dan@zzz.com'}]
function populate_table() {
let table = document.getElementById('demo_table');
for(var i = 0; i < data.length; i++) {
let row = table.insertRow(-1);
let cell = row.insertCell(0);
let text = document.createTextNode(data[i].email);
cell.appendChild(text);
cell = row.insertCell(0);
text = document.createTextNode(data[i].user);
cell.appendChild(text);
cell = row.insertCell(0)
text = document.createTextNode(data[i].id);
cell.appendChild(text);
}
}
</script>
</head>
<button onclick="populate_table()">Populate table</button>
<table id="demo_table">
<thead>
<tr>
<th>id</th>
<th>username</th>
<th>email</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</html>
如您所见,我正在为YouTube使用建议的比特率,请每2秒插入关键帧,并以每秒30帧的速度进行流传输。 流正在运行,但运行一段时间后,发生了两件事:
ffmpeg -v verbose -framerate 30 -loop 1 -i /var/image.jpg -re -i http://127.0.0.1:4700/radio -c:v libx264 -preset ultrafast -b:v 2250k -maxrate 6000k -bufsize 6000k -c:a copy -ab 128k -s 1920x1080 -framerate 30 -g 60 -keyint_min 60 -f flv rtmp://a.rtmp.youtube.com/live2/xxx
从1x下降到speed
为什么会这样? CPU负载正常,连接正常(流正在1Gg / s专用服务器上运行)。
由于在上面的示例中,我正在流传输单个图像作为流的徽标,所以我还尝试使用该图像生成一个短短30秒的视频,并播放该视频而不是图像,但这也没有帮助。
我用于转换的命令:
0.998x
并通过
进行广播ffmpeg -framerate 30 -loop 1 -i /var/image.jpg -c:v libx264 -preset ultrafast -tune stillimage -b:v 2250k -minrate 2250k -maxrate 6000k -bufsize 6000k -framerate 30 -g 60 -keyint_min 60 -t 30 out4.mp4
ffmpeg版本为ffmpeg -stream_loop -1 -i out4.mp4 -re -i http://127.0.0.1:4700/radio -c:v copy -c:a copy -framerate 30 -g 60 -keyint_min 60 -f flv rtmp://a.rtmp.youtube.com/live2/xxx
答案 0 :(得分:1)
您确定原始视频流确实与壁钟同步吗?
取决于它的编码方式,它可能会严重偏斜。最终导致缓冲不足(如果速度过快,则超出极限),并导致玩家抱怨/跳过。
您可以尝试将价值几个小时的流转储到文件中,然后使用FFmpeg进行流传输吗?如果这样有效,则表明您的原始流计时(采样率)已关闭。
正确设置采样率是专业/昂贵声卡使用高精度Quartz-Crystal控制振荡器的原因。纯粹的虚拟处理(例如文件被编码为流)很容易产生偏差,尤其是在虚拟机内部。此外,就频率准确性和稳定性而言,便宜的USB声卡通常是最糟糕的选择。
FFmpeg可以选择处理速度太慢的输入。关键字可以是“填充”或“缺少样本”。
答案 1 :(得分:0)
Youtube上的错误消息:“ ... buffer .....”不是PC上的缓冲区问题,只是发送到youtube的数据太小了。
1)请注意,[-preset ultrafast]
和[-preset fast]
并没有太大的区别。
2)将您的ffmpeg命令更改为广播一号。 (例如[-b:v 2250k]
至[-b:v 15000k]
,并将fps设置为12→[-r 12]
选项。
我会的。
ffmpeg -stream_loop -1 -i out4.mp4 -re -i http://127.0.0.1:4700/radio -preset fast -r 12 -framerate 30 -g 60 -video_track_timescale 1000 -b:v 15000k -f flv rtmp://a.rtmp.youtube.com/live2/xxx
我希望这对你有好处!(^ v ^)Y