如何在iOS客户端上将外部WebVTT字幕添加到HTTP Live Stream中 [英] How to add external WebVTT subtitles into HTTP Live Stream on iOS client

查看:206
本文介绍了如何在iOS客户端上将外部WebVTT字幕添加到HTTP Live Stream中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有通过bitmovin.com编码的视频,并以HTTP Live Streams(Fairplay HLS)的形式提供,但字幕虽然是WebVTT格式,但作为整个文件的直接URL单独显示,而不是单独的片段,也不属于HLS m3u8的一部分播放列表.

We have videos encoded via bitmovin.com and provided as HTTP Live Streams (Fairplay HLS), but subtitles although in WebVTT format are exposed separately as direct URLs for the whole file, not individual segments and are not part of the HLS m3u8 playlist.

我正在寻找如何将单独下载的外部.vtt文件仍然包含在HLS流中并在AVPlayer中用作字幕的方式.

I am looking for the way how an external .vtt file downloaded separately can still be included in the HLS stream and be available as a subtitle in AVPlayer.

我知道Apple的建议是将分段的VTT字幕包括在HLS播放列表中,但是我现在无法更改服务器的实现,因此我想澄清一下是否有可能将AVPlayer的字幕与之一起播放HLS流.

I know Apple's recommendation is to include segmented VTT subtitles into the HLS playlist, but I can't change the server implementation right now, so I want to clarify if it is even possible to provide the subtitle to AVPlayer to play along with the HLS stream.

该主题上唯一可能声称这是可能的帖子是: AVPlayer/MPMoviePlayerController的字幕.但是,示例代码从捆绑软件中加载本地mp4文件,而我正努力通过AVURLAsset使它适用于m3u8播放列表.实际上,由于asset.tracks(withMediaType: AVMediaTypeVideo)返回空数组,我很难从远程m3u8流中获取videoTrack.任何想法,如果这种方法可以适用于真正的HLS流?还是有其他方法可以将单独的WebVTT字幕与HLS流一起播放而不将其包含在服务器上的HLS播放列表中?谢谢.

The only valid post on this subject claiming it is possible is this: Subtitles for AVPlayer/MPMoviePlayerController. However, the sample code loads local mp4 file from bundle and I am struggling to make it work for m3u8 playlist via AVURLAsset. Actually, I am having problem to get videoTrack from the remote m3u8 stream as the asset.tracks(withMediaType: AVMediaTypeVideo) returns empty array. Any ideas if this approach can work for real HLS stream? Or is there any other way to play separate WebVTT subtitle with HLS stream without including them into HLS playlist on the server? Thanks.

func playFpsVideo(with asset: AVURLAsset, at context: UIViewController) {

    let composition = AVMutableComposition()

    // Video
    let videoTrack = composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)

    do {

        let tracks = asset.tracks(withMediaType: AVMediaTypeVideo)

        // ==> The code breaks here, tracks is an empty array
        guard let track = tracks.first else {
            Log.error("Can't get first video track")
            return
        }

        try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, asset.duration), of: track, at: kCMTimeZero)

    } catch {

        Log.error(error)
        return
    }


    // Subtitle, some test from the bundle..
    guard let subsUrl = Bundle.main.url(forResource: "subs", withExtension: "vtt") else {
        Log.error("Can't load subs.vtt from bundle")
        return
    }

    let subtitleAsset = AVURLAsset(url: subsUrl)

    let subtitleTrack = composition.addMutableTrack(withMediaType: AVMediaTypeText, preferredTrackID: kCMPersistentTrackID_Invalid)

    do {

        let subTracks = subtitleAsset.tracks(withMediaType: AVMediaTypeText)

        guard let subTrack = subTracks.first else {
            Log.error("Can't get first subs track")
            return
        }

        try subtitleTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, asset.duration), of: subTrack, at: kCMTimeZero)

    } catch {

        Log.error(error)
        return
    }


    // Prepare item and play it
    let item = AVPlayerItem(asset: composition)

    let player = AVPlayer(playerItem: item)

    let playerViewController = AVPlayerViewController()
    playerViewController.player = player

    self.playerViewController = playerViewController

    context.present(playerViewController, animated: true) {
        playerViewController.player?.play()
    }
}

推荐答案

由于我不得不处理类似的问题,因此我为此写了一篇文章,该文章与GitHub上的一些概念证明相链接.希望这会有所帮助.

I wrote a little post about this which links to some proof of concept on GitHub since I had to deal with a similar issue. Hope this helps.

https://jorisweimar.com/programming/supporting- external-webvtt-subtitles-in-avplayer/

这篇关于如何在iOS客户端上将外部WebVTT字幕添加到HTTP Live Stream中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆