我正在使用m3u8视频格式来播放视频,现在我需要显示相同的字幕。
我在Apple文档中搜索并发现我可以使用closedCaptionDisplayEnabled
的{{1}}属性来实现此目的。
我很想知道字幕的格式应该是什么? .srt格式会不会?
我也可以使用AVPlayer
来实现相同的目标吗?
感谢任何帮助。
答案 0 :(得分:26)
更新10/30/2018:值得检查this answer by an Apple engineer(感谢@allenlini的pointing it out)。他提出了一个涉及AVAssetResourceLoaderDelegate
的解决方案。我自己没有尝试过,但它可能是比我下面更好的解决方案。
原始答案:
似乎在m3u8流媒体描述中引用您的WebVTT文件是官方支持的方式。似乎没有正式支持“事后”添加它们(参见this statement by an Apple engineer (bottom of the page))。
但是 - 并不意味着你不能让它工作;-)。 在Chris Adamson this great presentation和sample project (ZIP)的this post on the Apple Developer Forums和this 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。