请教ActionScript3 中播放外部声音的问题

时间:2022-07-29 14:56:47
    请教各位大侠们,我是一个AS3的新手,最近我在学习声音播放的相关技术,在网上,大部分的实例是演示播放本地媒体或者是等音频全部下载完毕再播放,我想做一个带缓冲的播放器,就是音频文件一边下载一边播放,如果网络不好,播放到某位置会停下来等待一会,等缓冲一部分后再继续播放。请问各位大侠应该怎么做?
    我只知道Sound类和SoundChannel类。请各位给小弟简单的例子吧,我如何获得当前音频下载了多少?如何知道当前音乐播放到什么位置?谢谢各位了!

8 个解决方案

#1


如果单纯播放MP3等音频文件很简单。如果想做直播或聊天室就麻烦了。
给你写了一个,没加注解,很晚了,呵呵。
需要注意的是本地是无法测试的,你需要上传到网站上测试。安全沙箱也需要注意。既然搞网络程序,这个我不多说了。
打完收工,睡觉去了。


import flash.net.URLRequest;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.media.SoundLoaderContext;
import flash.display.Sprite;
import flash.text.TextField;


var btn:Sprite = new Sprite();
btn.graphics.beginFill(0xff0000);
btn.graphics.drawRect(10,10,50,50);
btn.buttonMode = true;
addChild(btn);

var txt:TextField = new TextField();
addChild(txt);
txt.border = true;
txt.height = 20;
txt.x = 10;
txt.y = 100;

var mylo:URLRequest = new URLRequest("and.mp3");
var my:Sound = new Sound();
var myc:SoundChannel = new SoundChannel();
var ss:SoundLoaderContext = new SoundLoaderContext(5000);
my.load(mylo,ss);
my.addEventListener(ProgressEvent.PROGRESS,mymy);
function mymy(evt:ProgressEvent)
{
var loadNum:Number = evt.bytesTotal;
txt.text = String(Math.round(evt.bytesLoaded / loadNum * 100))+"%";
}



btn.addEventListener(MouseEvent.CLICK,myevt);
function myevt(evt:MouseEvent)
{
myc = my.play();
}

#2


sound.load()之后
sound.bytesLoaded取得当前加载的长度(字节)
sound.bytesTotal取得是歌曲的总长度(字节)
soundChannel=sound.play()之后
soundChannel.posotion取得当前的播放位置

#3


引用 1 楼 xinje 的回复:
如果单纯播放MP3等音频文件很简单。如果想做直播或聊天室就麻烦了。
给你写了一个,没加注解,很晚了,呵呵。
需要注意的是本地是无法测试的,你需要上传到网站上测试。安全沙箱也需要注意。既然搞网络程序,这个我不多说了。
打完收工,睡觉去了。

JScript code

import flash.net.URLRequest;
import flash.media.Sound;
impo……

谢谢这位朋友,我想问一下在my.addEventListener中的那个ProgressEvent.PROGRESS是什么事件?谢谢

#4


这个是用来显示载入进度的。
在过程中触发

#5


引用 4 楼 xinje 的回复:
这个是用来显示载入进度的。
在过程中触发

哦,原来是这样啊,明白了。谢谢你,分给你。对了,顺便问一下,如果歌曲只下载了20%,播放时会在20%处停下,这时,网络好了之后,歌曲要想继续播放应该怎么做?我刚刚接触AS3,还不太了解Sound类和SoundChannel类。变量myc在音频数据断了以后停止是进行了stop()方法,还是像挂起之类的状态呢?如果是挂起,怎么继续?谢谢你了!

#6



首先可以控制缓存的大小
var ss:SoundLoaderContext = new SoundLoaderContext(5000);
这样是保证流畅不放的关键。
暂时没考虑过你所说的情况。我认为下载后会自动继续的。

还有一点,可以通过 myc = my.play(要播放位置的毫秒数)来指定播放位置。
位置是通过SoundChannel类的position属性获得,注意是只读的。

建议多参考HELP文件。
http://help.adobe.com/zh_CN/Flash/CS5/AS3LR/flash/media/SoundChannel.html

#7


引用 6 楼 xinje 的回复:
首先可以控制缓存的大小
var ss:SoundLoaderContext = new SoundLoaderContext(5000);
这样是保证流畅不放的关键。
暂时没考虑过你所说的情况。我认为下载后会自动继续的。

还有一点,可以通过 myc = my.play(要播放位置的毫秒数)来指定播放位置。
位置是通过SoundChannel类的position属性获得,注意是只读的。……

恩,好的!你真是帮我一个大忙!I own you a big one!非常感谢!你让我学到很多!

#8


回复:xinje
    不好意思,我就这么多分数!

感谢大家对小弟的帮助,谢谢你们

#1


如果单纯播放MP3等音频文件很简单。如果想做直播或聊天室就麻烦了。
给你写了一个,没加注解,很晚了,呵呵。
需要注意的是本地是无法测试的,你需要上传到网站上测试。安全沙箱也需要注意。既然搞网络程序,这个我不多说了。
打完收工,睡觉去了。


import flash.net.URLRequest;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.media.SoundLoaderContext;
import flash.display.Sprite;
import flash.text.TextField;


var btn:Sprite = new Sprite();
btn.graphics.beginFill(0xff0000);
btn.graphics.drawRect(10,10,50,50);
btn.buttonMode = true;
addChild(btn);

var txt:TextField = new TextField();
addChild(txt);
txt.border = true;
txt.height = 20;
txt.x = 10;
txt.y = 100;

var mylo:URLRequest = new URLRequest("and.mp3");
var my:Sound = new Sound();
var myc:SoundChannel = new SoundChannel();
var ss:SoundLoaderContext = new SoundLoaderContext(5000);
my.load(mylo,ss);
my.addEventListener(ProgressEvent.PROGRESS,mymy);
function mymy(evt:ProgressEvent)
{
var loadNum:Number = evt.bytesTotal;
txt.text = String(Math.round(evt.bytesLoaded / loadNum * 100))+"%";
}



btn.addEventListener(MouseEvent.CLICK,myevt);
function myevt(evt:MouseEvent)
{
myc = my.play();
}

#2


sound.load()之后
sound.bytesLoaded取得当前加载的长度(字节)
sound.bytesTotal取得是歌曲的总长度(字节)
soundChannel=sound.play()之后
soundChannel.posotion取得当前的播放位置

#3


引用 1 楼 xinje 的回复:
如果单纯播放MP3等音频文件很简单。如果想做直播或聊天室就麻烦了。
给你写了一个,没加注解,很晚了,呵呵。
需要注意的是本地是无法测试的,你需要上传到网站上测试。安全沙箱也需要注意。既然搞网络程序,这个我不多说了。
打完收工,睡觉去了。

JScript code

import flash.net.URLRequest;
import flash.media.Sound;
impo……

谢谢这位朋友,我想问一下在my.addEventListener中的那个ProgressEvent.PROGRESS是什么事件?谢谢

#4


这个是用来显示载入进度的。
在过程中触发

#5


引用 4 楼 xinje 的回复:
这个是用来显示载入进度的。
在过程中触发

哦,原来是这样啊,明白了。谢谢你,分给你。对了,顺便问一下,如果歌曲只下载了20%,播放时会在20%处停下,这时,网络好了之后,歌曲要想继续播放应该怎么做?我刚刚接触AS3,还不太了解Sound类和SoundChannel类。变量myc在音频数据断了以后停止是进行了stop()方法,还是像挂起之类的状态呢?如果是挂起,怎么继续?谢谢你了!

#6



首先可以控制缓存的大小
var ss:SoundLoaderContext = new SoundLoaderContext(5000);
这样是保证流畅不放的关键。
暂时没考虑过你所说的情况。我认为下载后会自动继续的。

还有一点,可以通过 myc = my.play(要播放位置的毫秒数)来指定播放位置。
位置是通过SoundChannel类的position属性获得,注意是只读的。

建议多参考HELP文件。
http://help.adobe.com/zh_CN/Flash/CS5/AS3LR/flash/media/SoundChannel.html

#7


引用 6 楼 xinje 的回复:
首先可以控制缓存的大小
var ss:SoundLoaderContext = new SoundLoaderContext(5000);
这样是保证流畅不放的关键。
暂时没考虑过你所说的情况。我认为下载后会自动继续的。

还有一点,可以通过 myc = my.play(要播放位置的毫秒数)来指定播放位置。
位置是通过SoundChannel类的position属性获得,注意是只读的。……

恩,好的!你真是帮我一个大忙!I own you a big one!非常感谢!你让我学到很多!

#8


回复:xinje
    不好意思,我就这么多分数!

感谢大家对小弟的帮助,谢谢你们