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
iOS Simulator で動作しないことだけ注意して欲しい。
(正しく動作する方法がわかる方は、プルリク送って下さい 🙏)
まとめ
最初は、 AVPlayerItem
の
tracks
をKVOする実装などしてみたが、デリゲートを設定するだけで良かったらしい。
AVFoundation
を普段触らないから、わからん...