如何在 tvOS 中将外部 .vtt 字幕文件添加到 AVPlayerViewController
Posted
技术标签:
【中文标题】如何在 tvOS 中将外部 .vtt 字幕文件添加到 AVPlayerViewController【英文标题】:How to add external .vtt subtitle file to AVPlayerViewController in tvOS 【发布时间】:2016-09-20 08:54:35 【问题描述】:问题:
如何在 tvOS 中将外部 WebVTT 文件添加到我的 AVPlayer?
说明:
我一直在观看 this "What's New in HTTP Live Streaming" by Apple,他们在其中讨论了实现外部 WebVTT 文件的不同方式。
整个字幕领域对我来说还是很陌生的,所以我很难很好地掌握这个概念。在视频中,他们谈论了许多我不太了解的不同事物,例如(字幕播放列表)。但是,我主要关心的是向我的 AVPlayer 添加 .vtt 文件。
在视频中他们谈论了这个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
【问题讨论】:
【参考方案1】:虽然在苹果文档中几乎没有提到,但我在一篇文章中读到字幕需要嵌入到HLS stream
。
不打算手动添加字幕.. 虽然我确实发现了一个 *** 帖子显示一个 hack。不确定它是否有效。
看到我使用VIMEO Pro,提供的HLS流嵌入了WebVTT字幕(我上传到vimeo),从而解决了我的问题。
【讨论】:
【参考方案2】:这对我有用.......
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()
【讨论】:
这是本地视频!如何为流媒体视频添加字幕? @Rajesh 你有为流媒体视频嵌入字幕的解决方案吗? @PallavTrivedi 我没有找到一种方法来完成这项工作,Kemicofa 的回答似乎是合法的。虽然我找到了另一种使用我在网上找到的 UILabel 扩展程序来显示字幕的方法github.com/mhergon/AVPlayerViewController-Subtitles【参考方案3】:好的,我想我解决了这个问题。我一直在寻找一些解决方案,但我还没有找到,所以我实施了一个来工作。 我提供了一个带有该解决方案的 SPM,它使用起来非常简单。所以我称之为SimpleSubtitles。 它确实支持 WebVTT,没有样式,并且可以改进以支持其他格式
更多信息: https://github.com/peantunes/SimpleSubtitles
【讨论】:
以上是关于如何在 tvOS 中将外部 .vtt 字幕文件添加到 AVPlayerViewController的主要内容,如果未能解决你的问题,请参考以下文章