2013-01-05 26 views
10

Tôi đang sử dụng AVPlayer trong ứng dụng Ca cao và tôi đã triển khai lệnh nhảy đến cuối video.Tìm kiếm chính xác, trái ngược với hai giây ngắn, trong AVPlayer

Vấn đề là, AVPlayer không tìm nơi tôi đã nói.

Ví dụ: một trong những video tôi có dài 4 phút và 14 giây. Khi tôi tìm cách kết thúc, AVPlayer tìm đến 4 phút và 12 giây — hai giây ngắn. Nếu sau đó tôi nhấn phát, người chơi sẽ chơi trong hai giây, rồi kết thúc.

nỗ lực đầu tiên của tôi là thế này:

[self.player seekToTime:self.player.currentItem.duration]; 

tôi đã chuyển nó như thế này:

[self.player seekToTime:self.player.currentItem.duration 
     toleranceBefore:kCMTimePositiveInfinity 
     toleranceAfter:kCMTimeZero]; 

Không ai làm việc bất kỳ tốt hơn so với người kia.

Tôi cũng đã cố gắng tìm kiếm kCMTimePositiveInfinity. Nó chỉ lờ tôi đi.

Dường như người chơi đã tải phần đó của video chưa. Tôi thậm chí có thể tìm đến cái không hoàn toàn, chơi qua đến đích thực, sau đó thử lại để tìm kiếm kết thúc, và nó sẽ quay trở lại với cái không hoàn toàn.

Sự thiếu hụt không phải lúc nào cũng là hai giây. Trên một số video của tôi, video hoạt động ít nhiều chính xác, nhảy rất gần với kết thúc thực sự nếu không chính xác với video đó. Trên ít nhất một, nó ngắn tới ba giây. Chiều dài không có vẻ là một yếu tố; tất cả những điều này đều có cùng chiều dài, ngoại trừ một, dài hơn một giờ và tìm kiếm hai giây ngắn.

Vì vậy, tại sao AVPlayer lại nhảy ngắn tới ba giây so với nơi tôi đã nói, và làm cách nào để thuyết phục nó chuyển đến thời điểm tôi yêu cầu?

Trả lời

20

Tôi đã hiểu sai về các dung sai và khiến chúng ngược lại.

Mỗi dung sai là cách xa theo hướng đó AVPlayer được phép di chuyển ra khỏi thời gian được yêu cầu. Vì vậy, vượt qua cực dương cho toleranceBefore là nói "bạn có thể sớm nhất là bạn muốn", và chuyển số không cho toleranceAfter đang nói "chỉ không được muộn" (đó sẽ là một mẹo gọn gàng khi tìm kiếm đến cùng).

Vì vậy, giải pháp là để chuyển đổi các giá trị:

[self.player seekToTime:self.player.currentItem.duration 
     toleranceBefore:kCMTimeZero 
     toleranceAfter:kCMTimePositiveInfinity]; 

Hoặc, bằng tiếng Anh: “Đừng sớm, nhưng bạn có thể lên trễ như bạn muốn.”

+0

cài đặt kCMTimePositiveInfinity cũng giúp tôi tránh việc di chuyển trượt ngược nhỏ này khi tìm kiếm. –

+0

Thật tuyệt vời! –

1

Dưới đây là một phiên bản nhanh chóng của câu trả lời của @Peter Hosey:

self.player.seekToTime(self.player.currentItem.duration, 
      toleranceBefore: kCMTimeZero, 
      toleranceAfter: kCMTimePositiveInfinity) 
Các vấn đề liên quan