2009-05-25 36 views
17

Tôi đang viết một ứng dụng, một phần trong đó cho phép người dùng phát/phát video. Tôi muốn hạn chế chức năng để họ chỉ có thể phát video nếu họ có kết nối WiFi. Sau đó tôi sẽ lưu video để khi họ chỉ có kết nối 3G (hoặc thấp hơn), họ không thể phát video và chỉ có thể phát lại video được lưu trên điện thoại.Đồng thời phát trực tuyến và lưu video?

Lý tưởng nhất, tôi muốn nhận MPMoviePlayerController để phát/phát phim và sau đó truy cập dữ liệu phim và lưu nó. Tuy nhiên, api MPMoviePlayerController dường như không hỗ trợ truy cập vào dữ liệu phim.

Tôi muốn tránh và kịch bản tải xuống khi phát. Ý tưởng nào?

+0

Xin chào, bạn đã thành công với nó chưa? – Bkillnest

Trả lời

11

Hai giải pháp cần lưu ý. Cả hai giải pháp này đều yêu cầu tệp ở định dạng có thể phát tiến bộ, ví dụ: rằng bạn không cần toàn bộ tập tin để có thể chơi nó (nhưng đó cũng là điều kiện tiên quyết).

  1. sử dụng chuỗi để tải xuống dữ liệu và thêm vào tệp và phát tệp từ chuỗi khác. Bây giờ, điều đó đòi hỏi bạn có thể xử lý các sự kiện EOF trong MPMoviePlayerController và tạm dừng phát cho đến khi tệp đệm được nối vào và sau đó tiếp tục cho cùng một điểm.

Cho đến nay những gì tôi thấy mọi người làm việc này không hoạt động vì MPMoviePlayerController không thể xử lý sự kiện EOF. (chưa tự mình thử nghiệm) [Caching videos to disk after successful preload by MPMoviePlayerController

  1. Bỏ qua phát từ tệp và thiết lập máy chủ HTTP cục bộ và phát trực tuyến từ đó (trên máy chủ cục bộ). Điều này cũng không được kiểm tra. Ý tưởng là MPMoviePlayerController sẽ xử lý sự kiện thiếu dữ liệu tốt hơn từ luồng HTTP sau đó đọc trực tiếp tệp. Nhược điểm có thể là nó kém hiệu quả hơn, nhưng tôi nghĩ đó là một sự gia tăng nhỏ trong CPU. Tôi không biết nếu giao diện mạng sẽ xử lý nó, nhưng tôi giả định nó không phải là một vấn đề.

Tôi để lại câu trả lời này dưới dạng wiki, bởi vì tôi không có giải pháp làm việc nhưng tôi cũng muốn một giải pháp.

+2

có ai đã thử điều này chưa? bạn đã thành công chưa – calimarkus

+0

Tôi đang thử phương pháp này ngay bây giờ. Có vẻ như nó có thể hoạt động nhưng không may mắn. Tôi đang sử dụng một ngã ba của CocoaHTTPServer với một 'HTTPAsyncDataResponse' từ dự án này: https://github.com/nickhart/CocoaHTTPServer – vaughan

+0

nó hoạt động? Tôi đã tải xuống nguồn này nhưng không thể – Bkillnest

1

iPhone đang sử dụng tải xuống liên tục để iPhone sẽ không lưu trên thiết bị. Cho rằng bạn cần phải tải xuống một cách rõ ràng và sau đó phát video từ thư mục cục bộ của bạn.

2

Có cách để thực hiện công việc này, nhưng bạn phải viết trình tải xuống HTTP Live Streaming của riêng mình. Về cơ bản, bạn phân tích cú pháp tệp .m3u8 (đó là một tiêu chuẩn khá đơn giản, nhưng có thể phức tạp với các luồng thay thế và khả năng luồng sẽ đơn giản thả ra và cần một danh sách phát mới để tiếp tục) và sau đó tải xuống các khối trong Định dạng .ts cho bộ nhớ cục bộ của bạn, ví dụ thư mục Tài liệu hoặc Bộ nhớ cache, v.v.

Sau đó, bạn sẽ phải thiết lập máy chủ HTTP cục bộ để cho phép MPMoviePlayerController hoặc AVPlayer truy cập các tệp qua HTTP (vì chúng sẽ không chạm vào đường dẫn tệp cục bộ), bao gồm tệp danh sách phát được mã hóa lại trỏ đến tệp cục bộ, bạn sẽ phải tự tạo cho mình từ (các) danh sách phát gốc. CocoaHTTPServer hoạt động tốt cho việc này.

Khi bạn đã hoàn thành tất cả những điều đó, nó hoạt động tuyệt vời. Không thể tránh khỏi khi bạn tải xuống đoạn đầu tiên trước khi trình bày URL HTTP cục bộ của mình cho trình phát phim, nhưng sau đó bạn sẽ tải xuống liên tục, ghi và phát lại xem trước.

Chúc may mắn!

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