重要! iOS 8以降では、VTCompressionSessionを使用することができ、コンテナを掘るのではなく、NALユニットに直接アクセスできます。
まあ幸いにも、あなたはこれを行うことができますし、どのように私はあなたを教えてあげましょう、しかし、あなたはMP4やMOVコンテナのいずれかで汚れた手を取得する必要があるとしています。これに役立つ情報は、AppleのQuicktime File Formatの紹介マニュアルです。 http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFPreface/qtffPreface.html#//apple_ref/doc/uid/TP40000939-CH202-TPXREF101
30秒前に任意のポイントから保存したムービーを開始することはできません録音が終わると、約30秒でI-Frameを使用する必要があります。キーフレームの間隔に応じて、30秒の前後に数秒かかることがあります。すべてのIフレームを使用して任意の点から開始することができますが、その後はかなり大きくなりますので、後でビデオを再エンコードすることをお勧めします。
それを知っているので、次に進みましょう。
最初のステップは、AVAssetWriterを設定するときに、そのAVAssetWriterInputのexpectsMediaDataInRealTimeプロパティをYESに設定することです。
captureOutputコールバックでは、書き込み先のファイルからfreadを実行できます。最初のfreadは、あなたのMP4/MOV(あなたが使用しているフォーマットであれ)ヘッダー(つまり、 'ftyp'アトム、 'ワイド'アトム、 'mdat'アトムの先頭)を少し得るでしょう。あなたは 'mdat'セクションの中に何が必要なのですか?したがって、データの保存を開始するオフセットは36程度になります。
各読書では0以上のAVC NALユニットが得られます。 NALユニットタイプのリストは、ISO/IEC 14496-10の表7-1から見つけることができます。彼らは附属書Bに明記されているものとは若干異なる形式になりますが、それは問題ありません。さらに、MP4/MOVファイルにはIDRスライスと非IDRスライスのみが存在します。 IDRは、あなたが掛けようとしているI-Frameになります。
次のようにMP4/MOVコンテナ内のNALユニットの形式は次のとおりです。
4 bytes - Size
[Size] bytes - NALU Data
data[0] & 0x1F - NALU Type
は、だから今、あなたが探しているデータを持っています。このファイルを保存するときは、正しい長さ、サンプル数でMPV/MOVコンテナを更新する必要があります。各サンプルの正しいサイズで 'stsz'アトムを更新する必要があります。ムービーの正しい長さのメディアヘッダーおよびトラックヘッダーなどが含まれます。おそらく、最初の実行時にサンプルコンテナを作成して、その特定のムービーの適切なデータを上書きしたり、上書きしたりすることができます。さまざまなiDevices上のエンコーダがすべて同じ設定をしているわけではなく、 'avcC'アトムにエンコーダ情報が含まれているため、これを実行したいと思うでしょう。
この場合、AVCストリームについて多くのことを知る必要はありませんので、正しく選択したコンテナ形式の更新に関する実験に集中したいと思うかもしれません。がんばろう。
出典
2012-08-05 18:22:26
jgh
Thx :)しかし、問題はカメラからその種のバッファにデータをリダイレクトする方法です。 –
アダム - これをどうやって解決しましたか? – jangelo42
@AdamSzeptyck:私はあなたが上で成し遂げたかったものに似たものを試していました。解決できる場合は、どうすればいいか教えてください。 –