2016-01-27 63 views
1

我目前正在开发一个应用程序,它可以在浏览器中(在HTML5视频元素中)从不同来源(主要是IP摄像机)可视化图像。 UI将允许矩阵视图,因此通常会同时显示16个或更多相机。 从相机我得到MJPEG流或JPEG图像(我“转换”为MJPEG流)。所以,对于相机,我有一个MJPEG流,我将它设置为ffmpeg的输入。我指导的ffmpeg将其转换为MP4 & H.264,揭露输出作为TCP流,就像这样:使用ffmpeg进行自适应压缩

的ffmpeg -f MJPEG -i “http://localhost/video.mjpg” -f MP4 -vcodec libx264“TCP://127.0 .0.1:5001?听“

这工作得很好localhost,我得到的流显示在网页上,质量最好。

但是这必须在各种网络条件下工作。我使用了chrome throttling设置,并且注意到如果网络速度稍微低于所需速度(由我在ffmpeg中使用的当前压缩设置给出),则事情开始出错:从流开始被延迟(因此,不再是直播视频流),直到完成浏览器中“实时”图像的冻结。

我需要的是与当前网络速度相关的“自适应”方式来执行压缩。

我的问题是:

  • 是FFmpeg的能处理这个问题,以适应网络条件 - 自动降低压缩质量当速度低;所以在浏览器中的图像将质量较低,但生活(这对我来说是最重要的)

  • 如果不是,有没有办法解决这个问题?

  • 有没有办法检测网络瓶颈? (然后重新启动的ffmpeg用较低的压缩参数;这不是一个动态自适应流,但是有总比没有好)

预先感谢您!

+1

得到一个现场自适应流,你将不得不打包成HLS或DASH。用ffmpeg我知道你可以为VOD做,但不能实时多比特率。这将允许浏览器处理比特率适应。混乱的解决方案是让ffmpeg作业运行以产生不同的比特率,并且如果您看到HTML5视频元素缓冲区事件触发步骤降低到较低比特率源(不是非常流畅的体验) – Offbeatmammal

回答

0

您的解决方案不适用于本地网络。为什么?因为你必须使用HTTP。为此,最好的解决方案是使用HLS或DASH。

HLS

ffmpeg -i input.mp4 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls index.m3u8 

要生成自适应流,你必须创建一个二级指标。这里我就不解释becaouse它是在苹果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不支持短跑编码的时刻。您可以使用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"