17

カメラを使用して最後の数分/秒のみを記録する iPhone アプリを開発しようとしています。たとえば、動画を 5 分間録画して [保存] をクリックすると、最後の 30 秒だけが保存されます。実際に 5 分間を記録してから、最後の 30 秒を切り刻むことはしたくありません (これは私にはうまくいきません)。この考え方を「ループ録音」と呼んでいます。

これにより、エンドレスなビデオ録画が行われますが、覚えているのは最後の部分だけです。やりたいことをやるプリレコーダーアプリ。(この機能を他のコンテキストで使用したい)これはCircular bufferで簡単にシミュレートできるはずです。AVFoundation でプロジェクトを開始しました。どうにかしてビデオ データを循環バッファにリダイレクトできれば最高です (実装予定です)。ファイルに書き込む方法だけの情報が見つかりました。

ビデオを分割して保存できることはわかっていますが、保存して別の部分を録画するためにカメラを再起動するには時間がかかり、映画の重要な瞬間を失う可能性があります。

カメラからデータをリダイレクトする方法の手がかりをいただければ幸いです。

4

1 に答える 1

10

重要! 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 ストリームについてあまり知る必要はありません。そのため、適切に選択したコンテナー形式を更新することに集中して実験することをお勧めします。幸運を。

于 2012-08-05T18:22:26.117 に答える