2015-05-20 41 views
8

AVPlayer có một thuộc tính được gọi là rate có nghĩa là để kiểm soát tốc độ phát lại. 1.0 là tốc độ bình thường trong khi các giá trị như 2.0 hoặc 5.0 sẽ phát lại ở 2x và 5x tương ứng.Làm thế nào để bạn có thể phát lại tốc độ cao mượt mà từ AVPlayer?

Bất cứ khi nào tôi đặt giá trị tốc độ phát lại cao hơn 1.0 (giả sử 10.0), phát lại rất bị thay đổi và có vẻ như một số lượng lớn khung hình bị giảm xuống do trình phát không thể theo kịp.

Tuy nhiên, các giá trị giống nhau trong QuickTime Player (với cùng một bộ phim), phát lại mượt mà với tốc độ 2x, 5x, 10x, 30x and 60x (như được báo cáo bởi Trình phát QuickTime).

Tôi đã tạo một ứng dụng OS X thử nghiệm không chứa gì hơn AVPlayerView và hai nút để cài đặt tốc độ phát lại. Tốc độ 1.0 hoạt động như mong đợi, nhưng tỷ lệ 10.0 sẽ phát lại rất khó.

Tuy nhiên, AVPlayerView có một đứa lẻ ở chỗ nếu bạn di chuột click vào dòng thời gian phát lại để tìm kiếm một vị trí khác (trong khi nó đang chơi ở 10x và choppy), sau đó các AVPlayerView sẽ "sửa chữa" phát lại và bộ phim sẽ được chơi trơn tru ở mức 10x. Tất cả nó đã được nhấp vào thời gian phát lại.

Có ai biết cách phát lại mượt mà với các mức giá không phải là 1x không? Nó rõ ràng không phải là một vấn đề phần cứng hoặc một vấn đề kích thước tập tin bởi vì cả hai QuickTime Player và AVPlayerView có thể làm điều đó.

Nỗ lực

question Điều này cho thấy rằng nó có thể là một vấn đề âm thanh (và thực sự cả QuickTime Player và AVPlayerView tắt âm thanh khi chuyển tiếp) nhưng tất cả những nỗ lực trên một phần của tôi cho một trong hai vô hiệu hóa tất cả các âm thanh, tắt tiếng tất cả theo dõi hoặc thay đổi thuật toán âm thanh sân dường như không tạo nên sự khác biệt. Phát lại vẫn bị thay đổi ngay cả khi không có âm thanh.

Tôi cũng đã cố dừng phát lại và sau đó gọi prerollAtRate:completionHandler với tỷ lệ mới nhưng điều đó cũng không tạo ra sự khác biệt.

Trình phát QuickTime và AVPlayerView đang làm gì cho phép phát lại phim mượt mà ở tốc độ 10x, 30x hoặc thậm chí 60x?

+1

Bạn có tìm thấy bất kỳ giải pháp cho vấn đề này? Nếu vậy, thì đó là cái gì? –

+0

Không, xin lỗi. Tôi đã phải xây dựng giải pháp của riêng mình, nhưng nó không tốt như tôi muốn. Về lâu dài, tôi nghĩ trải nghiệm phát lại tốt nhất sẽ yêu cầu đào sâu hơn và xử lý giải mã khung bên ngoài bằng cách sử dụng AVPlayer. – kennyc

+0

Theo macro 10.12.3/Xcode 8.2.1, tôi đã xác nhận một số điều trên: tăng tốc lên đến 2.0 không có vấn đề gì nhưng thiết lập 'AVPlayer.rate' thành giá trị lớn hơn 2.0 khiến phát lại bị giật; sử dụng AVPlayerView để thay đổi kết quả tốc độ phát lại trong việc phát lại mượt mà cho tất cả các tốc độ; đặt tỷ lệ đầu tiên thành 0.0 và sau đó gọi 'prerollAtRate (atRate :, completionHandler:)' và đặt tốc độ cao trong trình xử lý hoàn thành không giải quyết được vấn đề; tạo một AVMutableComposition chỉ với đoạn video không giải quyết được vấn đề; vô hiệu hóa bản âm thanh không giải quyết được sự cố. – Jamborino

Trả lời

0

Đây chỉ là giải pháp thay thế.

Khi tốc độ phát lại thay đổi từ 0.0 thành giá trị lớn, nếu đây là lần chuyển tiếp zero-to-nonzero đầu tiên theo tỷ lệ phát lại từ lần gọi cuối đến AVPlayer.replaceCurrentItem, phát lại mượt mà (và âm thanh tự động tắt tiếng). Điều cần thiết là đây là lần đầu tiên chuyển đổi như vậy: chỉ đặt tỷ lệ thành 0.0 trước và sau đó với tỷ lệ mong muốn không hoạt động.

Vì vậy, ví dụ, điều này sẽ tạo ra khả năng chơi mượt ở tốc độ cao:

func setPlayerRate(player: AVPlayer, rate: Float) { 
    // AVFoundation wants us to do most things on the main queue. 
    DispatchQueue.main.async { 
     if (rate == player.rate) { 
      return 
     } 
     if (rate > 2.0 || rate < -2.0) { 
      let playerItem = player.currentItem 
      player.replaceCurrentItem(with: nil) 
      player.replaceCurrentItem(with: playerItem) 
      player.rate = rate 
     } else { 
      // No problems "out of the box" with rates in the range [-2.0,2.0]. 
      player.rate = rate 
     } 
    } 
} 
+0

Trao đổi ra AVPlayerItem, hoặc theo dõi lại thời gian phương tiện truyền thông trong một AVComposition đều cách hợp lệ, nếu không nặng tay, lúc nhận được phát lại mượt mà hơn. Tuy nhiên, chúng không phải là giải pháp tuyệt vời nếu bạn muốn cho phép người dùng thay đổi tốc độ phát lại trong khi phát lại trực tiếp. Hành vi như vậy là phổ biến trong các ứng dụng video có quay số "chạy bộ". Mẫn của QuickTime Player gợi ý (mặc dù chưa được xác nhận) rằng đối với một số lãi phát lại nó được thực hiện cuộc gọi lặp đi lặp lại cho 'seekTime ...', khả năng slaved ra một timebase tùy chỉnh và có thể thực hiện một số giải mã/bộ nhớ đệm thủ đoạn gian trá cho hiệu suất tốt hơn. – kennyc

+0

... Và thay đổi tốc độ phát lại một cách dễ dàng thực sự là điều mà tôi muốn có thể làm! Bây giờ bạn đã đề cập đến nó, tôi đã xây dựng một thứ hiển thị xem trước phim giống như cách mà Final Cut Pro X thực hiện, khi bạn di chuột qua chúng, các ô trong một trang hình thu nhỏ hiển thị video. Tôi cảm thấy thất vọng vì nó hoạt động rất tốt, ngay cả khi ném chuột xung quanh, và điều này thì không. Tôi đã không đủ thông minh để nghĩ đến việc áp dụng seekTime theo cách này. Cảm ơn! Tôi sẽ thử. Điều đó cũng sẽ phá vỡ lỗi mà một số thông báo bị mất khi phát lại ở tốc độ cao. – Jamborino

+0

Đối với một hình thu nhỏ video nhỏ mà người dùng có thể chà qua bằng cách chỉ cần di chuyển chuột qua nó, có thể bạn sẽ nhận được nhiều hơn thực hiện đầy đủ bằng cách chơi xung quanh với thời gian bạn tìm cách và khả năng chịu đựng cho phép. Giải mã gần như tức thời nếu bạn tìm kiếm một "khung chính" thay vì một thời gian tùy ý. Vì độ chính xác thời gian không thực sự quan trọng trong bản xem trước video, bạn có thể muốn xem xét xoa bóp thời gian bạn tìm kiếm để nó rơi vào hoặc rất gần với khung chính. Xem TechNote 'TN2404' để biết thêm chi tiết về cách sử dụng' AVSampleCursor' để xác định các khung hình chính. – kennyc

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