HLS形式の動画から字幕を取得する

HLS形式の動画から字幕情報を取得する機会があり、その実装を試みたがハマった。調べた限りこれに関する記事が無かったため、今回は記事として残す。

字幕情報を取得するには?

AVPlayerItemLegibleOutput を使用する。
AVPlayerItemLegibleOutput は、デリゲートをプロパティとして持っているため、そのデリゲートプロトコルを実装したクラスをセットする。
デリゲートをセットした AVPlayerItemLegibleOutputインスタンスAVPlayerItem のアウトプットとして add することで、デリゲートクラスで再生中に字幕情報を取得することが出来る。

// URLから AVPlayerItem, AVPlayer を生成
let videoURLString = "VIDEO_URL"
guard let videoURL = URL(string: videoURLString) else { fatalError("Failed to create url") }
let videoPlayerItem = AVPlayerItem(url: videoURL)
let videoPlayer = AVPlayer(playerItem: videoPlayerItem)

// AVPlayerItemLegibleOutput を生成する
// デリゲート先をセットし、 `videoPlayerItem` に追加
let legibleOutput = AVPlayerItemLegibleOutput(mediaSubtypesForNativeRepresentation: [])
legibleOutput.setDelegate(self, queue: .main)
videoPlayerItem.add(legibleOutput)

// 動画を再生
videoPlayer.play()

サンプル

今回のサンプルは、 GitHub に上げておく。 github.com

f:id:culumn:20181105192948g:plain

iOS Simulator で動作しないことだけ注意して欲しい。
(正しく動作する方法がわかる方は、プルリク送って下さい 🙏)

まとめ

最初は、 AVPlayerItemtracks をKVOする実装などしてみたが、デリゲートを設定するだけで良かったらしい。
AVFoundation を普段触らないから、わからん...