如何在tvOS中向AVPlayer添加外部WebVTT文件?
我一直在关注this "What's New in HTTP Live Streaming" by Apple,在那里他们讨论了实施外部WebVTT文件的不同方法。
整个字幕域对我来说都很新鲜,所以我很难很好地掌握这个概念。在视频中,他们谈论了许多我不太了解的不同内容,例如(字幕播放列表)。然而,通过所有我主要关心的是将.vtt文件添加到我的AVPlayer。
在视频中他们谈到了AVMediaSelectionGroup()
,但我对如何使用以及如何使用AVPlayerViewController
实现此问题感到困惑:
class PlayerViewController: AVPlayerViewController {
override func viewDidLoad() {
self.setupVideoPlayerView()
}
private func setupVideoPlayerView()
{
let path = "https://link.to.my.video.mp4"
let subTitlePath = "https://link.to.my.webvtt.file.vtt"
let nsURL = URL(string: path)
let avPlayer = AVPlayer(url: nsURL!)
self.player = avPlayer
self.player!.seek(to: kCMTimeZero)
self.player!.play()
}
}
AVMediaSelectionGroup
似乎没有任何方法可以添加字幕?我能找到的最接近的东西(提到的字幕)是以下方法:
//Where self is the instance of AVPlayerViewController
self.allowedSubtitleOptionLanguages
self.requiresFullSubtitles
答案 0 :(得分:1)
虽然在苹果文档中几乎没有提及,但我在一篇文章中读到需要在<input />
中嵌入字幕。
不打算手动添加字幕..虽然我确实找到了一个显示黑客的StackOverflow帖子。不确定它是否有效。
看到我使用VIMEO Pro,提供的HLS流包含嵌入的WebVTT字幕(我上传到vimeo),从而解决了我的问题。
答案 1 :(得分:0)
这对我有用。……
let localVideoAsset = AVURLAsset(url: URL(string: url) ?? URL(string:"")!)
let videoPlusSubtitles = AVMutableComposition()
let videoTrack = videoPlusSubtitles.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
do{
guard localVideoAsset.tracks.count > 0 else{
// error msg
return
}
try? videoTrack?.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: localVideoAsset.duration),
of: localVideoAsset.tracks(withMediaType: .video)[0],
at: CMTime.zero)
}
let subtitleURL = URL(fileURLWithPath: model.data?[self.selected].subtitlePath ?? "")
let subtitleAsset = AVURLAsset(url: subtitleURL)
let subtitleTrack = videoPlusSubtitles.addMutableTrack(withMediaType: .text, preferredTrackID: kCMPersistentTrackID_Invalid)
do{
guard subtitleAsset.tracks.count > 0 else{
//error msg
return
}
try? subtitleTrack?.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: localVideoAsset.duration),
of: subtitleAsset.tracks(withMediaType: .text)[0],
at: CMTime.zero)
}
let playerViewController = AVPlayerViewController()
let player = AVPlayer(playerItem: AVPlayerItem(asset: videoPlusSubtitles))
playerViewController?.player = player
self.present(playerViewController ?? UIViewController(), animated: true) {
self.videoPlaying = true
self.playerViewController?.player?.play()
}
}
答案 2 :(得分:-1)
好的,我想我解决了这个问题。我一直在寻找一些解决方案,但没有找到,所以我实施了一个解决方案。 我提供了一个带有解决方案的 SPM,它使用起来非常简单。所以我称之为SimpleSubtitles。 它确实支持 WebVTT,没有样式,并且可以改进以支持其他格式