AVPlayer/MPMoviePlayerController的字幕

Vas*_*u N 10 transport-stream mpmovieplayercontroller avfoundation subtitle avplayer

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

我在Apple文档中搜索,发现我可以通过使用closedCaptionDisplayEnabled属性来实现这一点AVPlayer.

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

我也可以实现同样的使用MPMoviePlayerController吗?

任何帮助表示赞赏.

Joh*_*rug 27

更新2018年10月30日:这是值得一试此答案由Apple工程师(感谢@allenlini指点一下).他建议一个解决方案AVAssetResourceLoaderDelegate.我自己没有尝试过,但它可能是比我下面更好的解决方案.


原答案:

似乎在m3u8流描述中引用您的WebVTT文件是官方支持的方式.似乎没有正式支持"事后"添加它们(请参阅Apple工程师的此声明(页面底部)).

然而 - 然而 - 并不意味着你不能让它工作;-).借助Chris Adamson的精彩演示示例项目(ZIP),Apple开发者论坛上的这篇文章以及Abdul Azeem撰写的Ray Wenderlich教程,我能够让它发挥作用.这是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]];
Run Code Online (Sandbox Code Playgroud)

  • 这是一篇不错的文章“将字幕从 SEPARATE WebVTT 文件添加到 AVAsset/PlayerItem” https://forums.developer.apple.com/thread/45060 (2认同)

jma*_*nso 6

这是@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)
Run Code Online (Sandbox Code Playgroud)


Dav*_*ton 2

AVPlayer 和 MPMoviePlayerController 都可以显示字幕。

区别似乎在于,对于 AVPlayer,您可以使用 closeCaptionDisplayEnabled 属性控制是否显示字幕。

使用 MPMoviePlayerController,用户可以使用“设置”应用程序中的开关来控制是否显示字幕。您在应用程序中无法对此进行编程控制。

  • `closeCaptionDisplayEnabled` 切换隐藏式字幕,而不是字幕。它们是两个不同的东西,并且该属性对字幕没有影响。(需要注意的是:我只在 OS X 上尝试过此操作,没有在 iOS 上尝试过。) (2认同)