【问题标题】:How to add external .vtt subtitle file to AVPlayerViewController in tvOS如何在 tvOS 中将外部 .vtt 字幕文件添加到 AVPlayerViewController
【发布时间】:2025-11-27 08:10:02
【问题描述】:

问题:

如何在 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

【问题讨论】:

    标签: swift swift3 tvos


    【解决方案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

      【讨论】:

        最近更新 更多