打印

[服务器端交互] 【探讨】来期 Flash + MediaPlayer 专题,有志于此的兄弟一起来顶吧

Flash 结合 MediaPlayer 的例子早几年就有了,可是却一直没得到很好的推广和普及。发这帖,就是希望让蓝色和我们大家一同来见证 Flash + WMP 的扩展和普及。Flash + WMP 可以实现播放 wma/wmv/mp3/asf/mid/wav 等等众多 WMP 所支持的格式,并且,WMP 本身支持播放 SWF,只是不支持对 SWF 进行控制。

以下是 Flash + WMP 的先驱,再次感谢 wersling 前辈。说前辈一点不为过,2004年发布的。
让 Flash 支持 Wma》出处:http://www.wersling.com/blog/article.asp?id=29

以下是我在制作过程中积累的相关知识和资料,因为内容较多,如有错误,还请大家一同指正。希望能够抛砖引玉,也希望能够得到广大同仁的支持。正如 火山兄 所说的:FLASH的普及和发展,全世界的每一位FLASHER都责无旁贷!

ActionScript 2.0 动作脚本字典

很实用的一本 as2.0 字典,chm 格式。
http://www.zhugao.cn/info/news_show.asp?id=149

动态文本的遮罩方法

在 Flash 中,直接使用遮罩层的方法无法对动态文本进行遮罩,可采用setMask方法实现。
例:
targetMc.setMask(maskmc);
targetMc为被遮罩对象,maskmc为遮罩对象。

让 Flash 按钮实现双击

on(release){
time=new Date();
se=time.getSeconds();
mi=time.getMilliseconds();
t=Math.round(se*1000+mi);
b=a;
a=t;
c=a-b;
if(c<300&&c>0){
trace("双击成功")
a=b=c=0;//清零,以便下一次计算
}
}

Flash 按钮隐藏手形

btn_test.useHandCursor=false;
注:此语句需与 btn_test 按钮在同一帧上。

Flash 自定义全局右键代码
原文:http://www.zhugao.cn/info/news_study_show.asp?id=178

function tab(){
}
function url1(){
getURL("http://www.9sky.com", "_blank");
}
function url2(){
getURL("http://www.zhugao.cn", "_blank");
}
var expandmenu = new ContextMenu();
expandmenu.hideBuiltInItems();
var $tab1 = new ContextMenuItem("9skyNetPlayer version 1.0", url1, true, true, true);//更改背后三个"true"可以达到不同的效果, 下同。可设置的值为: true / false
var $tab2 = new ContextMenuItem("http://www.9sky.com", url1, false, false, true);
var $tab3 = new ContextMenuItem("creator: zhugao", url2, true, true, true);
var $tab4 = new ContextMenuItem("http://www.zhugao.cn", url2, false, false, true);
expandmenu.customItems.push($tab1, $tab2, $tab3, $tab4);
expandmenu.onSelect = menuHandler;
_root.menu = expandmenu;

Flash 的 List 组件每行列表文字前加图标
原文及源文件:http://www.zhugao.cn/info/news_study_show.asp?id=180

var labelname = ["Flash", "Dreamweaver", "Firework"];
var ico_mc:Array = new Array();
list.iconField = "icon";//设置对象数组中作为图标的标识符,非链接属性
for (var i = 0; i<3; i++){
ico_mc.addItem({label:labelname[ i ], icon:"ico" + i});
//如需统一图标,这里写成 icon:"ico0",相应更改库中影片的链接属性
}
list.dataProvider = ico_mc;

解决 Flash Remoting For .Net 跨域连接的问题
原文:http://www.zhugao.cn/info/news_study_show.asp?id=180

List 循环选择项目
原文及源文件:http://www.zhugao.cn/info/news_study_show.asp?id=191

listTest.addItem({data:"flash", label:"Flash"});
listTest.addItem({data:"dreamweaver", label:"Dreamweaver"});
listTest.addItem({data:"coldfusion", label:"ColdFusion"});

next_btn.onRelease = function()
{
selIndex = listTest.selectedIndex;
listTest.selectedIndex = ((selIndex == listTest.length-1) || (selIndex==undefined) ?0 : selIndex + 1);
//每次加一,如果项目为倒数第一项或undefined,则从第一项开始,Flash的算法中,0 是第一项,length-1 则为最后一项
}

prev_btn.onRelease = function()
{
selIndex = listTest.selectedIndex;
listTest.selectedIndex = ((selIndex == 0) || (selIndex==undefined) ?listTest.length-1 : selIndex - 1);
//每次减一,如果项目为第一项或undefined,则从倒数最后一项开始,Flash的算法中,0 是第一项,length-1 则为最后一项
}

Flash 自定义局部右键菜单,为不同区域设定不同右键菜单
原文及源文件:http://www.zhugao.cn/info/news_study_show.asp?id=194

在舞台中建一个名为“test_mc”的 MC ,复制以下代码到相应帧。注意:“test_mc”必须放在顶层,否则无效。如果不想看到“test_mc”,可将其 Alpha 值设成“0”。

var menu_mc:ContextMenu = new ContextMenu();
menu_mc.hideBuiltInItems();
menu_mc.customItems.push(new ContextMenuItem("menu1...", menu_01));
menu_mc.customItems.push(new ContextMenuItem("menu2...", menu_02));
menu_mc.customItems.push(new ContextMenuItem("menu3...", menu_03));

//定义各菜单点击后的响应动作
function menu_01(menu:Object, obj:Object):Void {
trace("你选择了menu1...");
}
function menu_02(menu:Object, obj:Object):Void {
trace("你选择了menu2...");
}
function menu_03(menu:Object, obj:Object):Void {
trace("你选择了menu3...");
}

test_mc.menu = menu_mc;

Flash 钢笔工具转换节点的方法

Flash 钢笔工具没有 PS 的好用,这是公认的,尤其在转换节点的时候更是有一个小技巧,需要细心才能体会。方法如下:
在需要转换节点的地方,第一次按住 Ctrl 点击一次,然后松开 Ctrl 在原点再点击一次,之后在节点外点击即可完成节点转换。

Flash 使用右键传递 List 中的所有项目
源文件:http://www.zhugao.cn/info/news_show.asp?id=202

场景中有两个 List 组件 ListA 、ListB,本例实现:在 ListA 中点击右键,选择“选择所有项目”,不重复的传递所有项目到 ListB 中。

解决 Flash 本地测试中出现安全警告的方法
原文:http://www.zhugao.cn/info/news_study_show.asp?id=203

影片滚动条一款
源文件:http://www.zhugao.cn/info/news_show.asp?id=210

控制 Flash Player 的 JavaScript 方法一览表
原文:http://www.zhugao.cn/info/news_study_show.asp?id=214

限制 Flash 在指定域名/网址中播放
详细注释及原文:http://www.zhugao.cn/info/news_study_show.asp?id=217

url = "http://www.zhugao.cn";
if(_url.substring(0, 20)<>url){
gotoAndStop(2);
}else{
gotoAndPlay(3);
}

如果要允许多个域名,可以这样写:
url = "http://www.zhugao.cn";
url2 = "http://zhugao.cn";
if((_url.substring(0, 20)==url) || (_url.substring(0, 16)==url2)){
gotoAndPlay(3);
}else{
gotoAndStop(2);
}

Flash 中通过点击按钮刷新网页的方法
on(release){
getURL("javascript:location.reload()");
}

让 List 滚动条跟随当前项目
源文件:http://www.zhugao.cn/info/news_show.asp?id=222

MC 加载外部影片时需要注意的问题
原文:http://www.zhugao.cn/info/news_study_show.asp?id=246

在主场景中新建一个空的 MC,把外部影片导入到这个 MC 里,例如这个 MC 名字为 testMC,载入的代码为:testMC.loadMovie("外部影片");

原则上,此时,这个外部 SWF 里的代码要根据主场景来修改,就是说这个外部 SWF 相当于已经是主场景中的一个元件“testMC”,如果这个外部 SWF 中有 _root ,那么:

原来的代码:_root.....
要改成类似:_root.testMC.....
还有一种方法就是改成相对路径,用 _parent 来实现。

但是这些都较为烦琐,事实上,我们只需在“testMC”的第一帧写上“this._lockroot=true;”就行了。也可以写在“testMC”的外部,写法类似这样:“testMC._lockroot=true;”它将确保外部影片在被加载之后,其 _root 仍然指向其本身,而不会受加载后主影片的影响。

关于“MovieClip._lockroot”的详细说明请查看 Flash 帮助。

Fscommand 与 JS 结合应用的例子
源文件:http://www.zhugao.cn/info/news_show.asp?id=250

12 款网络播放器 (含 JS 源码,里面的 JS 应用供参考) - 2006-8-22 新增
文件下载:http://www.zhugao.cn/info/news_show.asp?id=257

JavaScript 的容错码,放在 <head> 标签内  - 2006-8-30 新增

在调试网站程序的时候,常常会弹出一些警告窗口,或是在浏览器的状态栏提示网页有错误,这些小失误将导致所有的程序都无法正常运行。下面这段 JavaScript 的容错码可以避免 JS 错误,让程序自动跳过错误继续正常运行。

<SCRIPT LANGUAGE="JavaScript">
<!-- Hide
function clearErrors() {
return true;
}
window.onerror = clearErrors;
// -->
</SCRIPT>

播放进度条及音量控制源文件  - 2006-8-30 新增
http://bbs.blueidea.com/thread-2671937-1-1.html

wmpID.controls.currentPosition' 为空或不是对象 - 解决方法  - 2006-9-1 新增
http://bbs.blueidea.com/thread-2671977-1-2.html

附作品:
http://bbs.blueidea.com/thread-2663376-1-1.html

[ 本帖最后由 luzhugao 于 2007-1-26 13:58 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
本帖最近评分记录
  • mirycat 威望 +3 精品文章 2006-8-18 17:32
停止签名
假如FF也兼容的话就好了.可惜.
我的Blog:
http://www.asv5.cn/blog/
欢迎大家加入Flash侠客群,无论新老手,均一视同仁:25694172
我突然有了个想法:
既然用FLASH能播放WMA
那是否也可以播放MID呢?
MID小巧灵活,非常适用于做网页的背景音乐,可惜FLASH不支持!

TOP

认证您的手机,获得手机认证图标, 更多手机认证的好处
MID跟WMA一样的,都是调用WMP播放器.
我的Blog:
http://www.asv5.cn/blog/
欢迎大家加入Flash侠客群,无论新老手,均一视同仁:25694172
恩,明天研究这个,现在有个更重要的任务,就是睡觉:)

TOP

不错,可惜就是俺的js不行,没法做了!

TOP

努力学习JS.

感觉JS和AS越来越近了.

TOP

刚才大致看了一下wersling提供的源文件,看的不是很懂,因为我对FSCommand以及JS与FLASH通信都不是很熟悉,但我似乎明白了一点,所谓FLASH利用media player内核,其实并不是AS与media player底层的通信,只是在网页中,FLASH通过JS,调用了media player,这跟在网页中查入media player插件似乎没太大区别,只不过这次是在FLASH中发送的请求。为了验证我这一想法,我把那个播放器单独用flash player打开,结果那个播放器就不能工作了!

我知道我分析的对不对,还请楼主来解释一下:)

TOP

是的,把播放器单独用 flash player 打开,播放器是无法工作的,因为它需要在网页中调用 JS 文件。而网页中 SWF 的 ID 是一个很重要的东西,少了这个 ID ,这个播放器就摊痪了,因为它就无法和 JS 通信了。
停止签名

TOP

呼呼,看来要把这播放器研究通,还是要先补习一些功课,只可惜wersling前辈提供的那两篇文章都不能看了~!

除了FSCommand和JS与通信的知识,还需要那些?

楼主珍藏的有没有什么好的文章或源文件让火山也分享一下啊:)先谢谢了!

[ 本帖最后由 jimohuoshan 于 2006-8-18 12:19 编辑 ]

TOP

楼主该不是功能全要模仿MEDIAPLAYER吧?
火山,关于AS和JS通讯的实例教程,我一年前在这里写了,你搜一下看:标题好像是"一个小玩意的终极难题..."什么的.
我的Blog:
http://www.asv5.cn/blog/
欢迎大家加入Flash侠客群,无论新老手,均一视同仁:25694172

TOP

发一篇 Fscommand 与 JS 结合应用的例子。多余的话就不说了,大家直接下源文件看吧,里面有注释,有不明白的地方请在这里跟帖。
http://www.zhugao.cn/downloads/study_flash/Fscommand_js_test.rar

原文及通信原理图:
http://www.zhugao.cn/info/news_study_show.asp?id=250

TO:火山,关于收藏,在下确实有一些,大概有一些 G 吧,有兴趣的话加 QQ 分享吧,我也想看看你收藏了些啥
QQ:55035118(朱高)
停止签名

TOP

引用:
原帖由 HBrO 于 2006-8-18 13:49 发表
楼主该不是功能全要模仿MEDIAPLAYER吧?..."什么的.
HBrO真是说笑了,全功能?要到何年何月啊
停止签名

TOP

我真的不行了,虽然楼主给我的那个例子,我看懂大致流程了,但对于FSCommand以及JS和AS的通信原理,我还是很模糊,看来要想彻底弄清楚,还是要静下心来,从最基本的研究起。

我找到了篇好文章:http://www.blueidea.com/tech/multimedia/2004/1712.asp
准备再配合flash帮助看下,不过估计很难在离开前把你那个播放器弄懂了:)

TOP

楼主,你的商业版PLAYER项目完成没有?如果完成的话,我考虑在这写教程.
我的Blog:
http://www.asv5.cn/blog/
欢迎大家加入Flash侠客群,无论新老手,均一视同仁:25694172

TOP

火山加油

公司第一版已经完成了。HBrO 兄只管发布,有什么事我一力承担,也正好让我取长补短
停止签名

TOP

很久很久很久以前,大概是04年的样子,有一个外国人写了一个flash+MIDI的例子,不过要自己下载一个API。

我个人觉得想法虽然好,但是应用前景比较渺茫,特别是大规模的部署,受到的兼容性限制太多。不可能每一个用户都去下载你的midiAPI,也不可能每一个用户都是IE。

不过flash日后的升级会不会让其变得更加强大,这个……谁也说不清楚。

TOP

兼容性确实是个问题,而且可以说是最大的问题。从 IT 领域发展的态势来看,很多普及性的东西都是外来发起的。这项技术之所以得不到普及,让我想到一点,因为国外用 IE 的相对较少,而用 Firefox / Netscape 的用户却相对较多。可是在中国,其实用 IE 的还是一大把。这也让我很郁闷,为什么 IT 技术的普及总要看外国人的脸色?既然中国还有那么多的人在用 IE,为什么这一次就不能让我们自己来一次普及?

说这话也许天真了些,可是尽管如此,我还是想说一句:创新的东西也许不一定被人们接受,但是少了创新的意识,我们就会被人牵着走!
停止签名

TOP

朱高兄:今天上午我好好看了看FSCommand的帮助文件,但对于AS和JS通讯原理,我还是有几点不明白,希望你和HBrO斑竹能指教几招。
首先,是用FSCommand向JS传递字符串,这个字符串的数量有没有限制,能不能大于两个?
然后,是在WEB页中调用FSCommand传递过来的字符串,为什么还要用个VBS脚本?为什么不能直接在JS中调用?
下面结合楼主提供的那个源文件具体问一下:(源文件在12楼)

经过我的分析,在这个源文件中,楼主先是通过点击“play”按钮,用fscommand("toNext");向JS传递了一个字符串"toNext";然后在WEB页中用下面这段代码接收,并做出判断,如果符合,就调用toNextPlay函数:
function testFJS_DoFSCommand(command,args){
       if (command=="toNext"){
         toNextPlay();//如果 Flash 中 Fscommand 的命令为 toNext 则调用此函数
       }
}
这里我有一点不明白,既然楼主传递的是一个字符串,却为何用两个参数接收呢?我试着把“args”参数去掉,并不影响程序运行。

下面便是楼主定义的toNextPlay函数了:
<SCRIPT language=JavaScript type="text/javascript">
function toNextPlay(){
       testFJS.TGotoLabel("testMC","playMC");
}
这段代码应该是让testMC影片跳到playMC帧,也就是所谓的用JS控制MC了。这点没有问题。

最后是函数调用,楼主用的是一段VBS,这也是我最不明白的地方,先看下面的代码:
<SCRIPT LANGUAGE="VBScript">
sub testFJS_FSCommand(ByVal command,ByVal args) //这里的 testFJS 为 SWF 的 ID
call testFJS_DoFSCommand(command,args) //这里 call testFJS_DoFSCommand 函数
end sub
</SCRIPT>
首先,我想问一个弱智的问题:为什么当点击play按钮的时候,前两段代码不能直接运行,非要在这里加这么一段VBS?如果是没有调用函数的语句的缘故,我接着想问的是:这段VBS有没有相同功能的JS可以代替,为什么舍弃了JS,非要用VBS呢?为什么我直接在第一段JS函数声明语句后加一句testFJS_DoFSCommand(command,args)调用函数,却不灵呢?
然后,fscommand传递过来的明明是一个字符串,这里为什么却一定要有两个参数呢?我试着把后面那个参数去掉,为什么就不能正常播放了呢?

总之,对于JS+AS的原理和思路我还不是很清楚,将来做东西一定要出错的,特请两位和高手们多多指教!

TOP

我给火山解释一下:
VBS那里其实是类似于AS里的事件处理函数.
然后,我想跟你说,其实DoFSCommand里头的两个参数本质上是等效的。只不过一般情况下传递命令之后,调用的是外部的JS或者VBS脚本写出来的函数,所以,才让你有一个参数识别函数名,另一个识别参数。
楼上的尽管可以尝试:
在Flash里你写入:
fscommand("msgbox","Hello!")
在JS的DoFsCommand里写
alert(command)
alert(args)
然后尝试换成
if(command=="msgbox"){
  alert(args)
}
接下来,你还可以测试下:
Flash里改成
fscommand("Hello!","msgbox")
然后JS改成
if(args=="msgbox"){
  alert(command)
}
通过这些测试,我希望你能够理解其实command和args本质是一样的,你可以把它当成两个同等的参数。
不过最多也只能是两个,如果要传多个,你可以拿一些特殊的分隔符把它们连起来,传出去,在JS里再切出来。
AS3对这个的处理强了,你可以通过ExternalInterface实现多参数传递。

最后,我要说的是,这段VBS其实在FLASH生成的HTML里都有,你只需定义你自己的DoFscommand函数(用的是JS),所以不用担心出错。另外,还有一个办法可以取代:getURL("javascript:....."),这个办法一般情况下,等价于FSCOMMAND。但是有些时候不可用,如循环语句里头,只执行最后一个循环项。如果页面有声音的话,将很有可能停止。
我的Blog:
http://www.asv5.cn/blog/
欢迎大家加入Flash侠客群,无论新老手,均一视同仁:25694172

TOP

楼主是好样的,感谢你 给出的 flash 技术经验

TOP

我也有一点不明之处,想问下HBrO
sub ID_FSCommand(ByVal command, ByVal args)
为什么这里的两个参数缺一不可呢?
而 function ID_DoFSCommand(command,args) 虽然是一个固定格式,参数却有选择余地。
关于 args 参数,我查了好一阵,对他的理解都还不是很清楚。
还请赐教。
停止签名

TOP

sub ID_FSCommand(ByVal command, ByVal args)
你大概可以理解成事件处理函数,像AS的
myLoadVars.onLoad=function(success:Boolean)
如果省掉了这一参数,其实是出错的,但是FLASH编译器把它忽略了,而在比较规范的语言里头,这是不允许存在的.

args参数,我想你应该懂了吧?
我的Blog:
http://www.asv5.cn/blog/
欢迎大家加入Flash侠客群,无论新老手,均一视同仁:25694172

TOP

有一点我明白了:
flash里的:fscommand("msgbox","Hello!")
和JS中的:myDocument_DoFSCommand(command, args);
其实这两个函数中的参数,就像一个自定义函数中的形式参数和实际参数,command, args是形式参数,而"msgbox","Hello!"就好比实际参数。参数之间是平等的,唯一不同的是它们在函数中出现的先后位置。只不过,"msgbox","Hello!"这两个“实际参数”不是从网页直接传递过来的,而是从FLASH传递过来的。

但那段VBS,我还是不理解,为什么它就一定要有两个参数呢?就算fscommand只传递过来一个参数,这段VBS还是要有两个参数!难道是固定格式?还有我在FLASH发布的HTML页面为什么就没有这段VBS代码?它可以在HTML中用JS代替吗?

TOP

从fscommand到VBS的那个sub,它的传递机理并非是一般的调用函数.fscommand发出去了,FLASH的容器,也就是HTML页面它不是直接接收两个参数的,而是响应一个内定的事件.这个事件就是ID_FSCommand(ByVal command, ByVal args),在VB里头称作"过程"而非"事件".这个事件确实是固定的格式,你改了的话,不仅不能收到fscommand,而且会因为找不到这个内定事件而出错.

这个我也是随便说说,应该还有不少错漏,你去了解下VB方面的知识会更好.
我的Blog:
http://www.asv5.cn/blog/
欢迎大家加入Flash侠客群,无论新老手,均一视同仁:25694172

TOP

VB我也就是会dim一下,估计现在是没时间研究了:(
不过“过程”这个概念我倒是还有点印象。
经过斑竹这么一解释,现在明白了许多
看来这段VBS是不能省了
可是在一个HTML文件里,同时有JS和VBS,我看着很不爽,我喜欢纯JS的:)

TOP

新增 12 款网络播放器 (有 10 款是类似的代码。含 JS 源码,里面的 JS 应用供参考)
文件下载:http://www.zhugao.cn/downloads/others/webPlayer.rar

这几天准备花些时间试下进度条的制作。
停止签名

TOP

......楼主还没做进度条?
我的Blog:
http://www.asv5.cn/blog/
欢迎大家加入Flash侠客群,无论新老手,均一视同仁:25694172

TOP

是啊,你做好了吗?对了,你的教程什么时候发布啊。期待中。。。
停止签名

TOP

我的那个有进度条啊,点我签名里的链接看看.
我的Blog:
http://www.asv5.cn/blog/
欢迎大家加入Flash侠客群,无论新老手,均一视同仁:25694172

TOP