2012-02-04 42 views
6

Tôi đang gặp sự cố khi đồng bộ hóa nội dung bên ngoài theo số CALayer với độ chính xác cao AVPlayer.Đồng bộ hóa khung với AVPlayer

Suy nghĩ đầu tiên của tôi là đặt một loạt khung hình (bằng số khung trong video) trong một số CAKeyframeAnimation và đồng bộ hóa với AVSynchronizedLayer. Tuy nhiên, khi bước qua video theo từng khung, có vẻ như AVPlayer và Hoạt ảnh lõi sẽ vẽ lại trên các chu kỳ khác nhau, vì có sự chậm trễ nhỏ (nhưng đáng chú ý) giữa chúng trước khi chúng đồng bộ hóa.

Xử lý và hiển thị ngắn thông qua Core Video, có cách nào để đồng bộ hóa chính xác với AVPlayer ở cấp khung không?

Cập nhật: 05 Tháng Hai 2012

Cho đến nay cách tốt nhất mà tôi đã tìm thấy để làm điều này là pre-render qua AVAssetExportSession cùng với AVVideoCompositionCoreAnimationToolCAKeyFrameAnimation.

Tôi vẫn rất quan tâm đến việc tìm hiểu về bất kỳ cách thức thời gian thực nào để thực hiện việc này, tuy nhiên.

Trả lời

3

Bạn có ý nghĩa gì với 'độ chính xác cao?'

Mặc dù tài liệu tuyên bố rằng AVAssetReader không được thiết kế để sử dụng trong thời gian thực, trong thực tế, tôi không gặp vấn đề khi đọc video trong thời gian thực bằng cách sử dụng nó (xem https://stackoverflow.com/a/4216161/42961). Khung được trả lại đi kèm với 'Dấu thời gian trình bày' mà bạn có thể tìm nạp bằng cách sử dụng CMSampleBufferGetPresentationTimeStamp.

Bạn sẽ muốn một phần của dự án trở thành máy chấm công 'chính' ở đây. Giả sử hoạt ảnh CALayer của bạn nhanh chóng tính toán và không liên quan đến những thứ có khả năng gây tắc nghẽn như truy cập đĩa, tôi sẽ sử dụng nó làm nguồn thời gian chính. Khi bạn cần phải rút ra nội dung (ví dụ như trong bộ chọn draw trên UIView lớp con bạn), bạn nên đọc currentTime từ CALayer hoạt hình, nếu cần tiến hành thông qua khung video 's AVAssetReader sử dụng copyNextSampleBuffer cho đến khi CMSampleBufferGetPresentationTimeStamp returns> = currentTime, vẽ khung, và sau đó vẽ nội dung hoạt ảnh CALayer lên trên cùng.

1

Nếu trình phát của bạn đang sử dụng AVURLAsset, bạn đã tải nó với cờ thời gian chính xác được đặt chưa? I E. một cái gì đó như:

NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; 
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:aUrl options:options]; 
Các vấn đề liên quan