Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift Mjpeg流媒体仅显示单帧_Ios_Swift_Video Streaming_Mjpeg - Fatal编程技术网

Ios Swift Mjpeg流媒体仅显示单帧

Ios Swift Mjpeg流媒体仅显示单帧,ios,swift,video-streaming,mjpeg,Ios,Swift,Video Streaming,Mjpeg,我正在尝试创建一个Mjepg流。我遵循了一个教程,没有太多的代码来引导流,但我不明白为什么它对我不起作用 //Class properties private var mjpegSession : URLSession? private var mjpegData:Data = Data() override func viewDidLoad(){ ... mjpegSession = URLSession(configuration: .default, delegate: self,

我正在尝试创建一个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, dataTask: URLSessionDataTask, 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, dataTask: URLSessionDataTask, 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)
    }
 }