5

我正在使用m3u8視頻格式來傳輸視頻,現在我需要顯示相同的字幕。AVPlayer/MPMoviePlayerController的字幕

我搜索蘋果文檔,我發現我可以通過使用AVPlayerclosedCaptionDisplayEnabled財產實現這一目標。

我有興趣知道字幕格式應該是什麼? .srt格式會做什麼?

也可以使用MPMoviePlayerController實現相同嗎?

任何幫助表示讚賞。

+0

見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

+0

蘋果文檔在這一點上遭受了精確的措詞。它只說'closedCaptionDisplayEnabled'「[我]表示玩家是否使用隱藏式字幕」。它沒有提及任何關於字幕的內容。在我的測試中(在OS X上),該屬性對字幕沒有影響;它*只適用於隱藏式字幕。 (您可以通過使用EyeTV錄製閉路字幕電視,然後將其導出到iPhone和MPEG-2複合格式,然後使用HandBrake轉換後者來測試.EyeTV到iPhone導出將具有CC軌道; HandBrake翻錄將會有一個字幕軌道。) – 2013-07-27 08:09:51

回答

2

AVPlayer和MPMoviePlayerController都可以顯示字幕。

與AVPlayer不同的是,您可以使用closedCaptionDisplayEnabled屬性控制是否顯示字幕。

使用MPMoviePlayerController,用戶控制是否使用設置應用程序中的開關顯示字幕。您在應用程序中沒有對此進行編程控制。

+2

'closedCaptionDisplayEnabled'切換隱藏字幕,而不是字幕。他們是兩個不同的東西,而且這個屬性對字幕沒有影響。 (一個警告:我只在OS X上嘗試過,而不是iOS。) – 2013-07-27 07:58:43

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。

10

看起來好像在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]]; 
+0

非常感謝您的精湛發帖。你能否提一提我們如何設置元數據。 讓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

+0

@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

+0

@MartinKoles我認爲它應該工作。找出最好的方法就是試試:)也許你可以在這裏發佈你的結果! – 2017-04-03 14:24:37