无法从AVURLAsset获取AVPlayer的HLS视频(.m3u8格式)的视频轨道? [英] Can't able to get Video Tracks from AVURLAsset for HLS videos(.m3u8 format) for AVPlayer?
问题描述
我正在开发一个自定义视频播放器,以从服务器流式传输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视频,
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屋!