2012-08-05 10 views
15

私は最後の数分/秒だけ録画するためにカメラを使用するiPhoneアプリを開発しようとしています。 たとえば、ムービーを5分間録画する場合は、「保存」をクリックして、最後の30秒だけを保存します。私は実際に5分を記録し、最後の30秒を切り詰めたくない(これは私にとってはうまくいかない)。このアイデアは"Loop recording"と呼ばれています。iosエンドレスビデオ録画

これは無限のビデオ録画になりますが、最後の部分だけを覚えています。 私がやりたいことをプリコーダアプリでやっています。 (私は別の文脈でこの機能を使いたい) これはCircular bufferで簡単にシミュレートするべきだと思います。 私はAVFoundationでプロジェクトを開始しました。何らかの形でビデオデータを循環バッファ(私が実装する)にリダイレクトすることができればすばらしいでしょう。私はそれをファイルに書き込む方法に関する情報しか見つけませんでした。

私はビデオをインターバルにチョップして保存することができますが、保存して別の部分を記録するためにカメラを再起動すると時間がかかり、映画の重要な瞬間を失う可能性があります。

カメラのデータをどのようにリダイレクトするかの手がかりがあります。

+0

Thx :)しかし、問題はカメラからその種のバッファにデータをリダイレクトする方法です。 –

+0

アダム - これをどうやって解決しましたか? – jangelo42

+0

@AdamSzeptyck:私はあなたが上で成し遂げたかったものに似たものを試していました。解決できる場合は、どうすればいいか教えてください。 –

答えて

10

重要! 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ストリームについて多くのことを知る必要はありませんので、正しく選択したコンテナ形式の更新に関する実験に集中したいと思うかもしれません。がんばろう。

+0

偉大な答えは、あなたのためにいくつかのデモのコードを提供してください。非常に役に立ちます。 –

+2

https://github.com/jgh-/VideoCore/blob/master/transforms/Apple/H264Encode.mmは 'VTCompressionSession'の実装を示しています。 'H264Encode :: compressionSessionOutput'のこのコードサンプルのようにNALユニットをパイプの下に押し込むのではなく、それらを30秒間の格納のためにリングバッファに入れることができます。 – jgh

+0

ありがとう!リンクを共有してくれてありがとう=) –