试图通过以下链传输视频:本地实例存储(AWS)上的H 264/MP4文件->ffmpeg->rtp->同一实例上的Janus->WebRTC回放(Chrome/mac)。即使没有任何资源看起来过载(CPU/内存/网络带宽在所涉及的任何系统上),但产生的视频还是不稳定的。我还使用了一个转身服务器,它也没有加载,带宽也很丰富。
尝试过转换编解码器,除了工作时还在工作的vp8 (有点不稳定,但非常罕见和可接受)之外,它并没有帮助,导致了如此高的CPU消耗,这实际上是不可接受的。
ffmpeg -re -stream_loop -1 -i ./short.mp4 -s 426x240 -c:v libx264 -profile:v baseline -b:v 1M -r 24 -g 60 -an -f rtp rtp://127.0.0.1:5004
由此产生的可持续发展方案是:
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 58.20.100
m=video 5004 RTP/AVP 96
b=AS:1000
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
流是用Janus API设置为
"janus" : "message",
"transaction" : 'Transaction',
"body": {
"request" : "create",
"type" : "rtp",
"id" : newId,
"name": streamId+newId,
"audio": false,
"video": true,
"description" : streamId+newId,
"videoport" : 5000+newId*4,
"videopt" : 96,
"videortpmap": "H264/90000",
"secret" : "adminpwd"
}
}
尝试了各种生物武器的选择,一点帮助都没有。将-g (GOP大小)改变为较低的值可以缩短持续时间,但更频繁。在-g 3或4时,它是可以接受的,但可容忍质量的比特率,可以预见,会变得疯狂。
预期结果:视频播放没有波澜。
我的理论是,它可以是以下之一:
发布于 2019-06-30 01:20:01
这个解决方案在显而易见的方面证明是美丽的。ffmpeg将流以RTP的形式发送给Janus,Janus将其进一步发送给观众,显然是SRTP,因为这是WebRTC,而且始终是加密的。作为加密开销,它向每个数据包添加了一组字节。在某些情况下,它意味着数据包经过MTU并丢弃--每次发生时,视频中都有一个明显的猛击。
简单地添加?pkt_size=1300到输出ffmpeg的RTP就消除了这个问题。
感谢Meetecho公司的洛伦佐·米利耶罗( Lorenzo Miniero )弄明白了这一点。
发布于 2019-06-27 06:21:56
ffmpeg优化用于输出块中的帧,而不是输出单个编码帧。muxer (在您的例子中是rtp muxer )通常在刷新到输出之前缓冲数据。因此,ffmpeg并不是针对需要或多或少逐帧输出的实时流进行优化的。然而,WebRTC确实需要实时到达的帧,所以如果帧是成批发送的,那么它可能会丢弃“迟”帧,从而导致不稳定。
但是,在ffmpeg中有一个选项,将muxer的缓冲区大小设置为0,这很好。它是:
-max_delay 0
另外,对于WebRTC,您希望禁用b帧并将SPS-PPS附加到每个关键帧:
-bf 0 +global_header -bsf:v "dump_extra=freq=keyframe"
https://stackoverflow.com/questions/56788387
复制相似问题