воспроизведение видео с использованием изображений в iOS

#ios #swift #uiimageview #alamofire

Вопрос:

Моя цель-показать видеопоток в моем приложении для iOS.

*Сервер постоянно отправляет данные — если я открою ссылку, которую я даю приложению в chrome, мы увидим видеопоток

Я получаю данные из api сервера, который находится в форме «данные»

Я преобразую данные в UIImage(данные: myData), ИНАЧЕ говоря, преобразую данные в изображение

Затем я отображаю изображение в своем представлении изображения, поэтому self.ImageView.image = Новое изображение

вызовите таймер, чтобы повторить действие, иначе говоря, обновить изображение до нового с новыми данными

тип данных сервера = изображение/mjpg

Однако есть несколько проблем:

-Энергетическое воздействие очень велико, телефон нагревается и отсасывает батарею

-Я не уверен, правильно ли это делать или нет

У меня есть 2 подхода, первый-использование AlamofireImage, который работает на 100% с помощью таймеров. Второй не работает как таковой, он работает только немного через обычный запрос потока Alamofire, и это без таймеров.

Первый Подход

var GameTimer: Таймер? переопределить функцию viewDidLoad() { super.viewDidLoad() GameTimer = Таймер.Запланированное время(интервал времени: 1/2, цель: сам, селектор: #селектор(xyz), информация пользователя: ноль, повторы: истина) GameTimer?.допуск = 0,5 }

@objc функция xyz(){ AF.запрос(«http://myVideoApi.org», метод:. get) .аутентификация(имя пользователя: «администратор», пароль: «1234») .Изображение ответа { [сам] ответ в отладочной печати(ответ)

     print(response.request)
    print(response.response)
    debugPrint(response.result)

    if case .success(let image) = response.result {
        print("image downloaded: (image)")
        self.img.image = image
       
    }
}
 

}
мы можем изменить частоту кадров в секунду/как быстро она обновляется с интервалом времени, я сохраняю ее на уровне 1/30 по большей части в течение 30 кадров в секунду

SecondApproach

     AF.streamRequest("http://myVideoApi.org",
    method: .get)
    .authenticate(username: "admin", password: "1234")
    .responseStream { [weak self] stream in
    switch stream.event {
    case let .stream(result):
        switch result {
        case let .success(data):

            var myIMG = UIImage()
            let group = DispatchGroup()

            DispatchQueue.main.asyncAfter(deadline: .now()   1){
               group.enter()
               //async operation 1
               DispatchQueue.global(qos: .default).async {
                   // Network calls or some other async task
                   print(data)
                print("first")
                   group.leave()
               }


               group.enter()
               //async operation 2
               DispatchQueue.global(qos: .default).async {
                   // Network calls or some other async task
                if let x = UIImage(data: data){
                    myIMG = x
                }
                   group.leave()
                print("second")
               }


            group.wait()

            self?.img.image = myIMG
            print("third")
            }}
    case let .complete(completion):
        print(completion)
        print("hello")

    }
}
 

This approach gives me a constant feed with data, so in the debug console, it keeps spiting out the bytes its getting so 1823, 1498 etc and so on. ON the phone or sim, only 25% of the image gets loaded at the top and the rest is grey, but it does refresh as I can see the pixels moving and changing.

The error I get is, image could not be downloaded completed and was tried to set. Which makes sense since the rest of it is grey AKA not finished and I’m trying to set it. I tried doing it via dispatch que above but that doesn’t yield any different result than simply just converting data to image and then setting img.image = image.

Он продолжает загружаться без таймеров, и влияние на это ниже, но решение наполовину испечено.

Мой вопрос в том, как мне это исправить:

Как мы можем исправить подход 1 без таймеров, чтобы он работал/потреблял меньше энергии, Как мы можем дождаться его полной загрузки, а затем установить? поскольку энергетическое воздействие ниже, я считаю, что это может быть лучшим способом показать ленту или есть какой-то третий лучший вариант, чем эти два? Я новичок, и любая помощь была бы очень признательна