私の質問は、ネットワークからダウンロードされているハード ドライブにビデオ ファイルを書き込み、Windows Media Player を使用して同時に再生することについてです。ファイルはかなり大きく、ダウンロードに時間がかかります。Windows Media Player に直接ストリーミングするだけでなく、ダウンロードする必要があります。
何が起こるかというと、自分のテスト コードからビデオ ファイルへの書き込みと読み取りを同時に行うことはできますが、Windows Media Player を使用してそれを行うことはできません (少なくとも、私はそれを理解していません)。Amazon Unbox のダウンロードがそれを行うので、それが可能であることはわかっています。Unbox を使用すると、ダウンロード中に WMV を再生できます。Unbox は .NET で書かれているので...
FileShare フラグを使用してファイルを開くための「C# ファイルの読み取り/書き込みファイル共有が機能していないようです」の質問と回答を読みました。しかし、それは私にとってはうまくいきません。Process Monitor は、Media Player が 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 プレーヤーではありません。IOW、私が彼らと一緒に仕事をする必要がある唯一のプレーヤー。うーん!
edit2: MiniHttp を使用してビデオを Windows Media Player にストリーミングし、ダウンロード中のビデオを再生するために WMP を「だます」かどうかを確認するところまで行きました。何もしていません。WMP がファイルを開いている間、再生を開始する前に mpeg ファイルが完全にコピーされるまで待機していました。それはどのように知っていますか?
edit3:掘り下げた後、問題を発見しました。MPEG2ファイルを扱っています。問題は必ずしも Windows Media Player にあるとは限りませんが、再生とダウンロードを同時に行おうとしている MPEG2 ファイルを開くために WMP が使用する Microsoft MPEG2 DirectShow Splitter に問題があります。スプリッターはファイルを非共有モードで開きます。WMV ファイルではそうではありません。WMP はそれらを共有モードで開き、すべてが期待どおりに機能します。