2013-08-12 4 views
1

MediaElement를 사용하는 서버에서 파일 (비디오 또는 오디오 유형)을 재생하고 동시에 특정 파일 위치에 데이터를 저장하면 다음에 한 번 로컬 시스템에서 직접로드 할 수 있습니다. WPF 미디어 요소를 사용하여 내 프로젝트에서WPF MediaElement 재생 중 파일 다운로드

답변

1

직접적인 방법은 없습니다. 가능합니다 - 적어도 두 가지 방법으로 할 수 있습니다. 그러나 쉽지 않습니다.

Windows Media Player를 내부적으로 사용하므로 (실행중인 Windows 버전에 따라 MediaFoundation 또는 DirectShow를 사용한다는 것을 의미하므로) 소스 스트림을 처리하는 방법에 간섭하는 것이 까다로울 수 있습니다. MediaElement은 .NET 스트림에서 작동하지 않으므로 디스크에 저장하는 동안 기본 스트림을 중계하는 일종의 인터셉터를 작성하는 '명백한'솔루션이 가능하지만 .NET의 세계를 떠나야합니다. .

그건 불가능하다는 말은 아닙니다. 간단히 사용자 정의 소스 필터를 작성하고 사용자 정의 프로토콜 구현으로 설정해야합니다. http://msdn.microsoft.com/en-us/library/ms787558(VS.85).aspx은 비디오 렌더링 인프라가 전달 된 URL을 기반으로 비디오 소스를 나타 내기 위해 어떤 종류의 객체를 만들지 결정하는 방법을 설명합니다. MediaElement은 소스 URL을이 기본 인프라에 직접 전달하므로 사용자 정의 필터를 작성하여 연결하면 예를 들어 myhack: 프로토콜을 사용하는 경우 소스를 설정하면 myhack://whatever, 필터가로드됩니다. 그런 다음 필터를 http: 필터 주위에 래퍼로 ​​만들면 들어오는 데이터의 복사본을 디스크에 저장할 수 있습니다.

이것은 중요하지 않습니다.

로컬 HTTP 서버를 호스팅 할 수도 있습니다. 수신 대기 할 수있는 로컬 소켓을 여는 옵션이있는 경우 .NET의 기본 제공 HTTP 클라이언트 유형 중 하나를 사용하여 데이터를 가져오고 복사본을 저장하고 해당 데이터를 처리하는 HTTP 구현을 작성할 수 있습니다 . 이것은 또한 사소한 일이지만 사용자 정의 소스 필터를 작성하는 것보다 쉽습니다.

0

다운로드를 시작하기 전에 다운로드 파일의 파일 크기를 설정하면 다운로드하는 동안 MediaElement이 전체 비디오/오디오를 재생합니다.

using (var httpClient = new HttpClient() {Timeout = TimeSpan.FromMinutes(25)}) 
using (var response = await httpClient.GetAsync(theDownloadUrl, HttpCompletionOption.ResponseHeadersRead)) 
using (var videoFileStream = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read)) { 
    videoFileStream.SetLength(response.Content.Headers.ContentLength.GetValueOrDefault()); 
    var copying = response.Content.CopyToAsync(videoFileStream); 
    //await Task.Delay(1000); 
    MediaSource = fileName; 
    await copying; 
}