2015-06-15 11 views
5

Tôi gặp sự cố với phương thức ủy quyền didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection của AVCaptureOutput.AVCaptureOutput didOutputSampleBuffer ngừng nhận được gọi là

Nó ngừng nhận được gọi trong vòng một hoặc hai giây khi tôi thêm mẫuBuffer vào CFArray. Nếu tôi xóa mã CFArray, phương thức ủy quyền sẽ tiếp tục được gọi để tôi không biết tại sao mã CFArray đang làm cho nó dừng lại. Tôi đánh giá cao sự giúp đỡ nào.

@property CFMutableArrayRef sampleBufferArray; 

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 
    NSLog(@"Called"); 

    if (!self.sampleBufferArray) 
    { 
     self.sampleBufferArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); 
     CFArrayAppendValue(self.sampleBufferArray, sampleBuffer); 
    } 
    else 
    { 
     CFArrayAppendValue(self.sampleBufferArray, sampleBuffer); 
    } 
} 

điều khiển ouput:

// Session start 
2015-06-15 13:06:07.264 App[22467:5897858] Called 
2015-06-15 13:06:07.286 App[22467:5897858] Called 
2015-06-15 13:06:07.289 App[22467:5897858] Called 
2015-06-15 13:06:07.315 App[22467:5897895] Called 
2015-06-15 13:06:07.366 App[22467:5897895] Called 
2015-06-15 13:06:07.384 App[22467:5897895] Called 
2015-06-15 13:06:07.411 App[22467:5897895] Called 
2015-06-15 13:06:07.449 App[22467:5897858] Called 
2015-06-15 13:06:07.480 App[22467:5897858] Called 
2015-06-15 13:06:07.513 App[22467:5897895] Called 
2015-06-15 13:06:07.546 App[22467:5897895] Called 
2015-06-15 13:06:07.579 App[22467:5897895] Called 
2015-06-15 13:06:07.614 App[22467:5897895] Called 
// No more calls after this point 
+1

làm cách nào để bạn tạo và bắt đầu một phiên? làm thế nào để bạn cấu hình đầu ra của bạn? bạn đã cố gắng đặt người quan sát cho thông báo 'AVCaptureSessionRuntimeErrorNotification', nó có xảy ra không? Nếu bạn ghi vào tập tin, không 'captureOutput: willFinishRecordingToOutputFileAtURL: fromConnections: dueToError:' xảy ra? bạn có thể cung cấp một số dự án mẫu tái tạo vấn đề? Cung cấp thêm một số thông tin về vấn đề của bạn. –

Trả lời

11

Vấn đề của bạn là thực sự tham chiếu trong Docs, Cụ thể;

If your application is causing samples to be dropped by retaining the provided CMSampleBufferRef objects for too long, but it needs access to the sample data for a long period of time, consider copying the data into a new buffer and then releasing the sample buffer (if it was previously retained) so that the memory it references can be reused.

Về cơ bản, bạn cần phải giữ cho hoạt động gọi lại như đơn giản càng tốt, và bạn nên cần phải thực hiện tiếp tục xử lý vào khung truyền cho bạn trong khi gọi lại, bạn cần phải sao chép nó vào một bộ đệm mới và thực hiện việc xử lý trong nền. Ngoài ra, Hãy nhớ rằng đối tượng Core Foundation phải được giữ lại và phát hành một cách rõ ràng.

Cân nhắc thêm là áp lực bộ nhớ. Khung chứa nhiều dữ liệu, giữ lại quá nhiều dữ liệu sẽ khiến ứng dụng của bạn gặp sự cố.

+0

Wow bạn vừa mới cứu tôi khỏi cơn đau đầu kéo dài trong một tháng, Cảm ơn! – Charlie

+0

@ MDB983 bạn có thể cung cấp một số ví dụ về mã hoặc hướng dẫn không? Tôi đang đấu tranh với vấn đề này nhiều thời gian và không thể xử lý mẫu đúng cách, tôi có SampleBufferDelegate ngừng kích hoạt sau khi tôi thực hiện một số thao tác với sampleBuffer. –

+0

Làm cách nào để sao chép? –

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