如何在 tvOS 中将外部 .vtt 字幕文件添加到 AVPlayerViewController
How to add external .vtt subtitle file to AVPlayerViewController in tvOS
问题:
如何在 tvOS 中将外部 WebVTT 文件添加到我的 AVPlayer?
描述:
我一直在看 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
虽然苹果文档中几乎没有提及,但我在一篇文章中读到字幕需要嵌入 HLS stream
。
字幕不打算手动添加..虽然我确实发现了一个显示黑客攻击的 Whosebug post。不确定它是否有效。
看我用的是VIMEO Pro,提供的HLS流中嵌入了WebVTT字幕(我上传到vimeo的),解决了我的问题。
这对我有用......
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()
}
}
好的,我想我解决了这个问题。我一直在寻找一些解决方案,但我还没有找到,所以我实施了一个来工作。
我提供了一个带有解决方案的 SPM,它使用起来非常简单。所以我将其命名为 SimpleSubtitles。
它确实支持 WebVTT,没有样式,并且可以改进以支持其他格式
问题:
如何在 tvOS 中将外部 WebVTT 文件添加到我的 AVPlayer?
描述:
我一直在看 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
虽然苹果文档中几乎没有提及,但我在一篇文章中读到字幕需要嵌入 HLS stream
。
字幕不打算手动添加..虽然我确实发现了一个显示黑客攻击的 Whosebug post。不确定它是否有效。
看我用的是VIMEO Pro,提供的HLS流中嵌入了WebVTT字幕(我上传到vimeo的),解决了我的问题。
这对我有用......
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()
}
}
好的,我想我解决了这个问题。我一直在寻找一些解决方案,但我还没有找到,所以我实施了一个来工作。 我提供了一个带有解决方案的 SPM,它使用起来非常简单。所以我将其命名为 SimpleSubtitles。 它确实支持 WebVTT,没有样式,并且可以改进以支持其他格式