重要! iOS 8 以降では、VTCompressionSession を使用して、コンテナを掘り下げる代わりに NAL ユニットに直接アクセスできます。
幸いなことに、これを行うことができます。その方法を説明しますが、MP4 コンテナーまたは MOV コンテナーのいずれかで手を汚す必要があります。これに役立つリソース (ただし、より MOV 固有) は、Apple の Quicktime File Format Introduction マニュアルです
。 /doc/uid/TP40000939-CH202-TPXREF101
まず最初に、録画終了の 30 秒前の任意の時点から保存したムービーを開始することはできません。約 30 秒で I フレームを使用する必要があります。キーフレーム間隔によっては、30 秒マークの前後に数秒かかる場合があります。すべての I フレームを使用して、任意のポイントから開始することもできますが、ビデオは非常に大きくなるため、後でビデオを再エンコードする必要があります。
それを知って、次に進みましょう。
最初のステップは、AVAssetWriter をセットアップするときです。その AVAssetWriterInput の expectsMediaDataInRealTime プロパティを YES に設定します。
captureOutput コールバックでは、書き込み先のファイルから fread を実行できます。最初の fread は、MP4/MOV (使用しているフォーマットに関係なく) ヘッダー (つまり、「ftyp」アトム、「ワイド」アトム、および「mdat」アトムの始まり) の一部を取得します。「mdat」セクションの内容が必要です。したがって、データの保存を開始するオフセットは 36 程度になります。
読み取りごとに、0 個以上の AVC NAL ユニットが取得されます。ISO/IEC 14496-10 表 7-1 から NAL ユニット タイプのリストを見つけることができます。それらは附属書 B で指定されているものとはわずかに異なる形式になりますが、問題ありません。さらに、MP4/MOV ファイルには IDR スライスと非 IDR スライスのみが含まれます。IDR は、ハングアップしようとしている I フレームになります。
MP4/MOV コンテナの NAL ユニット形式は次のとおりです。
4 bytes - Size
[Size] bytes - NALU Data
data[0] & 0x1F - NALU Type
これで、探しているデータが得られました。このファイルを保存するときは、MPV/MOV コンテナーを正しい長さ、サンプル数で更新する必要があります。各サンプルの正しいサイズで「stsz」アトムを更新する必要があります。ムービーの正しい長さを含むメディア ヘッダーとトラック ヘッダーなど。私がおそらくお勧めするのは、最初の実行時にサンプル コンテナを作成することです。その特定の映画に適したデータで多かれ少なかれ上書き/増強することができます。さまざまな iDevice のエンコーダーがすべて同じ設定を持っているわけではなく、「avcC」アトムにエンコーダー情報が含まれているため、これを行う必要があります。
この場合、AVC ストリームについてあまり知る必要はありません。そのため、適切に選択したコンテナー形式を更新することに集中して実験することをお勧めします。幸運を。