2011-08-21 90 views
9

Tôi đã viết một dịch vụ WCF truyền tệp phương tiện. Tôi hiện đang viết một ứng dụng WPF tiêu thụ dịch vụ này và chỉ phát hiện ra rằng MediaElement không chấp nhận các đối tượng Stream như các tham số đầu vào cho thuộc tính nguồn.Phát video trực tuyến trong WPF

Tôi đã được Googling vô tận trong hai ngày qua và đã xem xét một số lựa chọn thay thế bao gồm Silverlight Viewports bên trong WPF, điều khiển VLC ActiveX, VideoRendererElement và WPFMediaKit. Thật không may tôi đã bị cản trở bởi thiếu tài liệu và/hoặc ví dụ và đã không thực sự thực hiện bất kỳ tiến bộ cho đến nay. Thực tế là đây là lần đầu tiên tôi sử dụng WPF cũng không giúp được gì.

Để đặt nó đơn giản, những gì tôi đang tìm là cái gì đi kèm với tài liệu hoặc ví dụ minh họa streaming trong WPF và, nếu có thể, cũng là đơn giản để thực hiện. Giải pháp không phải là hoàn hảo; tất cả những gì tôi cần là cái gì đó hoạt động.

Trả lời

5

Bạn có thể lưu trữ HttpListener bên trong ứng dụng WPF và cung cấp luồng mà bạn nhận được từ dịch vụ WCF của mình thông qua URL được phục vụ bởi HttpListener đến MediaElement.Source.

Các tùy chọn khác (mặc dù bạn dường như đã loại trừ chúng ra):

Không chắc nếu điều này là một lựa chọn cho bạn, nhưng có những thư viện thương mại cho đa phương tiện bao gồm phát lại video từ các luồng trong WPF:

+0

Các dịch vụ WCF sử dụng bindings TCP, và chạy bên ngoài IIS dưới dạng dịch vụ Windows được quản lý. Tôi có thể sử dụng TcpListener thay vì HttpListener bằng cách nào đó lấy URL của Stream sắp tới không? – rafale

+0

Tôi giả định rằng dịch vụ WCF của bạn trả về aa IStream - NẾU giả định này là đúng thì bạn sẽ chỉ sử dụng lớp proxy WCF để lấy Luồng và sau đó cung cấp luồng đó cho thư viện tôi đã đề cập hoặc chuyển tiếp nó tới URL http bên trong ứng dụng của bạn với HttpListener và yêu cầu MediaElement sử dụng URL http ... Tôi khuyên bạn nên sử dụng một trong các thư viện ... – Yahia

+0

Tôi chưa từng sử dụng lớp HttpListener trước đây, vì vậy tôi không hiểu rõ chuyển tiếp luồng tới URL HTTP. Ý bạn là vậy đúng không? http://pastebin.com/iELVyybp – rafale

0

Có một cách để đạt được điều này bằng cách sử dụng pseudofiles, ví dụ: thi đua của các cuộc gọi hệ thống tập tin.

Khi đường dẫn được truyền, đầu phát media sẽ mở tệp (CreateFile được gọi), sau đó đọc dữ liệu từ tệp đó (ReadFile được gọi), di chuyển vị trí trong tệp (SetFilePointer được gọi).

Nó chỉ di chuyển trong tệp video và đọc các khối bắt buộc.

Ví dụ ở đây mô tả phương pháp này (file cuộc gọi chỉ ánh xạ tới các phương pháp IStream thích hợp: ReadFile -> Đọc, SetFilePointer -> Tìm kiếm, CreateFile -> Clone vv): http://boxedapp.com/encrypted_video_streaming.html

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