微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift Mjpeg Streaming 仅显示单帧

如何解决Swift Mjpeg Streaming 仅显示单帧

我正在尝试创建 Mjepg 流。我遵循了一个教程,并没有很多代码来引导流,但我不明白为什么它对我不起作用。

//Class properties

private var mjpegSession : URLSession?
private var mjpegData:Data = Data()

override func viewDidLoad(){
...
mjpegSession =  URLSession(configuration: .default,delegate: self,delegateQueue: nil)
        if let url = URL(string: "http://cam6284208.miemasu.net/nphMotionJpeg?Resolution=640x480") {
           mjpegSession?.dataTask(with: url).resume()
        }
}

extension ViewController: URLSessionDataDelegate,URLSessionTaskDelegate {
    func urlSession(_ session: URLSession,dataTask: URLSessionDataTask,didReceive data: Data) {
        mjpegData.append(data)
    }

    func urlSession(_ session: URLSession,didReceive response: URLResponse,completionHandler: @escaping (URLSession.Responsedisposition) -> Void) {
           if mjpegData.count > 0 {
                dispatchQueue.main.async{
                    if let image = UIImage(data: self.mjpegData){
                        self.cameraimageView.image = image
                    }
                }
            }
            mjpegData.removeAll()
            

        completionHandler(.allow)
    }
 }

教程删除了行中的所有数据 mjpegData.removeAll()

但是,如果我这样做,图像将不完整,并且日志中会出现有关无法解码图像的错误。如果我删除它,我会得到一个完整的框架或图像,但我只能得到一个。在 VLC 中使用该 url 显示一个恒定的流,所以我知道该 url 是有效的流。谢谢大家的时间。

解决方法

所以我找到了一个与队列和后台线程有关的解决方案,它似乎解决了我的问题。这是其他人遇到此问题的解决方案。

//Class properties

private var mjpegSession : URLSession?
private var mjpegData:Data = Data()

override func viewDidLoad(){
...
self.queue = DispatchQueue(label: "MjpegQueue")
        self.mjpegSession =  URLSession(configuration: .default,delegate: self,delegateQueue: nil)
        if let url = URL(string: "http://cam6284208.miemasu.net/nphMotionJpeg?Resolution=640x480") {
           DispatchQueue.global().async {
                self.mjpegSession?.dataTask(with: url).resume()
            }
        }
}

extension ViewController: URLSessionDataDelegate,URLSessionTaskDelegate {
    func urlSession(_ session: URLSession,dataTask: URLSessionDataTask,didReceive data: Data) {
        mjpegData.append(data)
    }

    func urlSession(_ session: URLSession,didReceive response: URLResponse,completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
                   queue.sync{
            if mjpegData.count > 0 {
                
                let data = self.mjpegData
                if let image = UIImage(data: data){
                    DispatchQueue.main.async {
                        self.cameraImageView.image = image
                    }
                }
            }
            
            mjpegData.removeAll()
        }
        
        
        
        completionHandler(.allow)
    }
 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。