4

シーンの設定

コマンドラインから実行してビデオを読み込み、処理してからエクスポートするビデオ処理アプリに取り組んでいます。私は4つのトラックで作業しています。

  1. 1 つのビデオを作成するために 1 つのトラックに追加する多数のクリップ。これを ugcVideoComposition と呼びましょう。
  2. 2 番目のトラックに配置され、レイヤー命令を使用するアルファ付きのクリップは、エクスポート時に合成され、ugcVideoComposition の上で再生されるように設定されます。
  3. 音楽のオーディオ トラック。
  4. 1 つのトラックに追加されたクリップからのオーディオを含む ugcVideoComposition のオーディオ トラック。

AVExportSessionを使用して、これをすべて機能させ、合成して正しくエクスポートできます。

問題

ここでやりたいことは、フィルターとグラデーションを ugcVideoComposition に適用することです。

私のこれまでの調査によると、これは AVReader と AVWriter を使用して CIImage を抽出し、それをフィルターで操作してから書き出すことによって行われることが示唆されています。

上記のすべての機能がまだ動作していませんが、アセットリーダーとアセットライターを使用して、ugcVideoComposition を読み込んでディスクに書き戻すことができました。

    BOOL done = NO;
    while (!done)
    {
        while ([assetWriterVideoInput isReadyForMoreMediaData] && !done)
        {
            CMSampleBufferRef sampleBuffer = [videoCompositionOutput copyNextSampleBuffer];
            if (sampleBuffer)
            {
                // Let's try create an image....
                CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
                CIImage *inputImage = [CIImage imageWithCVImageBuffer:imageBuffer];

                // < Apply filters and transformations to the CIImage here

                // < HOW TO GET THE TRANSFORMED IMAGE BACK INTO SAMPLE BUFFER??? >

                // Write things back out.
                [assetWriterVideoInput appendSampleBuffer:sampleBuffer];

                CFRelease(sampleBuffer);
                sampleBuffer = NULL;
            }
            else
            {
                // Find out why we couldn't get another sample buffer....
                if (assetReader.status == AVAssetReaderStatusFailed)
                {
                    NSError *failureError = assetReader.error;
                    // Do something with this error.
                }
                else
                {
                    // Some kind of success....
                    done = YES;
                    [assetWriter finishWriting];

                }
            }
         }
      }

ご覧のとおり、CMSampleBuffer から CIImage を取得することもできます。イメージを操作して、必要な効果などを適用する方法を理解できると確信しています。どうすればよいかわからないのは、結果の操作された画像を SampleBuffer に戻して、もう一度書き出せるようにすることです。

質問

CIImage が与えられた場合、それを sampleBuffer に入れて assetWriter に追加するにはどうすればよいですか?

助けていただければ幸いです - AVFoundation のドキュメントはひどいものであり、重要なポイント (画像を抽出した後に画像を元に戻す方法など) が欠けているか、または私がやりたいことではない iPhone 画面への画像のレンダリングに焦点を当てています。

ありがとうございます!

4

2 に答える 2

3

使用してみてください:SDAVAssetExportSession

GitHub の SDAVAssetExportSession

次に、デリゲートを実装してピクセルを処理します

- (void)exportSession:(SDAVAssetExportSession *)exportSession renderFrame:(CVPixelBufferRef)pixelBuffer withPresentationTime:(CMTime)presentationTime toBuffer:(CVPixelBufferRef)renderBuffer

{ Do CIImage and CIFilter inside here }
于 2014-04-05T23:57:45.450 に答える