2013-02-12 28 views
11

Chúng tôi có một ứng dụng mà chúng tôi đang thực hiện để đáp ứng nhu cầu phát lại tệp video qua AVPlayer. Các tập tin cần phải được lưu trữ trên thiết bị của người dùng, nhưng cũng phải phát lại trong khi tải xuống.Tải xuống AVPlayer và video nâng cao với AVURLAssets

Hiện tại, chúng tôi đã xây dựng mô-đun tải xuống sử dụng thư viện ASIHTTPRequest để tải tệp video qua PHP (chúng tôi không muốn phương tiện được liên kết qua URL công khai) và ghi chúng vào đĩa không đồng bộ.

Sau đó, chúng tôi đã thiết lập AVPlayer theo AV Foundation Programming Guide, nhận tệp bằng AVURLAsset, tạo AVPlayerItem bằng nội dung, tạo AVPlayer với mục đó, sau đó đặt trình phát thành AVPlayerLayer. Trình phát chạy tốt với tệp video được tải xuống đầy đủ và cũng sẽ chạy tệp được tải xuống dần dần hoàn toàn trong trình mô phỏng.

Thật không may trên một thiết bị thực tế, hành vi của người chơi thay đổi, thay vào đó nó dường như tải video một lần và không cố lấy các gói mới từ đĩa. Kết quả là người chơi sẽ phát video và âm thanh đến điểm trong video đánh dấu tiến trình tải xuống là tại thời điểm nội dung được tải (ví dụ: nếu 2MB dữ liệu được lưu vào bộ đệm thì trình phát được tạo, trình phát sẽ chỉ phát đến dữ liệu 2MB). Bởi vì nó có tiêu đề của video, người chơi sẽ vui vẻ tiếp tục nghĩ rằng nó đang phát trong toàn bộ thời lượng của video, nhưng không có video nào khác được hiển thị trên màn hình.

Nếp nhăn cuối cùng là nếu video được chèn vào AVComposition và AVPlayer được tạo với điều đó, video tiến bộ sẽ phát tốt. Đây sẽ là một giải pháp tốt (và thỉnh thoảng là cần thiết cho ứng dụng của chúng tôi) ngoại trừ việc ứng dụng của chúng tôi yêu cầu video có thể phát trên Apple TV qua AirPlay, mà AVCompositions không có khả năng.

Có ai biết liệu có cách nào để phát liên tục tải xuống tệp video bằng AVPlayer được tạo từ AVURLAssets không? Có cách nào để buộc người chơi/playerItem đọc từ đĩa với AVURLCó phải cách nó có vẻ như với AVComposition thay vì dường như lưu bộ nhớ đệm video trong bộ nhớ không?

Cảm ơn!

+0

Bạn đã từng làm việc thông qua vấn đề này chưa? Bạn đã bật phiên bản iOS nào và thay đổi hành vi này bằng (các) phiên bản gần đây hơn? –

+0

Không, tôi vẫn không có giải pháp cho điều này ngoài việc sử dụng AVComposition. Chúng tôi đã sử dụng iOS 5.1 và 6.0 vào thời điểm đó và hành vi vẫn tiếp tục qua 6.1. –

+0

@RobertNall Tôi đang cố gắng làm điều tương tự với AVComposition - bạn có thể xây dựng một chút chính xác cách bạn chèn video vào AVComposition không? Nếu trình phát đạt EOF, phát lại có tiếp tục sau khi có thêm dữ liệu được tải xuống không? –

Trả lời

6

Tôi không có giải pháp để chỉ làm cho nó hoạt động wit AVURLAssets nhưng tôi sử dụng một cách tiếp cận hơi khác nhau. Chúng tôi gói ứng dụng của chúng tôi với CocoaHTTPServer và phát các tệp video không được tải xuống đầy đủ qua một yêu cầu HTTP đối với máy chủ cục bộ.

Máy chủ biết tổng chiều dài của tệp và sau đó có thể quyết định bằng cách xem HTTP-Headers mà một phần của tệp đang yêu cầu và tải nó từ đĩa hoặc từ nguồn từ xa.

Trong khi phát triển điều này ở đó luôn có 3 yêu cầu ban đầu, một cho hai byte đầu tiên của tệp, một trong một đoạn lớn hơn từ đầu tệp và một đoạn trực tiếp ở cuối tệp. Đó là lý do tại sao nó luôn luôn cần thiết để tải ít nhất phần cuối cùng trực tiếp từ máy chủ từ xa vì người chơi sẽ cần nó ngay từ đầu. Tôi đoán điều tương tự cũng xảy ra đối với các tệp cục bộ để trình phát tải các byte cuối cùng từ tệp (không phải là byte cuối cùng bên phải) và sẽ không phát qua độ dài đó.

Bạn sẽ phải phân lớp HTTPConnection và tạo lớp HTTPResponse của riêng bạn bằng cách xem "HTTPAsyncFileResponse" được cung cấp.

Tôi hy vọng điều này sẽ cung cấp cho bạn ý tưởng về cách thực hiện điều này bằng một cách tiếp cận khác.

+0

Khi bạn nhận được phản hồi có chứa đoạn cuối cùng của tệp, bạn có đang viết các byte trống giữa đầu và cuối để trình phát có byte kết thúc ở đúng vị trí không? –

+0

Tôi chỉ ghi vào đĩa phù hợp với kích thước thực của tệp, vì vậy các đoạn từ đầu sẽ được ghi vào đĩa. Nhưng yêu cầu đến cùng sẽ không được trả lại cho người chơi. – Soph

+0

Suy nghĩ về điều này một lần nữa, bạn cũng có thể thử một cái gì đó như thế này: http://aptogo.co.uk/2010/07/protecting-resources/ nhưng thay vì những thứ crypto bạn có thể thực hiện việc đọc/ghi từ xa/địa phương. – Soph