wtf_object
@wtf_object

Как воспроизвести видео из буффера в AVPlayer на macOS?

Всем привет! Необходимо разработать приложение, которое воспроизводит видео.
Видео лежит на удаленном сервере и его можно получить по ссылке.
Такая задача легко решается с помощью кода:
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        let player = AVPlayer(url: videoURL!)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = self.view.bounds
        playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
        self.view.layer?.addSublayer(playerLayer)
        player.play()


Беда в том, что иногда видео отдаётся битым и необходимо занулять первые два байта, чтобы видео можно было воспроизвести. (В примере выше видео всегда отдаётся стабильное).
Чтобы занулить два байта нужно иметь на руках буфер, а затем прокинуть его в плеер.
Я загружаю файл в память и затем пробую инициализировать avplayer, но ничего не происходит. (без какого-либо воздействия на буфер)
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        let urlRequest = URLRequest(url: videoURL!)
        urlSession.dataTask(with: urlRequest) { (data, _, error) in
            print("got mp4 file")
            let movie = AVMovie(data: data!, options: nil)
            let item = AVPlayerItem(asset: movie)
            let player = AVPlayer(playerItem: item)
            let playerLayer = AVPlayerLayer(player: player)
            playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
            DispatchQueue.main.async {
                playerLayer.frame = self.view.bounds
                self.view.layer?.addSublayer(playerLayer)
                player.play()
            }
        }.resume()


Было подозрение на добавление view не из main потока. Я добавил конструкцию DispatchQueue.main.async, но все равно ничего не происходит.
Перерыв интернет проскачила мысль указать, что видео воспроизводится из буфера. Но никаких флагов не нашел.
Что же я делаю не так?

macOS sierra, приложение будет запускаться на маке, не iOS девайсы.
  • Вопрос задан
  • 289 просмотров
Пригласить эксперта
Ответы на вопрос 1
doublench21
@doublench21 Куратор тега Swift
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        let urlRequest = URLRequest(url: videoURL!)
        urlSession.dataTask(with: urlRequest) { (data, _, error) in
            var data = data
            data.resetBytes(in: data.startIndex...data.index(after: data.startIndex))
            print("got mp4 file")
            let movie = AVMovie(data: data!, options: nil)
            let item = AVPlayerItem(asset: movie)
            let player = AVPlayer(playerItem: item)
            let playerLayer = AVPlayerLayer(player: player)
            playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
            DispatchQueue.main.async {
                playerLayer.frame = self.view.bounds
                self.view.layer?.addSublayer(playerLayer)
                player.play()
            }
        }.resume()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы