Всем привет! Необходимо разработать приложение, которое воспроизводит видео.
Видео лежит на удаленном сервере и его можно получить по ссылке.
Такая задача легко решается с помощью кода:
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 девайсы.