문제

내 질문은 네트워크에서 다운로드되는 하드 드라이브에 비디오 파일을 작성하여 Windows Media Player를 사용하여 동시에 재생하는 것입니다. 파일은 꽤 크며 다운로드하는 데 시간이 걸립니다. Windows Media Player로 직접 스트리밍하는 대신 다운로드해야합니다.

일어나는 일은 비디오 파일에 글을 쓰고 자신의 테스트 코드에서 동시에 읽을 수 있지만 Windows Media Player를 사용하여 수행 할 수는 없습니다 (적어도 파악하지 못했습니다). Amazon Unbox 다운로드가 수행하기 때문에 가능하다는 것을 알고 있습니다. Unbox를 사용하면 다운로드하는 동안 WMV를 재생할 수 있습니다. Unbox는 .net으로 작성되었습니다.

나는 "C# 파일 읽기/쓰기 Fileshare가 작동하지 않습니다."Fileshare 플래그가있는 파일을 여는 것에 대한 질문과 답변. 그러나 그것은 나에게는 작동하지 않습니다. 프로세스 모니터는 미디어 플레이어가 Fileshare 플래그로 파일을 열고 있지만 오류가 발생한다고 말합니다.

버퍼링 스레드에는 네트워크에서 파일을 읽고 파일에 쓸 수있는이 코드가 있습니다 (오류 처리 또는 기타 물건이 더 읽을 수 있도록) :

// the download thread
void StartStreaming(Stream webStream, int bufferFullByteCount)
{
    int bytesRead;
    var buffer = new byte[4096];
    var fileStream = new FileStream(MediaFile.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
    var writer = new BinaryWriter(fileStream);
    var totalBytesRead = 0;
    do
    {
        bytesRead = webStream.Read(buffer, 0, 4096);
        if (bytesRead != 0)
        {
            writer.Write(buffer, 0, (int)bytesRead);
            writer.Flush();
            totalBytesRead += bytesRead;
        }
        if (totalBytesRead >= bufferFullByteCount)
        {
            // fire an event to a different thread to tell 
            // Windows Media Player to start playing
            OnBufferingComplete(this, new BufferingCompleteEventArgs(this, MediaFile));
        }
    } while (bytesRead != 0);
}

이것은 잘 작동하는 것 같습니다. 파일은 디스크에 쓰고 올바른 권한이 있습니다.

그러나 비디오를 재생하기 위해 다른 스레드의 이벤트 핸들러

    // the playback thread

private void OnBufferingComplete(object sender, BufferingCompleteEventArgs e)
{
    axWindowsMediaPlayer1.URL = e.MediaFile.FullName;
}

Windows Media Player는 파일을 열고 파일을 "다른 프로세스에서 이미 열 수 없다"는 오류로 중지됩니다.

나는 내가 생각할 수있는 모든 것을 시도했다. 내가 무엇을 놓치고 있습니까? 아마존 사람들이 이것을 할 수 있다면 나도 그렇게 할 수 있습니까?

편집 :이 코드는 Mplayer, VLC 및 Media Player Classic과 함께 작동합니다. Windows Media Player 또는 Windows Media Center Player가 아닙니다. Iow, 내가 함께 일해야 할 유일한 선수. u!

EDIT2 : MINIHTTP를 사용하여 비디오를 Windows Media Player로 스트리밍하여 WMP가 다운로드중인 비디오를 재생하는지 확인하기 위해 갔다. 아무것도하지 않습니다. WMP가 파일을 열었지만 MPEG 파일이 재생되기 전에 완전히 복사 될 때까지 기다렸습니다. 어떻게 알 수 있습니까?

edit3 : 파기 후 나는 문제를 발견했다. MPEG2 파일로 작업하고 있습니다. 문제는 반드시 Windows Media Player와 관련이 없지만 WMP가 재생하고 다운로드하려는 MPEG2 파일을 동시에 열기 위해 사용하는 Microsoft MPEG2 DirectShow 스플리터와 관련이 있습니다. 스플리터는 공유 모드에서 파일을 열어줍니다. WMV 파일은 그렇지 않습니다. WMP는 공유 모드로 열 수 있으며 모든 것이 예상대로 작동합니다.

도움이 되었습니까?

해결책

다른 사람 이이 희귀 한 상황에 빠지는 경우 내 자신의 질문에 대답하기로 결정했습니다.

짧은 대답은 이것입니다 : Windows Media Player (이 글로)를 사용하면 파일 렌더링과 관련된 코덱에 의해 기능이 지원되는 한 파일을 다운로드하고 재생할 수 있습니다.

마지막 편집에서 질문에 이르기까지 :

파기 한 후 나는 문제를 발견했다. MPEG2 파일로 작업하고 있습니다. 문제는 반드시 Windows Media Player와 관련이 없지만 WMP가 재생하고 다운로드하려는 MPEG2 파일을 동시에 열기 위해 사용하는 Microsoft MPEG2 DirectShow 스플리터와 관련이 있습니다. 스플리터는 공유 모드에서 파일을 열어줍니다. WMV 파일은 그렇지 않습니다. WMP는 공유 모드로 열 수 있으며 모든 것이 예상대로 작동합니다.

다른 팁

쓰기를 위해 파일을 열면 fileshare.readwrite를 사용해서는 안됩니다. 대신 fileshare.Read를 사용해야합니다.

var fileStream = new FileStream(
    MediaFile.FullName, FileMode.Create, FileAccess.Write, FileShare.Read);

mplayer.exe 프로세스를 읽을 때 읽기를 위해 파일을 열면 먼저 fileshare.read로 그것을 열어야하지만 실패하지만 fileshare.ReadWrite와 함께 REATTEMPT가 성공할 것입니다.

3 월 16 일 @Darin의 의견 후 업데이트 :

당신은 지정하고 있습니다 FileShare.ReadWrite 이론적으로 다른 프로세스에서도 글쓰기를 위해 파일을 열 수 있습니다.

코드를 변경하여 요청 만 변경하십시오 FileShare.Read:

var fileStream 
    = new FileStream(
        MediaFile.FullName, 
        FileMode.Create, 
        FileAccess.Write, 
        FileShare.Read); // Instead of ReadWrite

인용합니다 MSDN:

Fileshare.Read : 읽기를위한 후속 파일을 열 수 있습니다.

Fileshare.ReadWrite : 읽기 또는 쓰기를 위해 파일을 후속으로 열 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top