如何解决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 举报,一经查实,本站将立刻删除。