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)
这是@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)
AVPlayer 和 MPMoviePlayerController 都可以显示字幕。
区别似乎在于,对于 AVPlayer,您可以使用 closeCaptionDisplayEnabled 属性控制是否显示字幕。
使用 MPMoviePlayerController,用户可以使用“设置”应用程序中的开关来控制是否显示字幕。您在应用程序中无法对此进行编程控制。
| 归档时间: |
|
| 查看次数: |
14063 次 |
| 最近记录: |