.movファイルからH.264フレームを解析しようとしています。私は、AVFormatのmov.c(FFMPEGの一部)が進むべき道であるという結論に達したと思います。ただし、mov.cは、コメントされていないコードの横にある約2600行です。私はFFMPEGの使用例を探しています。特に、あらゆるファイルタイプの構造を解析しています。構造が非常に似ているため、MPEG4でもQuicktimeムービーでも構いません。
既存の例がない場合(私は何も見つかりません)、誰かがそれを使用して数行のコードを教えてくれたり、開始方法を説明したりできますか?
私がやろうとしていること:AVCaptureSessionを使用してビデオカメラからサンプルをキャプチャし、これらのサンプルをH264でエンコードし、AVAssetsWriter、AVAssetsWriterInput、AVAssetsWriterInputPixelBufferAdaptorを使用してファイルに書き込みます。その理由は、アップルがこれを許可しないため、ハードウェアH264エンコーディングに直接アクセスできないためです。私が今やらなければならないこと(私はよくわからないと思います)は解析されます:
.movファイルの「 mdat」 -atom(ムービーデータ、複数あると思います)。次に「vide」-atom、次にvide-atom内(ビデオデータサンプル、複数ある場合があります)。私が信じているのはフレームであるいくつかの原子があると思います。これらは「avc1」タイプになります(これはH264のタイプです)。私はまだこれをすべて正しく取得していないと確信しているので、これで私を修正してください。
私の質問は、どのようにして単一のフレームを解析するのかということです。私はドキュメントを読んでいて、 iFrameExtractorを見てきました(フレームをデコードするのであまり役に立ちません)。FFMPEG-AVFormatのmov.cを使用することになっているときは正しく理解できたと思いますが、よくわかりません。
編集:私は今このようにしようとしています:
わずかに縮小されたinit関数iiFrameExtractorを実行して、.movファイルでビデオストリームを検索します。
次のようなフレームのデータを取得します。
AVPacket packet; av_read_frame(pFormatCtx, &packet); NSData *frame; if(packet.stream_index == videoStream){ frame = [NSData dataWithBytes:packet.data length:packet.size]; } videoStream++; av_free_packet(&packet); return frame;
次に、それをNSOperationのサブクラスに渡し、アップロードを待機するために保持されます。しかし、EXC_BAD_ACCを受け取りました。フレームからデータをコピーするときに、何か問題がありますか?何か案は。NSData* frame
(nonatomic、retain)-propertyを使用してクラス変数を設定しようとすると、EXC_...が取得されます。(合成行にEXC_BAD_ACCと表示されます)