我正在使用m3u8視頻格式來傳輸視頻,現在我需要顯示相同的字幕。AVPlayer/MPMoviePlayerController的字幕
我搜索蘋果文檔,我發現我可以通過使用AVPlayer
的closedCaptionDisplayEnabled
財產實現這一目標。
我有興趣知道字幕格式應該是什麼? .srt格式會做什麼?
也可以使用MPMoviePlayerController
實現相同嗎?
任何幫助表示讚賞。
我正在使用m3u8視頻格式來傳輸視頻,現在我需要顯示相同的字幕。AVPlayer/MPMoviePlayerController的字幕
我搜索蘋果文檔,我發現我可以通過使用AVPlayer
的closedCaptionDisplayEnabled
財產實現這一目標。
我有興趣知道字幕格式應該是什麼? .srt格式會做什麼?
也可以使用MPMoviePlayerController
實現相同嗎?
任何幫助表示讚賞。
AVPlayer和MPMoviePlayerController都可以顯示字幕。
與AVPlayer不同的是,您可以使用closedCaptionDisplayEnabled屬性控制是否顯示字幕。
使用MPMoviePlayerController,用戶控制是否使用設置應用程序中的開關顯示字幕。您在應用程序中沒有對此進行編程控制。
'closedCaptionDisplayEnabled'切換隱藏字幕,而不是字幕。他們是兩個不同的東西,而且這個屬性對字幕沒有影響。 (一個警告:我只在OS X上嘗試過,而不是iOS。) – 2013-07-27 07:58:43
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。
看起來好像在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]];
非常感謝您的精湛發帖。你能否提一提我們如何設置元數據。 讓titleMetadataItem = AVMutableMetadataItem() titleMetadataItem.locale = NSLocale.current titleMetadataItem.key = AVMetadataCommonKeyTitle如(NSCopying&NSObjectProtocol)? titleMetadataItem.keySpace = AVMetadataKeySpaceCommon titleMetadataItem.value = self.assetObject.title as(NSCopying&NSObjectProtocol)? – 2017-01-15 12:39:37
@Johannes Fahrenkrug:這個解決方案是否與來自遠程m3u8播放列表的真正HLS流一起工作?我試圖在Swift中做到這一點,但沒有運氣。你可以請檢查我的帖子:http://stackoverflow.com/questions/43161124/how-to-add-external-webvtt-subtitles-into-http-live-stream-on-ios-client。謝謝! – 2017-04-01 21:05:58
@MartinKoles我認爲它應該工作。找出最好的方法就是試試:)也許你可以在這裏發佈你的結果! – 2017-04-03 14:24:37
見http://stackoverflow.com/questions/11312118/show-subtitles-with-an-avfoundation-avplayer-on-os-x和http://stackoverflow.com/questions/5662635/show -subtitles-in-a-mpmovieplayerviewcontroller-by-default – Till 2012-07-18 21:07:23
蘋果文檔在這一點上遭受了精確的措詞。它只說'closedCaptionDisplayEnabled'「[我]表示玩家是否使用隱藏式字幕」。它沒有提及任何關於字幕的內容。在我的測試中(在OS X上),該屬性對字幕沒有影響;它*只適用於隱藏式字幕。 (您可以通過使用EyeTV錄製閉路字幕電視,然後將其導出到iPhone和MPEG-2複合格式,然後使用HandBrake轉換後者來測試.EyeTV到iPhone導出將具有CC軌道; HandBrake翻錄將會有一個字幕軌道。) – 2013-07-27 08:09:51