2011-11-09 27 views
12

Tôi hiện đang phát triển một ứng dụng iOS áp dụng CoreImage cho nguồn cấp dữ liệu máy ảnh để chụp ảnh và quay video, đồng thời tôi đã gặp phải một chút vướng mắc. Cho đến bây giờ tôi đã sử dụng AVCaptureVideoDataOutput để lấy các bộ đệm mẫu và thao tác chúng với CoreImage, sau đó hiển thị xem trước đơn giản, cũng như sử dụng nó để chụp ảnh và lưu chúng.AVCaptureSession với nhiều Đầu ra?

Khi tôi cố gắng triển khai quay video, bằng cách viết SampleBuffers cho video như tôi nhận được từ AVCaptureVideoDataOutput, tốc độ khung hình rất chậm (có thể do hình ảnh khác liên quan đến quá trình xử lý đang diễn ra) .

Vì vậy, tôi đã tự hỏi, liệu có thể có một AVCaptureVideoDataOutput và AVCaptureMoveFileOutput đang diễn ra cùng một lúc AVCaptureSession không?

Tôi đã cho nó một cách nhanh chóng, và thấy rằng khi tôi thêm đầu ra thêm, AVCaptureVideoDataOutput của tôi ngừng nhận thông tin.

Nếu tôi có thể làm việc, tôi hy vọng điều đó có nghĩa là tôi có thể sử dụng đầu ra thứ 2 để quay video ở tốc độ khung hình cao và thực hiện xử lý hậu kỳ trên video sau khi người dùng ngừng ghi.

Mọi trợ giúp sẽ được đánh giá cao.

+0

Were bạn sử dụng AVAssetWriter để ghi hình ảnh ra MOV/MP4? Tôi sử dụng công cụ xử lý hình ảnh OpenGL tùy chỉnh và vẫn có thể ghi ở tốc độ 30 khung hình/giây. Tôi cho rằng CoreImage sẽ được OpenGL hỗ trợ cho hiệu quả. Tôi nghi ngờ rằng những gì đang giữ bạn lại là màn hình hiển thị của hình ảnh. Bạn đang sử dụng OpenGL để render hình ảnh, hoặc bạn đang sử dụng một số API khác (có thể dựa trên CPU)? –

+0

bạn có tìm thấy giải pháp khả thi không? – user454083

Trả lời

3

Dễ hơn bạn nghĩ.

Xem: AVCamDemo

  1. Capture dữ liệu sử dụng AVCaptureVideoDataOutput.
  2. Tạo hàng đợi công văn mới trước khi ghi, ví dụ: recordingQueue: recordingQueue = dispatch_queue_create("Movie Recording Queue", DISPATCH_QUEUE_SERIAL);
  3. Trong captureOutput: didOutputSampleBuffer: fromConnection: ủy phương pháp, nắm bắt được samplebuffer, giữ lại nó, và trong hàng đợi ghi , hãy viết nó vào file:

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

xin vui lòng, chuyển đổi sang Swift 4 – user924

Các vấn đề liên quan