Created
June 21, 2018 13:09
-
-
Save niwatako/c1dd6031151751103261de4b041e0c28 to your computer and use it in GitHub Desktop.
Video decode on iOS. #CodePiece #potatotips
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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