我有一个显示livecam的网络服务器 .
它有两种模式:
-
JPEG(在页面刷新时显示当前图像)
-
MJPEG(显示MJPEG流)
目前我正在使用JPEG模式 . 我每秒下载并显示Image 20x .
这完美无损 .
但它具有相当高的CPU使用率(在我的iPhone 6S上大约70%的200%) .
码:
if let url = NSURL(string: "http://1.1.1.181:8085/?action=snapshot") {
let request = NSURLRequest(URL: url, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData , timeoutInterval: 1)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
(response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
if data != nil {
self.imageView.image = UIImage(data: data!)
}
}
}
我的问题:
-
是否有更有效的方式从网页下载和显示图像?
-
使用MJPEG流更有效 . (如果是:您可以推荐哪个框架)?
2 回答
是的,您需要使用某种视频编解码器,因为您有视频 . 尝试发送这样的单个帧是浪费带宽和CPU . 令我印象深刻的是你从目前的设置中得到20 FPS .
MJPEG是一种视频编解码器,通过不断增强图像,与JPEG工作方式完全相同 . 更改的帧的内容将作为已有内容的增强功能进行推送,从而节省大量带宽 . MJPEG也很容易实现,因为如果你可以解码JPEG渐进式,你就可以解码MJPEG(可能还有一些小的改进) .
无论如何,目前有更好的视频编解码器可用 . 其中许多都有硬件编解码器,这意味着工作被卸载到该编解码芯片而不是由CPU直接处理 . 这就是高性能视频在硬件上运行的方式,否则无法跟上 . 根据目标平台上已存在的系统支持,确定要使用的编解码器 . 随着VP9的出现,H.264和VP8非常受欢迎 .
两者之间几乎没有差别 . 唯一的区别是,对于
M-JPEG
,流发送JPEG
的序列,而不是每个请求一个,因此您不会浪费带宽打开每帧的新连接,这种情况与图像大小相比可以忽略不计,并且由于缓冲而不是丢帧,M-JPEG可能导致低带宽连接中的图像延迟 .Motion JPEG — Encoding — Wikipedia
video surveillance on C# — CodeProject