2009-04-05 3 views
3

저는 비디오 podcast에 대한 지원을 미디어 브라우저에 추가하는 데 정말로 관심이있었습니다.TCP 소켓을 사용하여 로컬에서 비디오 프록 싱

사용자가 사용 가능한 비디오 Podcast를 탐색하여 인터넷에서 스트리밍 할 수있게하고 싶습니다. 미디어 플레이어 등이 클라우드에있는 파일을 행복하게 재생할 수있는 이유는 간단합니다.

문제는 이러한 파일을 로컬로 캐시하여 동일한 에피소드의 후속보기가 스트리밍을 포함하지 않고 대신 로컬 파일을 재생한다는 것입니다.

그래서 ... HttpListener을 호스트하지 말고 미디어 플레이어가 파일의 일부를 요청하면 HttpListener을 로컬로 다운로드하여 저장해야합니다. 다음에 사용자가 파일을 재생하면 이미 파일의 일부가 로컬에 저장됩니다.

누구든지 프록시 용으로 HttpListener을 사용하는 예제 코드를 알고 있습니까?

편집

아이디어는 MP3 또는 mov 인 같은 프록시 간단한 스트리밍 콘텐츠에 대한 것입니다. 현상금은 실제 구현으로 이동합니다. 여기

는 API입니다 내가 좋아하는 것 :

// will proxy a uri on the local port, if cacheFile exists it will resume the 
// download from cacheFile. 
// while the file is downloading it will be name cacheFile.partial, after the 
// download is complete the file will be renamed to cacheFile. 
// Example usage: ProxyFile("http://media.railscasts.com/videos/176_searchlogic.mov", 8000, @"c:\downloads\railscasts\176_searchlogic.mov") 
// 
// Directly after this call http://localhost:8000 will be the proxy stream, it will be playable locally. 
void ProxyUri(Uri uri, int port, string cacheFile) 

편집 2

HttpListener 꽤 가망 찾고 HttpListener의가 보인다 나는 아마 TCP 소켓 수준에서 작업을 수행해야합니다 프로그램이 정말 까다로울 수있는 관리자로 실행되도록 요구합니다.

+0

구현을 제공하기 전에 ... 요구 사항을 명확히하고 싶습니다. 프록 싱뿐만 아니라 다운로드하는 콘텐츠의 캐싱을 제공하여 사용자가 놀고 싶어 할 때마다 콘텐츠를 왕복 할 필요가없는 것처럼 들리지만 ... 맞습니까? –

+0

@ Justin, 예, 완전히 api로 확장됩니다. –

+0

본인의 답변을 요지로 연결되는 링크로 업데이트했습니다. –

답변

3

이전에 HttpListener으로 아무 것도하지 않았으므로,이 방법을 사용하면 속도가 빨라질 수있는 좋은 운동이 될 것이라고 생각했습니다. 나는 당신이 지정한 ProxyUri 함수의 매개 변수를 취하는 생성자를 가진 하나의 ProxyListener 클래스로 구현했다.인스턴스를 얻은 후에는 Start 메서드를 호출하여 인스턴스를 시작 (잠재적으로 다운로드) 할 수 있습니다. 작업이 끝나면 Cleanup으로 전화하십시오.

거친 가장자리가 하나 또는 두 개 있지만 기본적으로 질문에 따라 작동합니다. 이를 테스트하기 위해 Program 클래스를 사용하여 콘솔 응용 프로그램으로 만들었습니다.이 클래스는 (uri, port, filename)으로 구성된 입력 행을 공백으로 구분하고 ProxyListener 인스턴스를 만들고 시작합니다. 이 콘솔 응용 프로그램을 실행하고 적절한 행을 입력하면 다운로더가 시작되어 콘솔에 진행률을 인쇄 할 수 있습니다. 동시에 할 수 있습니다. IE를 실행하고 지정한 포트에서 파일을 가져 오면 다운로더가 작동하는 동안 다운로드 할 수 있습니다. "업 로더"진행 상황도 콘솔에 출력됩니다.

크기가 크기 때문에 여기에 붙여 넣기가 약간 어려울 수 있습니다. 크기는 크지 만 일반적으로 여기 보이는 스 니펫보다 큽니다. ProxyListener 클래스는 200 줄 아래에 있습니다. 재미 있다고 들리니? 그렇다면, 나는 그것을 pastebin에 게시하고이 대답을 링크로 업데이트 할 것입니다.

업데이트 : 게시자 : gist.

HttpListener에 필요하기 때문에 프로그램을 실행하려면 관리자 권한이 필요합니다.

업데이트 2 : 특정 상황에서 HttpListener을 실행하려면 관리자 권한이 필요하지 않습니다. this linkthis one을 참조하십시오. 아이디어는, 설치하는 동안 URL 네임 스페이스를 예약 할 수 있다면, 사용자는 네임 스페이스를 경청하는 경우 관리자 권한이 필요 없다는 것입니다.

+0

그래서 코드의 긴 스 니펫에는 악명이 높습니다. http://gist.github.com/ 대신 요지를 게시하십시오. mediabrowser (www.mediabrowser.tv)에서이 코드를 사용하면 신경 쓸 필요가 있습니다. –

+0

아니요, 저는 '정신 없습니다. 결국, 당신은 당신의 질문에 그것을 언급했습니다. –

+0

그것은 내가 원하는 것과 같이 도전적으로 보이지만 (여전히 지원을 재개하면 아주 좋을 것입니다.) 다른 사람들에게도이 기회가 주어질 것입니다. 그러나 앞으로 48 시간 내에 다른 해결책이 없다면 나는 당신에게 현상금을 수여 할 것입니다. ... 참고로, 코드는 GPL하에 라이센스되어 있으며, 프로젝트는 MIT에 들어가 있으므로 라이센스 계산상의 문제가 있습니다. –

0

스트리밍은 저장하도록 설계되지 않았으며 이러한 프로토콜도 매우 맞춤화되어 있으며 구현하기가 매우 복잡하므로 스트리밍 세션은 모방하기 매우 어려울 많은 검증과 동기화를 수행합니다. 물론 그것은 불가능한 일이 아니라 매우 중요한 일입니다. 다른 방법은 로컬 미디어 파일로 읽고 저장하는 것입니다.이를 참조로 사용하십시오. Windows Media 인코더를 사용하여 스트림을 읽고 스트림 데이터를 로컬 파일로 쓸 수 있기 때문에 여전히 복사 방지 데이터를 허용하지 않을 수 있습니다.

+0

Akash, 프록시 스트림을 다운로드 할 수있는 파일로만 보려고하지 않습니다. 예를 들어 .. http://www.somewhere.com/xyz.wmv, 많은 형식 예. mp3는 전체 파일을 다운로드하기 전에 사용할 수 있습니다. –

0

캐싱 기능이있는 HTTP 프록시 사용을 고려 했습니까?

처럼 :

도 참조 위키 피 디아

당신이 당신의 응용 프로그램은 웹 캐시 구성 요소를 가지고 싶다면

@ Web Cache, 내가 제안 .NET에서 Web Cache 구현을 찾는다. 그것을 처음부터 코드화하지 마십시오.

+0

아니, 최소한의 구성으로. NET 응용 프로그램과 함께 이것을 배포하고 싶습니다. –

관련 문제