无法从AVURLAsset获取AVPlayer的HLS视频(.m3u8格式)的视频轨道? [英] Can't able to get Video Tracks from AVURLAsset for HLS videos(.m3u8 format) for AVPlayer?

查看:78
本文介绍了无法从AVURLAsset获取AVPlayer的HLS视频(.m3u8格式)的视频轨道?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个自定义视频播放器,以从服务器流式传输HLS视频.我可以使用AVPlayerItem和AVPlayer成功播放HLS视频.

I am developing a custom video player to stream HLS videos from server. I can successfully play HLS videos using AVPlayerItem and AVPlayer.

之后,我想为视频播放器添加字幕轨道和音频轨道.因此,我使用了AVMutableComposition来做到这一点.所以现在的问题是,当我为HLS视频创建AVURLAsset时,我无法从AVURLAsset获取视频轨道.它总是给我0首曲目.我尝试了AVURLAsset的"loadValuesAsynchronously",并尝试为AVPlayerItem的轨道"添加KVO.但是这些都没有给我带来任何积极的结果.

After that I want to add subtitle track and audio tracks for my video player. So I used AVMutableComposition to do so. So now the issue is when I am creating AVURLAsset for HLS Videos, I can't able to get video tracks from AVURLAsset. It is giving me always 0 tracks. I tried "loadValuesAsynchronously" of AVURLAsset and I tried adding KVO for "tracks" of AVPlayerItem. But None of these producing me any positive result.

我正在使用以下代码.

  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).有人对此有一些可行的解决方案吗?

This procedure working well for .mp4 videos but not for HLS Videos(.m3u8). Anyone have some working solution for this?

我们如何使用AVURLAsset从HLS视频中获取曲目?如果这不可能,那么如何才能达到类似的结果?

How can we get tracks from HLS videos using AVURLAsset? If this is not possible then How can achieve similar result ?

请让我知道您的反馈意见.

Please let me know you feedback.

非常感谢.

推荐答案

对于HLS视频, tracks(withMediaType:.video)将返回一个空数组.

For HLS video tracks(withMediaType: .video) will return an empty array.

改为使用此代码: player.currentItem.presentationSize.width player.currentItem.presentationSize.height .

请让我知道它是否有效.

Pls let me know if it works.

这篇关于无法从AVURLAsset获取AVPlayer的HLS视频(.m3u8格式)的视频轨道?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆