Ios Swift Mjpeg流媒体仅显示单帧
我正在尝试创建一个Mjepg流。我遵循了一个教程,没有太多的代码来引导流,但我不明白为什么它对我不起作用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,
//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)
}
}