Skip to content

Instantly share code, notes, and snippets.

@niwatako
Created June 21, 2018 13:09
Show Gist options
  • Save niwatako/c1dd6031151751103261de4b041e0c28 to your computer and use it in GitHub Desktop.
Save niwatako/c1dd6031151751103261de4b041e0c28 to your computer and use it in GitHub Desktop.
Video decode on iOS. #CodePiece #potatotips
potatotips #52 (iOS/Android開発Tips共有会) - connpass
https://potatotips.connpass.com/event/88164/
## noppe のっぺ Video decode on iOS. iOS
狐が大好きなエンジニアです。iOS8年。世を忍ぶ仮の姿はDeNAでソーシャルライブ
ツイキャスやニコ生的なアプリを作っています。視聴者が配信中にアイテムを発動して画面にエフェクトを発動できる。
これがKitsunebiという自作のライブラリを使っている
noppefoxwolf/Kitsunebi: Overlay alpha channel video animation player view using OpenGLES.
https://github.com/noppefoxwolf/Kitsunebi
ビデオファイルの前提知識
メディアコンテナの集まり。mp4の中に音声コンテナや画像コンテナ、字幕コンテナとかが入っている
メディアコンテナは人間が見れる形になっていないとか、順番に画像が入っているわけではない。
デコーダーは1フレームごとの画像を取得したり音声コンテナから音声取り出したり字幕コンテナから字幕出したり
h264などのフォーマットで取り出しにかかるコストが変わる
iOSでのデコード
AVAssetReader, VTDecompressionSession, ffmpegなど
上2つはOSや端末のデコーダーの実装を利用していると思われる。
h264,265みたいなコーデックの違いがあってOSや端末で再生できるできないがあったりするので注意。
HEVCはA9チップ以降でしか高速デコードできない。
デバイスがサポートするコーデックを取得するメソッドは見つからない。Stackoverflowでは公式サイト見れば端末の対応コーデックリスト見れるよみたいな回答でそんな。。。
AVAssetReader
アウトプットからcopyNextSamplebufferを呼ぶたびに取れるフレームのタイムスタンプが進む
対応コーデックであればコーデックを気にせずデコードできる。非常に簡単なインターフェースで次しか取れない。
VTDecompressionSession
より高度な扱いができるのでAVAssetReaderで不足すればこちらを使えば良いと思います。
h264/avcを分割、チャンクを取り出しVTCecompresionSessionを生成、チャンクをSessionに渡してデコード済みImageBuffer
> h264/avcを分割
NAL file format
0x05がキーフレームを持っている。
`VTDecompressionSessionCreate()` にNALの中から出して渡す。
チャンクをセッションに渡すにはチャンクはbyte配列なのでblockBufferを作ってそれをSampleBufferを作りわたす。
Sessionに登録したcallbackへデコードされたImagebufferが入ってくる。
AVAssetReader: は簡単だがカスタマイズできない、ストリーミングに弱い、配信キャプチャには向かない
VTDecompressionSession: ストリーミングでもキャプチャが取れる。AVAssetReaderのバグにあたらない。自分でバイト配列とれるので分散エンコードできる。エラーチェックとか自分でする必要がある。
パフォーマンスには違いはない
noppefoxwolf/H264DecodeSample: Decode h264 using VTDecompressionSession example.
https://github.com/noppefoxwolf/H264DecodeSample
CfP出したのでよろしいくお願いします
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment