2016-01-06 28 views
1

我需要對屏幕上顯示的本地(或遠程)視頻文件的字幕執行一些文本處理。目前我使用AVPlayerItem,通過查看其資產,我可以看到有一個隱藏字幕軌道,但我無法獲得實際的字幕文本。所以問題是我怎樣才能得到字幕軌道的實際文字顯示時(最好是迅速)。在iOS中播放視頻時處理字幕

+0

這可能會有所幫助http://cimapps.tumblr.com/post/22535014763/ios-alternateaudio-and-subtitles-avfoundation –

回答

2

http://www.slideshare.net/invalidname/stupid-videotricksdc2014的演示文稿應該爲您提供您需要的所有內容(請參閱評論中示例代碼的鏈接),因爲AVSubtitleReader示例完全符合您的要求。一旦你看到有一個文本軌道(封閉字幕,小標題,無論什麼),你需要獲得該軌道,用AVAssetReader打開它,然後開始讀取樣本緩衝區。每個人都有一個演示時間戳和持續時間,然後是一個CMBlockBuffer。該緩衝區的內容取決於您正在閱讀什麼類型的曲目,並且這些都是在QuickTime文件格式文檔中定義的。在文本的情況下,它只是一個Pascal字符串:一個大端的UInt16,告訴你文本有多長,然後是文本本身。當然,在C中比在Swift中所需的端到端翻轉和數據複製更自然,但肯定是可行的。或者,將這部分留在它自己的C或Obj-C文件中,並從Swift中調用它。

+0

謝謝,我跟着幻燈片,讀代碼就能得到字幕。我很快就實現了Pascal字符串解碼部分,但是在解碼過程中,大約10%的時間都在崩潰。但是當我將這部分移動到對象C後,事情運行良好。 – Ehsan

+0

在你的代碼中,你首先閱讀所有的字幕,然後隨着玩家的進步而檢索它們。視頻流式傳輸的情況如何?我想我們仍然可以使用copyNextSampleBuffer逐步獲取字幕,但如果用戶在開始時跳到視頻流的中間位置,這將不起作用。似乎subtitleTrackOutput沒有與視頻軌道同步。 – Ehsan