我在代码中做了一个权限验证功能,对于调用媒体文件的WEB请求,只有符合条件的才让它访问,这时出了一个问题:当符合条件时我如何返回媒体数据流给调用的页面呢?
如:
<object id="player" name="player" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA\" width="100%" height="85%" align="baseline">
...
<param name="SRC" value="http://localhost/movies/0005.rm">
...
</object>
如果用Response.WriteFile("FilePath")的话是直接向客户端发送文件,播放器接收不了,会提示错误~~~郁闷,各位是如何向媒体播放器返回数据流的呢~~急~~
如:
<object id="player" name="player" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA\" width="100%" height="85%" align="baseline">
...
<param name="SRC" value="http://localhost/movies/0005.rm">
...
</object>
如果用Response.WriteFile("FilePath")的话是直接向客户端发送文件,播放器接收不了,会提示错误~~~郁闷,各位是如何向媒体播放器返回数据流的呢~~急~~
结束这个页面啊。
顺便说一下,我觉得这样:<param name="SRC" value="http://localhost/movies/0005.rm">是不能播放的,应该使用rtsp协议吧?乱说一气 不知道对不对,呵呵。
二.那样可以播放的
HELP ME,PLEASE!!
版主呀,听说你以前搞过这方面的,你救救偶吧~~~
国外有用java applet来做的,控制得很好!
你这样是直接把一个视频文件输出给了客户端浏览器,如果访问者直接点击打开的话,Windows应该会调用与其格式关联的应用程序来打开(rm格式应该会用RealPlayer打开),但是访问者需要安装该应用程序,没有安装就不能打开。
另外,这应该不是流媒体的形式,而是直接传送文件给访问者。如果需要提供流媒体服务,你需要在服务器端安装流媒体服务器。例如:Windows Media服务,Windows 2000 Server 和Windows Server 2003都自带了此服务,你可以选择安装。如果你需要Real的流媒体服务,你需要安装Real的Media Servers。
我不是要提供流媒体服务,问题是在于为什么播放器用SRC=URL可以播放,这时候播放器向服务器发出的请求是什么类型的?应该是HTTP的吧?这时服务器返回的CONTENTTYPE也应该是相应的VEDIO或AUDIO类型的,同时服务器发送的数据流是什么格式或协议的?这时的连接形式是什么连接形式?
而你直接输出的时候,IE会根据你输出文件的类型,来判断该格式关联的应用程序,来选择播放器。如果你的格式没有被关联,那么就不能播放了。另外,你要确认你用Response.WriteFile的时候,有没有指定文件的类型。
如果是rm格式,应该是:
Response.ContentType="audio/x-pn-realaudio";
我这边刚刚安装了一个RealOne Player,而且测试是没有问题的。
HttpContext context = HttpContext.Current;
HttpRequest request1 = context.Request;
HttpResponse response1 = context.Response;
HttpServerUtility utility1 = context.Server;
string text1 = request1.Url.AbsolutePath;
string text2 = utility1.MapPath(text1);
if (request1.UrlReferrer == null)
{flag1 = false;}
else if (request1.Url.Host == request1.UrlReferrer.Host)
{flag1 = true;}
else if (Regex.IsMatch(ConfigurationSettings.AppSettings["RovaryDomains"], "^([^,]+,)*" + request1.Url.Host + "(,[^,]+)*$"))
{flag1 = true;}
else
{flag1 = false;}
if (flag1)
{
if (File.Exists(text2))
{
response1.Clear();
string stype = this.Ctype(text1);
if(stype == "Error")
{
response1.Redirect(ConfigurationSettings.AppSettings["RovaryRedirect"]);
}
else
{
response1.ContentType = stype;
response1.WriteFile(text2);
}
}
else
{
response1.Redirect(ConfigurationSettings.AppSettings["RovaryRedirect"]);
}
}
else
{
response1.Redirect(ConfigurationSettings.AppSettings["RovaryRedirect"]);
}
如:
<object id="player" name="player" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA\" width="100%" height="85%" align="baseline">
...
<param name="SRC" value="http://localhost/movies/0005.rm">
...
</object>
如果用Response.WriteFile("FilePath")的话是直接向客户端发送文件,播放器接收不了,会提示错误~~~郁闷,各位是如何向媒体播放器返回数据流的呢~~急~~
你可以把权限控制放到此页面,有权限的用户才能看到object标记,没有权限的根本看不到此标记就可以了。
response1.WriteFile(text2);
你调试看看,看看这两句的stype和text2各是什么值?
stype就是相应的ContentType
text2是文件实际路径
如果还有问题,请检查你的客户端的RealOne Player是不是有问题?或者检查一下rm文件类型是不是被RealOne Player关联了?
输出一个.wmv的文件,然后修改:
Response.ContentType="video/x-ms-wmv"
确认你的Windows Media Player没有问题,然后测试一下代码能不能正确执行。
哪位大大能告诉小弟,在媒体播放器中,SRC=URL这个属性,他是发出什么请求?HTTP么?如果是的话,那么它REQUEST的CONTENTTYPE是什么?服务器端对此CONTENTTYPE所返回的CONTENTTYPE是什么?数据流格式是什么格式?BUFFER还是MENORYSTREAM???对应的.NET里面CONTENTTYPE与HTML中的CONTENTTYPE是否一致???我现在被这流媒体格式搞得头错脑胀的说~~~
只是提醒Response.WriteFile这样的代码会撑爆你的内存,不妨弄个1.x GB的文件试试,嗯
应该弄个循环直接向HttpResponse.OutputStream里写数据