2011-11-09 23 views
12

Şu anda fotoğraf ve video çekmek için CoreImage'ı kamera beslemesine uygulayan bir iOS uygulaması geliştiriyorum ve biraz takılmaya başladım. Birden çok Çıkışlı AVCaptureSession?

Şu ana kadar ben fotoğraf çekmek için kullanıyor ve onları kurtaran, hem de CoreImage onları örnek tamponlarını almak ve işlemek için AVCaptureVideoDataOutput kullanarak ve sonra basit bir önizleme görüntülenir oldum. Ben AVCaptureVideoDataOutput onları alır almaz videoya SampleBuffers yazarak Görüntü Kaydı, uygulamaya çalışmıştır

, bu (muhtemelen çünkü bittiğini diğer görüntü ilişkin işleme) çok yavaş bir kare hızı vardı .

diye merak ediyordum, bir AVCaptureVideoDataOutput ve AVCaptureMoveFileOutput aynı anda aynı AVCaptureSession oluyor olması mümkün mü?

Hızlı bir çıkış yaptım ve ek çıkışı eklediğimde AVCaptureVideoDataOutput öğemin bilgi almayı durdurduğunu keşfettim.

Çalışmayı başarabilirsem, yüksek çıkış hızlarında video kaydetmek için 2. çıkışını kullanabileceğimi ve kullanıcının kaydı durdurduktan sonra video üzerinde işlem yapabildiğimi umuyorum.

Herhangi bir yardım büyük takdir edilecektir.

+0

mıydınız görüntüyü bir MOV/MP4'e yazmak için AVAssetWriter kullanarak? Özel bir OpenGL görüntü işleme motoru kullanıyorum ve 30 fps hızında kayıt yapıyorum. CoreImage'ın verimlilik için destekli OpenGL olacağını varsaydım. Seni tutan şeyin görüntülerin gösterildiğinden şüpheleniyorum. Görüntüleri oluşturmak için OpenGL mi kullanıyorsunuz yoksa başka bir API kullanıyor musunuz (muhtemelen CPU tabanlı)? –

+0

uygulanabilir bir çözüm buldunuz mu? – user454083

cevap

3

Düşündüğünüzden daha kolay.

bakınız: AVCaptureVideoDataOutput kullanarak AVCamDemo

  1. Yakalama verilerini.
  2. Kayıttan önce yeni bir gönderim kuyruğu oluşturun, örn. recordingQueue: didOutputSampleBuffer: fromConnection: captureOutput yılında recordingQueue = dispatch_queue_create("Movie Recording Queue", DISPATCH_QUEUE_SERIAL);
  3. , samplebuffer yakalamak, yöntemi temsilci saklayın ve kayıt kuyrukta, dosyaya yazma:

    -(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

, dönüştürmek için Swift 4 – user924

İlgili konular