Как добавить внешний файл субтитров.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 без стилей и может быть улучшен для поддержки других форматов.

Подробнее:https://github.com/peantunes/SimpleSubtitles

Другие вопросы по тегам