Как добавить внешний файл субтитров.vtt в AVPlayerViewController в tvOS
Вопрос:
Как добавить внешний файл WebVTT в AVPlayer в tvOS?
Описание:
Я наблюдал за этим "Что нового в HTTP Live Streaming" от 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
3 ответа
Хотя почти не упоминалось нигде в документации Apple, я прочитал в статье, что субтитры должны быть встроены в HLS stream
,
Субтитры не предназначены для добавления вручную... хотя я нашел пост Stackru, показывающий взлом. Не уверен, работает ли он или нет.
Видя, что я использую 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 без стилей и может быть улучшен для поддержки других форматов.