2012-08-10 14 views
11

Tôi muốn phát lại video trong AVPlayer. Tôi đã thử với thay đổi tỷ lệ tài sản để -1.0, và mặc dù nó đã làm việc nó đã không được mịn màng. Có cách nào để tôi có thể chơi video một cách trôi chảy không?Phát lại video ngược trong iOS

+4

việc chơi video là một điều thú vị, bởi vì video có khung hình ở mỗi khung X, và các khung giữa các khung hình chính chỉ là lưu trữ những thay đổi của hình ảnh từ khung hình trước đó (không phải toàn bộ khung hình). để phát lại một video không chỉ là thay đổi thứ tự của các khung hình, bởi vì các khung hình có mối quan hệ với khung hình trước đó (không phải với hình tiếp theo!) và nói chung, bạn không thay đổi thứ tự của các khung hình để có được phiên bản ngược lại, hầu hết các trường hợp bạn phải kết xuất lại video. đây là lý do chung khiến bạn gặp sự cố với video. – holex

+0

Câu hỏi rất thú vị. – Daniel

+1

Cảm ơn bạn. Bạn có thể gợi ý cho tôi bất kỳ giải pháp nào để phát lại video không? –

Trả lời

6

Như đã nêu trong phần nhận xét, sự cố xảy ra với khung hình chính và thực tế là hầu hết các codec không được thiết kế để phát lại. Có 2 tùy chọn để mã hóa lại video không yêu cầu bạn thực sự đảo ngược video khi chỉnh sửa.

  1. Đặt mọi khung hình thành khung hình chính. Tôi đã nhìn thấy điều này làm việc tốt cho các codec như H.264 dựa trên khung hình chính. Về cơ bản, nếu mỗi khung hình là một khung hình chính, thì mỗi khung hình có thể được giải mã mà không dựa vào bất kỳ khung hình nào trước đó, vì vậy nó có hiệu quả giống như chơi về phía trước.
  2. Sử dụng codec không sử dụng khung hình chính và khung hình không chính (về cơ bản tất cả khung hình luôn là khung hình chính). PhotoJPEG là một trong những lựa chọn như vậy, mặc dù tôi không hoàn toàn chắc chắn nếu nó phát lại trên iOS. Tôi sẽ nghĩ như vậy. Nó hoạt động tốt trên máy Mac.

Lưu ý rằng một trong các tùy chọn này sẽ dẫn đến kích thước tệp lớn hơn so với video được mã hóa "keyframe mỗi x khung" điển hình.

0

Bạn phải tiếp cận ở cuối mục hiện tại và sau đó đặt tỷ lệ thành giá trị âm. Một cái gì đó như thế này:

-(void)reversePlay { CMTime durTime = myPlayer.currentItem.asset.duration; if (CMTIME_IS_VALID(durTime)) { [myPlayer seekToTime:durTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; [myPlayer setRate:-1.0]; } else NSLog(@"Invalid time"); }

nguồn: https://stackoverflow.com/a/16104363/701043