Не удается получить видеодорожки от AVURLAsset для видео HLS (формат .m3u8) для AVPlayer? - PullRequest
0 голосов
/ 19 сентября 2018

Я разрабатываю собственный видеоплеер для потоковой передачи видео HLS с сервера.Я могу успешно воспроизводить видео HLS, используя AVPlayerItem и AVPlayer.

После этого я хочу добавить дорожку субтитров и аудиодорожки для моего видеопроигрывателя.Поэтому я использовал AVMutableComposition для этого.Так что теперь проблема заключается в том, что, когда я создаю AVURLAsset для видео HLS, я не могу получить видеодорожки от AVURLAsset.Это дает мне всегда 0 треков.Я попытался «loadValuesAsynchronously» AVURLAsset, и я попытался добавить KVO для «треков» AVPlayerItem.Но ни один из них не дал мне никакого положительного результата.

Я использую следующий код.

  func playVideo() {
    let videoAsset = AVURLAsset(url: videoURL!)
    let composition = AVMutableComposition()
    // Video
    let videoTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
    do {
        let tracks = videoAsset.tracks(withMediaType: .video)
        guard let track = tracks.first else {
            print("Can't get first video track")
            return
        }
        try videoTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: track, at: kCMTimeZero)
    } catch {
        print(error)
        return
    }
    guard let subtitlesUrl = Bundle.main.url(forResource: "en", withExtension: "vtt") else {
        print("Can't load en.vtt from bundle")
        return
    }
    //Subtitles
    let subtitleAsset = AVURLAsset(url: subtitlesUrl)
    let subtitleTrack = composition.addMutableTrack(withMediaType: .text, preferredTrackID: kCMPersistentTrackID_Invalid)
    do {
        let subTracks = subtitleAsset.tracks(withMediaType: AVMediaType.text)
        guard let subTrack = subTracks.first else {
            print("Can't get first subtitles track")
            return
        }
        try subtitleTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: subTrack, at: kCMTimeZero)
    } catch {
        print(error)
        return
    }
    // Prepare item and play it
    let item = AVPlayerItem(asset: composition)
    self.player = AVPlayer(playerItem: item)
    self.playerLayer = AVPlayerLayer.init()
    self.playerLayer.frame = self.bounds
    self.playerLayer.contentsGravity = kCAGravityResizeAspect
    self.playerLayer.player = player
    self.layer.addSublayer(self.playerLayer)
    self.player.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
    self.player.play()
}

Эта процедура хорошо работает для видео .mp4, но не для видео HLS (.m3u8).У кого-нибудь есть какое-нибудь рабочее решение для этого?

или

Как мы можем получить треки из видео HLS, используя AVURLAsset?Если это невозможно, то Как можно добиться подобного результата?

Пожалуйста, дайте мне знать ваши отзывы.

Большое спасибо заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...