AVPlayer / MPMoviePlayerController的字幕

时间:2012-07-17 15:00:01

标签: mpmovieplayercontroller avfoundation avplayer subtitle transport-stream

我正在使用m3u8视频格式来播放视频,现在我需要显示相同的字幕。

我在Apple文档中搜索并发现我可以使用closedCaptionDisplayEnabled的{​​{1}}属性来实现此目的。

我很想知道字幕的格式应该是什么? .srt格式会不会?

我也可以使用AVPlayer来实现相同的目标吗?

感谢任何帮助。

4 个答案:

答案 0 :(得分:26)

更新10/30/2018:值得检查this answer by an Apple engineer(感谢@allenlinipointing it out)。他提出了一个涉及AVAssetResourceLoaderDelegate的解决方案。我自己没有尝试过,但它可能是比我下面更好的解决方案。

原始答案:

似乎在m3u8流媒体描述中引用您的WebVTT文件是官方支持的方式。似乎没有正式支持“事后”添加它们(参见this statement by an Apple engineer (bottom of the page))。

但是 - 并不意味着你不能让它工作;-)。 在Chris Adamson this great presentationsample project (ZIP)this post on the Apple Developer Forumsthis Ray Wenderlich tutorial by Abdul Azeem的帮助下,我能够让它发挥作用。这是Abdul Azeem的示例代码和Chris的示例项目的修改版本。

请注意,您需要使用AVMediaTypeText代替AVMediaTypeSubtitle。这似乎是iOS中的一个错误。

// 1 - Load video asset
AVAsset *videoAsset = [AVURLAsset assetWithURL:[[NSBundle mainBundle] URLForResource:@"video" withExtension:@"mp4"]];

// 2 - Create AVMutableComposition object. This object will hold your AVMutableCompositionTrack instances.
AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];

// 3 - Video track
AVMutableCompositionTrack *videoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                    preferredTrackID:kCMPersistentTrackID_Invalid];
[videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
                    ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
                     atTime:kCMTimeZero error:nil];

// 4 - Subtitle track
AVURLAsset *subtitleAsset = [AVURLAsset assetWithURL:[[NSBundle mainBundle] URLForResource:@"subtitles" withExtension:@"vtt"]];

AVMutableCompositionTrack *subtitleTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeText
                                                                       preferredTrackID:kCMPersistentTrackID_Invalid];

[subtitleTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
                       ofTrack:[[subtitleAsset tracksWithMediaType:AVMediaTypeText] objectAtIndex:0]
                        atTime:kCMTimeZero error:nil];

// 5 - Set up player
AVPlayer *player = [AVPlayer playerWithPlayerItem: [AVPlayerItem playerItemWithAsset:mixComposition]];

答案 1 :(得分:4)

这是@JohannesFahrenkrug answer的Swift版本。希望这对某人有用:

    let localVideoAsset = Bundle.main.url(forResource: "L1C1P1C3", withExtension: "mp4")

    //Create AVMutableComposition
    let videoPlusSubtitles = AVMutableComposition()

    //Adds video track
    let videoTrack = videoPlusSubtitles.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)

    try? videoTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, localVideoAsset.duration),
                                of: localVideoAsset.tracks(withMediaType: .video)[0],
                                at: kCMTimeZero)

    //Adds subtitle track
    let subtitleAsset = AVURLAsset(url: Bundle.main.url(forResource: "L1C1P1C3", withExtension: ".mp4.vtt")!)

    let subtitleTrack = videoPlusSubtitles.addMutableTrack(withMediaType: .text, preferredTrackID: kCMPersistentTrackID_Invalid)

    try? subtitleTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, localVideoAsset.duration),
                                        of: subtitleAsset.tracks(withMediaType: .text)[0],
                                        at: kCMTimeZero)

答案 2 :(得分:2)

AVPlayer和MPMoviePlayerController都可以显示字幕。

差异似乎在于使用AVPlayer,您可以使用closedCaptionDisplayEnabled属性控制是否显示字幕。

使用MPMoviePlayerController,用户可以使用设置应用中的开关控制是否显示字幕。你在应用程序中没有对此进行编程控制。

答案 3 :(得分:0)

WWDC 2013 iOS应用程序使用WebVTT文件作为其字幕(credit to Nicholas Riley for discovering this)。无论出于何种原因,每个会话大约有50个(确切数量不同)。

我不知道AVFoundation或MPMoviePlayer级别是否支持WebVTT,或者应用程序是否下载并解析字幕文件本身。

快速搜索“webvtt m3u8”会显示对this HTTP Live Streaming Draft的引用,这表示您可能只需引用m3u8播放列表中的WebVTT文件即可完成此工作。但是,我没有一个例子,因为我无法轻易猜到WWDC会话的m3u8 URL。