下载过程中的Windows Media Player播放大文件
-
22-07-2019 - |
题
我的问题是关于写一个视频文件到被从网络上下载的硬盘驱动器,并使用Windows Media Player在同一时间播放。该文件是相当大的,将需要一段时间才能下载。这是需要下载它,而不是仅仅流直接就到Windows Media Player。
实际情况是,虽然我可以写的视频文件,并在同一时间,从我自己的测试代码,阅读它,它不能使用Windows Media Player(至少我还没有计算出来)来完成。我知道这是可以做到的,因为亚马逊的Unbox下载做的。拆箱让你玩WMVs而它下载它们。并且拆箱是写在.NET等等...
我读过“ C#文件读/写文件共享没有出现工作”问题和答案打开文件与文件共享标志。但它不是为我工作。进程监视器说,媒体播放器打开与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,和媒体播放器经典;只是没有Windows Media Player或Windows Media Center的播放器。 IOW,我需要他们一起工作的唯一球员。啊!
EDIT2: 我竟然用MiniHttp流式传输视频到Windows Media Player,看看是否会“傻瓜” WMP播放到正被下载的视频去了。无所事事。虽然没有WMP打开文件时,它一直等到前开始播放MPEG文件被完全复制。它怎么知道?
EDIT3: 一些挖后,我发现这个问题。我与MPEG2文件的工作。这个问题并不一定是Windows媒体播放器,但与微软DirectShow的MPEG2分路器WMP使用打开我想播放和下载在同一时间的MPEG2文件。分离器在打开的非共享模式中的文件。不是这样的WMV文件。 WMP打开他们在共享模式,一切都按预期工作。
解决方案
我决定回答万一有人我自己的问题别人运行到这一罕见的情况。
在简短的回答是这样的:Windows媒体播放器(在本文写作)将允许要下载的文件,并且只要在同一时间发挥该功能是通过在渲染中涉及的文件编解码器支持
。要从最后的编辑的问题引述如下:
一些挖后,我发现这个问题。我与MPEG2文件的工作。这个问题并不一定是Windows媒体播放器,但与微软DirectShow的MPEG2分路器WMP使用打开我想播放和下载在同一时间的MPEG2文件。分离器在打开的非共享模式中的文件。不是这样的WMV文件。 WMP打开他们在共享模式,一切都按预期工作。
其他提示
当你打开文件进行写你不应该使用FileShare.ReadWrite。您应该改用FileShare.Read:
var fileStream = new FileStream(
MediaFile.FullName, FileMode.Create, FileAccess.Write, FileShare.Read);
当mplayer.exe进程打开文件进行读取,会先尝试与FileShare.Read打开它,这将失败,但它随后将与FileShare.ReadWrite重新尝试将成功。
通过@darin评论后3月16日更新:
您要指定FileShare.ReadWrite
当你写的文件,理论上允许另一个进程打开它写了。
尝试改变您的代码只请求FileShare.Read
:
var fileStream
= new FileStream(
MediaFile.FullName,
FileMode.Create,
FileAccess.Write,
FileShare.Read); // Instead of ReadWrite
要报价 MSDN :
FileShare.Read:允许随后 该文件的开口,用于读取。
FileShare.ReadWrite:允许随后 该文件的打开读取或 写入。