我目前正在开发一个应用程序,可以在浏览器中(在HTML5视频元素中)可视化来自不同来源(主要是IP摄像机)的图像。 UI将允许矩阵视图,因此通常会同时显示16个或更多相机。 从相机我得到MJPEG流或JPEG图像(我"转换"到MJPEG流)。因此,对于相机,我有一个MJPEG流,我将其设置为ffmpeg的输入。我指示ffmpeg将其转换为MP4& H.264,并将输出公开为tcp流,如下所示:
ffmpeg -f mjpeg -i" http://localhost/video.mjpg" -f mp4 -vcodec libx264" tcp://127.0.0.1:5001?listen"
这在localhost上运行得很好,我得到了网页中显示的流,质量最好。
但这必须适用于各种网络条件。我玩了一些Chrome限制设置,并注意到如果网络速度略低于所需的速度(由我在ffmpeg中使用的当前压缩设置给出),事情就会出现问题:从流开始被延迟(所以,不再是现场直播),直到完全冻结' live'浏览器中的图像。
我需要的是一个"自适应"与当前网络速度相关的压缩方式。
我的问题是:
能够处理这种情况,以适应网络条件 - 在速度较低时自动降低压缩质量;所以浏览器中的图像质量较差,但是直播(在我的情况下这是最重要的)
如果没有,有没有办法解决这个问题?
有没有办法检测网络瓶颈? (然后用较低的压缩参数重新启动ffmpeg;这不是动态自适应流,但总比没有好)
提前谢谢!
答案 0 :(得分:1)
您的解决方案无法在本地网络外运行。为什么?因为你必须使用HTTP。为此,最好的解决方案是使用HLS或DASH。
<强> HLS 强>
ffmpeg -i input.mp4 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls index.m3u8
要生成自适应流,您必须创建第二级索引。我在这里不解释因为Apple doumentation中很明显:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008332-CH1-SW1
并在标准中:https://tools.ietf.org/html/draft-pantos-http-live-streaming-18
<强> DASH 强>
目前FFMPEG不支持Dash编码。您可以使用FFMPEG([https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment][1])进行分段,但我建议将FFMPEG和MP4Box结合使用。 FFMPEG将您的实时视频和MP4Box转码为细分并创建索引.mpd。
MP4Box是GPAC的一部分([http://gpac.wp.mines-telecom.fr/][2])
一个例子可以是(使用h264) - 如果你需要vp8(webm,使用-vcodec libvpx和-f webm或-f ts):
ffmpeg -threads 4 -f v4l2 -i /dev/video0 -acodec libfaac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -r 30 -s 1280x720 -f mp4 -y "$movie" > temp1.mp4 && MP4Box -dash 10000 -frag 1000 -rap "$movie"