2011-11-09 20 views
12

私は現在、写真やビデオを撮るためにカメラフィードにCoreImageを適用するiOSアプリを開発している、と私は思わぬ障害のビットに実行しました。 複数の出力を持つAVCaptureSession?

は、今まで私が写真をキャプチャするためにそれを使用し、それらを保存するだけでなく、CoreImageでそれらをサンプルバッファを取得し、操作する AVCaptureVideoDataOutputを使用して、簡単なプレビューを表示してきました。

私はビデオ録画を実現しようとしたとき、私はAVCaptureVideoDataOutputからそれらを受け取ったとして、ビデオにSampleBuffersを書き込むことによって、それは(おそらく起こっていた他の画像に関する処理の)非常に遅いフレームレートを持っていたが。

だから私は思っていた、それはAVCaptureVideoDataOutputと同時に同じAVCaptureSessionに行くAVCaptureMoveFileOutputを持つことが可能でしょうか?

私はそれを素早く行くを与えた、と私は余分な出力を追加したとき、私のAVCaptureVideoDataOutputが情報を受信停止ことがわかりました。

私はそれが働いて得ることができる場合、私はそれは私が単に高フレームレートで動画を記録するために第二の出力を使用し、ユーザが録画を停止した後にビデオで後処理を行うことができることを意味願っています。

ご協力いただきますようお願い申し上げます。

+0

はあなただったのAVAssetWriterを使用してイメージをMOV/MP4に書き出しますか?私はカスタムOpenGLイメージ処理エンジンを使用していますが、30fpsでも記録できます。私はCoreImageが効率のためにOpenGLに裏打ちされていると仮定しました。私はあなたを抱きしめているのはイメージの表示だと思う。画像をレンダリングするのにOpenGLを使用していますか、他のAPI(おそらくCPUベース)を使用していますか? –

+0

実行可能なソリューションを見つけましたか? – user454083

答えて

3

それはあなたが思うだろうよりも簡単です。

参照:AVCaptureVideoDataOutputを使用してAVCamDemo

  1. キャプチャデータ。
  2. 記録する前に新しいディスパッチキューを作成します。 recordingQueue:captureOutputでrecordingQueue = dispatch_queue_create("Movie Recording Queue", DISPATCH_QUEUE_SERIAL);
  3. :didOutputSampleBuffer:fromConnection:、 方法を委任samplebufferをキャプチャし、それを維持し、かつ記録 キューで、ファイルに書き込む:

    -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {  
    
        CFRetain(sampleBuffer); 
    
        dispatch_async(recordingQueue, ^{ 
    
         if (assetWriter) { 
    
          if (connection == videoConnection) { 
           [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo]; 
          } else if (connection == audioConnection) { 
           [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio]; 
          } 
    
         } 
    
         CFRelease(sampleBuffer);   
        }); 
    } 
    
        - (void) writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType 
        { 
         CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); 
    
         if (assetWriter.status == AVAssetWriterStatusUnknown) { 
    
          if ([assetWriter startWriting]) { 
           [assetWriter startSessionAtSourceTime:presentationTime]; 
          } else { 
           NSLog(@"Error writing initial buffer"); 
          } 
         } 
    
         if (assetWriter.status == AVAssetWriterStatusWriting) { 
    
          if (mediaType == AVMediaTypeVideo) { 
           if (assetWriterVideoIn.readyForMoreMediaData) { 
    
            if (![assetWriterVideoIn appendSampleBuffer:sampleBuffer]) { 
             NSLog(@"Error writing video buffer"); 
            } 
           } 
          } 
          else if (mediaType == AVMediaTypeAudio) { 
           if (assetWriterAudioIn.readyForMoreMediaData) { 
    
            if (![assetWriterAudioIn appendSampleBuffer:sampleBuffer]) { 
             NSLog(@"Error writing audio buffer"); 
            } 
           } 
          } 
         } 
        } 
    
+0

お願い、Swift 4に変換してください – user924

関連する問題