【问题标题】:Swift Mjpeg Streaming Only Showing Single FrameSwift Mjpeg 流仅显示单帧
【发布时间】:2021-04-13 11:15:26
【问题描述】:

我正在尝试创建 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 是有效流。感谢大家的时间。

【问题讨论】:

    标签: ios swift video-streaming mjpeg


    【解决方案1】:

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

    //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)
        }
     }
    

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      相关资源
      最近更新 更多