2011-01-25 6 views
0

빠르고 쉬운 작업이었던 것 위에 내 머리카락을 뽑아 냈습니다.C# WCF 비디오 증가하는 파일에서 스트리밍?

저는 실시간 비디오 트랜스 코딩을 구현해야하는 자체 호스팅 WCF 서비스를 가지고 있습니다. 트랜스 코딩은 로컬 임시 파일에 FFMpeg를 사용하여 문제가되지 않습니다.

내 코드의 간단한 샘플; 다소 짧은 비디오 파일 :

의 결과로 나는 주위에 해본 적이 -

public Stream StreamMedia(int a) 
{ 
    String input = @"\media\" + a + ".mkv"; 
    String output = @"\temp\transcoded\" + a + DateTime.Now.Ticks.ToString() + ".wmv"; 

    ProcessStartInfo pi = new ProcessStartInfo("ffmpeg.exe"); 
    pi.Arguments = "-i " + input + " -y -ab 64k -vcodec wmv2 -b 800k -mbd 2 -cmp 2 -subcmp 2 -s 320x180 -f asf " + output; 
    Process p = new Process; 
    p.StartInfo = pi; 
    p.Start(); 

    Thread.Sleep(2500); 

    return new FileStream(output, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
} 

내가 직면하고 문제는 반환 된 스트림 만이 반환 된 파일에 기록 된 걸 준다이다 분명한 것은 여기에 있지만, 내가하는 일과 상관없이 그곳에서 사용할 수있는 것을 돌려 줄뿐입니다.

내가해야 할 일은 출력 파일의 실제 현재 길이와 상관없이 스트림을 반환하는 것입니다. FFMpeg가 관리하는 것보다 빠르게 데이터가 클라이언트에 전송되지 않도록하는 다른 코드가 있습니다. 인코딩하려면 기본적으로 개방형 스트림이 필요합니다.

수취인?

답변

0

한 가지 해결책은 디스크에서 파일을 감싸는 사용자 지정 Stream 클래스를 만드는 것입니다. 하지만 동시 처리 문제가 있습니다. 즉, FileStream과 파일을 적절하게 공유하기 위해 쓰기 프로세스 (비디오 트랜스 코더)와 같은 잠금 메커니즘이 필요합니다.

트랜스 코더에서 다중 볼륨 출력을 만들 수 있습니까? 그렇다면 행운이고 이것이 거의 통증없이 작동 할 것입니다. 볼륨 N의 스트리밍을하면 트랜스 코더가 볼륨 N + 1을 쓰고 파일 액세스 동시성 문제는 없습니다.

행복한 코딩! - Adrian

0

가장 간단한 방법은 운영 체제에 내장 된 스트리밍 미디어 서비스를 사용하는 것입니다. 참조 : http://technet.microsoft.com/en-us/windowsserver/dd448620

다른 방법은 파일에서 읽지 않고 파일에 쓰는 스트림을 클라이언트에 곧바로 보냅니다.

+0

내가 지금 시작한 경로를 시작하기 전에 살펴 보았지만 이해할 수있는대로 Windows Server에 의존합니다. 이 시나리오에서는 작동하지 않을 것입니다. Windows 7뿐만 아니라 WHS 상자에서도 실행해야합니다. –

+0

직접 스트림을 보내고 - 내가 FFMpeg에서 파이프 출력을 사용하여 이것을 시도했지만, 이것은 내가 필요로하는 WMV/ASX를 출력 할 수없는 것 같습니다. 또한 잠시 후에 FFMpeg가 멈추는 경우가 거의 없기 때문에 트랜스 코딩이 실제로 끝나지 않았다는 것을 알 수 있습니다. 의견을 보내 주셔서 감사합니다. 많은 의견을 남겨 주셨지만 아직 파일을 스트리밍하는 방법이 있어야한다고 생각합니다. FS에서 직접 열면 정상적으로 진행됩니다. 즉, 현재 진행 상황을 계속 읽습니다. –

0

명백한 것은 파일 시스템을 통해 수행 할 수 없다는 것입니다. 동적 솔루션이 필요합니다.

직접 제작 한 미디어 서비스를 통해 가능합니다. 귀하의 경우에는 WCF 또는 Windows 서비스가 될 수 있습니다.

이 서비스는 파일에 대한 쓰기 (데이터 수신시)와 스트리밍 둘 모두를 담당해야합니다.