Lưu ý, đối với câu hỏi dưới đây: Tất cả nội dung đều là cục bộ trên thiết bị - không có mạng trực tuyến nào diễn ra. Các video chứa các bản âm thanh.
Tôi đang làm việc trên một ứng dụng iOS yêu cầu phát tệp video với độ trễ tối thiểu để bắt đầu video clip được đề cập. Thật không may, chúng tôi không biết video clip cụ thể nào tiếp theo cho đến khi chúng tôi thực sự cần khởi động nó. Cụ thể: Khi một video clip đang phát, chúng ta sẽ biết bộ (đại khái) 10 video clip tiếp theo là gì, nhưng chúng ta không biết chính xác cái nào, cho đến khi 'phát ngay' đoạn tiếp theo.
Những gì tôi đã làm để xem xét độ trễ khi bắt đầu thực tế là gọi addBoundaryTimeObserverForTimes
trình phát video, với khoảng thời gian là một phần nghìn giây để xem thời điểm video thực sự bắt đầu phát và tôi lấy sự khác biệt của dấu thời gian đó với vị trí đầu tiên trong mã cho biết nội dung nào sẽ bắt đầu chơi.
Từ những gì tôi đã thấy cho đến nay, tôi nhận thấy rằng việc sử dụng kết hợp AVAsset
tải và sau đó tạo một AVPlayerItem
từ đó khi nó đã sẵn sàng và sau đó chờ AVPlayerStatusReadyToPlay
trước khi tôi gọi phát, có xu hướng mất từ 1 đến 3 giây để bắt đầu kẹp.
Kể từ đó, tôi đã chuyển sang thứ mà tôi nghĩ gần như tương đương: gọi điện [AVPlayerItem playerItemWithURL:]
và chờ AVPlayerItemStatusReadyToPlay
chơi. Hiệu suất gần giống nhau.
Một điều tôi đang quan sát là tải mục AVPlayer đầu tiên chậm hơn phần còn lại. Có vẻ như một ý tưởng là chạy trước AVPlayer với nội dung ngắn / trống trước khi cố gắng phát video đầu tiên có thể là thông lệ tốt. [ Khởi động chậm cho AVAudioPlayer trong lần đầu tiên phát âm thanh
Tôi muốn giảm thời gian bắt đầu video xuống càng nhiều càng tốt và có một số ý tưởng về những điều cần thử nghiệm, nhưng tôi muốn một số hướng dẫn từ bất kỳ ai có thể giúp đỡ.
Cập nhật: ý tưởng 7, bên dưới, khi được triển khai mang lại thời gian chuyển đổi khoảng 500 mili giây. Đây là một cải tiến, nhưng sẽ rất tuyệt nếu bạn làm được điều này nhanh hơn nữa.
Ý tưởng 1: Sử dụng N AVPlayers (sẽ không hoạt động)
Sử dụng ~ 10 AVPPlayer
đối tượng và bắt đầu và tạm dừng tất cả ~ 10 clip, và khi chúng tôi biết mình thực sự cần cái nào, hãy chuyển sang và bỏ tạm dừng đúng AVPlayer
, và bắt đầu lại cho chu kỳ tiếp theo.
Tôi không nghĩ rằng điều này hoạt động, bởi vì tôi đã đọc có khoảng giới hạn 4 hoạt động AVPlayer's
trong iOS. Có ai đó hỏi về điều này trên StackOverflow ở đây và đã tìm hiểu về giới hạn 4 AVPlayer: chuyển đổi nhanh-giữa các video-sử dụng-avfoundation
Ý tưởng 2: Sử dụng AVQueuePlayer (sẽ không hoạt động)
Tôi không tin rằng việc nhét 10 AVPlayerItems
vào một AVQueuePlayer
sẽ tải trước tất cả chúng để bắt đầu liền mạch. AVQueuePlayer
là một hàng đợi và tôi nghĩ nó thực sự chỉ làm cho video tiếp theo trong hàng đợi sẵn sàng để phát lại ngay lập tức. Tôi không biết video nào trong số ~ 10 video mà chúng tôi muốn phát lại, cho đến khi bắt đầu video đó. ios-avplayer-video-tải trước
Ý tưởng 3: Tải, Phát và giữ lại AVPlayerItems
trong nền (chưa chắc chắn 100% - nhưng có vẻ không đẹp)
Tôi đang xem liệu có lợi ích gì khi tải và phát giây đầu tiên của mỗi video clip trong nền (ngăn chặn đầu ra video và âm thanh), đồng thời giữ tham chiếu đến từng video AVPlayerItem
và khi chúng tôi biết mục nào cần được phát thực, hoán đổi cái đó trong và hoán đổi AVPlayer nền với cái đang hoạt động. Rửa sạch và lặp lại.
Lý thuyết cho rằng những bản phát gần đây AVPlayer/AVPlayerItem
vẫn có thể chứa một số tài nguyên đã chuẩn bị sẵn để làm cho việc phát lại sau đó nhanh hơn. Cho đến nay, tôi chưa thấy lợi ích từ điều này, nhưng có thể tôi chưa AVPlayerLayer
thiết lập chính xác cho nền. Tôi nghi ngờ điều này sẽ thực sự cải thiện mọi thứ từ những gì tôi đã thấy.
Ý tưởng 4: Sử dụng một định dạng tệp khác - có thể là một định dạng tải nhanh hơn?
Tôi hiện đang sử dụng định dạng H.264 của .m4v (video-MPEG4). H.264 có rất nhiều tùy chọn codec khác nhau, vì vậy có thể một số tùy chọn được tìm kiếm nhanh hơn những tùy chọn khác. Tôi nhận thấy rằng việc sử dụng các cài đặt nâng cao hơn làm cho kích thước tệp nhỏ hơn sẽ làm tăng thời gian tìm kiếm, nhưng không tìm thấy bất kỳ tùy chọn nào theo hướng khác.
Ý tưởng 5: Kết hợp định dạng video không mất dữ liệu + AVQueuePlayer
Nếu có một định dạng video tải nhanh nhưng có thể kích thước tệp quá lớn, một ý tưởng có thể là chuẩn bị trước 10 giây đầu tiên của mỗi video clip với một phiên bản cồng kềnh nhưng tải nhanh hơn, nhưng quay lại với nội dung được mã hóa trong H.264. Sử dụng AVQueuePlayer và thêm 10 giây đầu tiên ở định dạng tệp không nén và tiếp theo với định dạng tệp ở H.264, có thời gian chuẩn bị / tải trước lên đến 10 giây. Vì vậy, tôi muốn nhận được 'điều tốt nhất' của cả hai thế giới: thời gian bắt đầu nhanh, nhưng cũng được hưởng lợi từ định dạng nhỏ gọn hơn.
Ý tưởng 6: Sử dụng AVPlayer không chuẩn / viết của riêng tôi / sử dụng của người khác
Theo nhu cầu của tôi, có lẽ tôi không thể sử dụng AVPlayer, nhưng phải sử dụng AVAssetReader và giải mã trong vài giây đầu tiên (có thể ghi tệp thô vào đĩa) và khi phát lại, hãy sử dụng định dạng thô để phát nó trở lại nhanh chóng. Có vẻ như đây là một dự án lớn đối với tôi, và nếu tôi thực hiện nó một cách ngây thơ, thì nó không rõ ràng / thậm chí không có khả năng hoạt động tốt hơn. Mỗi khung video được giải mã và không nén là 2,25 MB. Nói một cách ngây thơ - nếu chúng tôi sử dụng ~ 30 khung hình / giây cho video, tôi sẽ kết thúc với yêu cầu đọc từ đĩa ~ 60 MB / s, điều này có lẽ là không thể / đẩy được. Rõ ràng là chúng ta sẽ phải thực hiện một số cấp độ nén hình ảnh (có lẽ là định dạng nén openGL / es bản địa thông qua PVRTC) ... nhưng điều đó thật điên rồ. Có lẽ có một thư viện ngoài đó mà tôi có thể sử dụng?
Ý tưởng 7: Kết hợp mọi thứ thành một nội dung phim duy nhất và seekToTime
Một ý tưởng có thể dễ dàng hơn một số ý tưởng ở trên, là kết hợp mọi thứ vào một bộ phim duy nhất và sử dụng seekToTime. Vấn đề là chúng tôi sẽ nhảy khắp nơi. Thực chất là truy cập ngẫu nhiên vào phim. Tôi nghĩ điều này thực sự có thể giải quyết ổn thỏa: avplayer-movie-play-lag-in-ios5
Bạn nghĩ cách tiếp cận nào sẽ là tốt nhất? Cho đến nay, tôi đã không đạt được nhiều tiến bộ trong việc giảm độ trễ.