如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

Android VideoView没有在iplayer中添加VTT字幕

python之 ffmpeg给mp4视频添加字幕

vvt在线转换srt

获取 Openload VTT 字幕链接

VTT字幕文件处理(vi + sed + awk)

AE脚本:AE导入SubRip/SRT/TXT/VTT字幕