Macより。iOS関連で動画のエンコードや配信周りがどうなっているかを調べる。WikiNameとしてはOS関係なく動画配信全般にしておく。
YouTubeAPIやTwitchで配信するようなケースで、iOS側はどうなっているかを調べるメモ。
HTTP Live Streaming - Apple Developer Documentation あたりから見るのか?
Author fragmented MPEG-4 content with AVAssetWriter - WWDC20 - Videos - Apple Developer
この一つ手前のエンコーダーのあたりを知りたいのだが、とりあえずの取っ掛かりとして。 このサンプルコードからたどって見つけた。 Writing Fragmented MPEG-4 Files for HTTP Live Streaming - Apple Developer Documentation
この動画はやりたい事とは違いそうだが、情報量が多いのでなかなか良い。
Working with Media in AV Foundation (WWDC11)がみたい動画っぽいが見つからないな。
ただAV Foundation周りを調べると良さそうか。
AVFoundation Overview - Apple Developer
Apple iOS Development: Understanding AV Foundation - YouTube
Playbackの解説と、Editingの解説が詳しい。Editingは役に立ちそう。AVComposition、AVAudioMixなどの解説や時間などがどう表されるかなどの解説。
最後に言及されてたサンプルコード
オーディオというよりはステレオの話だが、サンプルコードは参考になりそう。
Capturing stereo audio from built-in microphones - Apple Developer Documentation
WWDCのこの動画が同じ内容か? Record stereo audio with AVAudioSession - WWDC20 - Videos - Apple Developer
なんかAVAudioRecoderはファイルに書く奴っぽいので、サンプルバッファが取れるのは無いのか? とググっていたらその辺の比較をしているブログを見つけた。 Recording Audio on iOS with Examples - Dolby.io
AVAssetWriterのdelegateの返すsegmentedDataがなんなのか全然分からなくて調べていた所見つけた動画。とても良いのでサブセクションを作る。 AV Foundationでは無くその下のVideo Toolboxを使うらしい。
Direct Access to Video Encoding and Decoding - WWDC14 - Videos - Apple Developer
参照されてる動画で気になったの
ユースケースとして以下を挙げている
6分あたり。
この辺は良く出てくるのでありがたい。
10:00あたりから。15:00あたりからネットワークからCMSampleBufferへのコンバートの話が出てくる。
NetworkからくるH.264ストリームはElementary Streamと呼ばれる形式で、それとファイルに保存されるMPEG-4をベースとしたCMSampleBufferの間には変換が必要となる。
NAL Unitからmp4のCMVideoFormatDescriptionを作るのはCMVideoFormatDescriptorCreateFromH264ParameterSets。
CMSampleBufferを作るのに必要なのは以下の3つ。
この3つを、CMSampleBufferCreateに食わせる。
20:00あたりから、ネットワークのストリームをデコードしてCVPixelBufferにアクセスする例に入る。 これにはVTDecompressSessionを使う。 この中にVideoDecoderが入っているらしい。
29:00あたりからCVPixelBufferを圧縮してネットワークに送る例が始まる。
VTCompressionSessionEncodeFrameでpixelBufferを送るっぽい。
最後に待つのはVTCompressionSessionCompleteFramesらしい。
34:00あたりからElementary Streamへの変換の話がある。 SPSとPPSを最初に送る必要があるが、これはCMVideoFormatDescriptionGetH264ParameterSetAtIndexというそのものずばりの関数がある。
次にNAL Unitの変換。I Frameなどは先頭に4バイトのlengthが入っているので、これを00 00 01の3 byteの開始コードに変換する必要がある。
使うか分からないメモを置いておく