`
chenyunhong
  • 浏览: 140945 次
  • 性别: Icon_minigender_1
  • 来自: 真的不知道
社区版块
存档分类
最新评论

Flex4实现 音频播放器 显示语音波形

    博客分类:
  • Flex
阅读更多

直接上代码,在Flash Builder 4中新建 FLEX项目,复制代码可以可以直接运行

需要将 file = "D:\\voice\\3791.MP3"; 改为自己的路径

以后还准备增加流式播放!

 



 

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   minWidth="955" minHeight="600" 
			   creationComplete="initMusic()" 
			   height="304" width="808">
	<s:layout>
		<s:BasicLayout/>
	</s:layout>
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	
	<fx:Script>
		<![CDATA[
			import com.adobe.serialization.json.JSON;
			
			import flash.utils.ByteArray;
			
			import mx.collections.ArrayCollection;
			import mx.controls.Alert;
			import mx.core.UIComponent;
			import mx.events.IndexChangedEvent;
			import mx.managers.PopUpManager;
			import mx.printing.FlexPrintJob;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			import mx.rpc.http.HTTPService;

			
			private var serverIP:String = "http://127.0.0.1";
			private var ba:ByteArray = new ByteArray(); 
			private var soundRequest:URLRequest;
			private var sound:Sound = new Sound(); //使用Sound对象来获取音乐文件播放声音
			private var chanel:SoundChannel;       //引入SoundChannel对象来精确控制声音
			private var vol:SoundTransform;        //通过设置SoundTransform对象的volume属性控制音量
			
			private var stopPosition:int=0;        //使用stopPosition记录暂停音乐时的位置
			private var soundState:int=1;          //使用soundState记录是否静音
			private var soundValue:int=2;          //记录静音前的音量
			private var playState:int=0;           //使用playState记录声音是否被停止(包括暂停)
			private var totalTime:String = "00:00";//语音文件总时间
			private var params:Object;             //URL参数列表
			private var _sperite:Sprite;           //用于绘制声音波形
			
			//初始化
			private function initMusic():void{
				var args:Object = getParams();      //获取URL中的参数列表
				var file:String = serverIP + args.audio+".mp3";//得到语音文件名
//				file = "http://127.0.0.1/voice/3416.mp3";
				
				//对播放控制按钮和滑动条添加鼠标动作监听
				soundBtn.addEventListener(MouseEvent.CLICK,onSoundClick);//有声音
				soundBtnJ.addEventListener(MouseEvent.CLICK,onSoundClick);//静音
				playBtn.addEventListener(MouseEvent.CLICK,onPlayBtnClick);//播放
				pauseBtn.addEventListener(MouseEvent.CLICK,onPlayBtnClick);//暂停
				proccessBar.addEventListener(MouseEvent.MOUSE_DOWN,onProccessBarDown);//播放进度条
				proccessBar.addEventListener(MouseEvent.MOUSE_UP,onProccessBarUp);//播放进度条
				
				//组件初始状态设置
				soundSlide.value=2;//默认音量等于2
				
				if(file != null && file != ""){
					var buffer:SoundLoaderContext = new SoundLoaderContext(5000);
					soundRequest = new URLRequest(file);
					sound.load(soundRequest,buffer);
					sound.addEventListener(Event.COMPLETE, loaded);//监听加载事件
					sound.addEventListener(ProgressEvent.PROGRESS, progressHandler);//缓冲事件
				}
				
				//控制音量
				vol = new SoundTransform();
				vol.volume = soundSlide.value;
				
			}
			
			//缓冲事件方法
			private function progressHandler(event:ProgressEvent):void{
				//计算缓冲方框的宽度(滑块本身也有一定的宽度,减去约10个像素宽度)
				if (sound.bytesLoaded>0){ 
					bufferRect.width = sound.bytesLoaded / sound.bytesTotal*(proccessBar.width);
				}  
			}
			
			private function onProccessBarDown(e:MouseEvent):void{
				this.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
			}
			
			private function onProccessBarUp(e:MouseEvent):void{
				this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
			}
			
			//读取语音数据,一边取一边画
			private function loaded(event:Event):void {
				var width:Number = box.width;
				var height:Number =box.height;
				
				//获取语音长度,毫秒
				var lengthTime:Number = sound.length;
				totalTime = formatTime(lengthTime);
				playTime.text = totalTime;
				
				_sperite = new Sprite();//建立影片精灵   
				var uicomponent:UIComponent = new UIComponent();  
				uicomponent.addChild(_sperite);  
				box.addElement(uicomponent);
				
				doDraw(0.1,0xffffff,0,height/2,width-2,height/2);  //绘制中心轴线
				//绘制横轴
				for(var i:int=20;i<height;i+=20){
					doDraw(0.1,0xCCCCCC,0,i,width-2,i);  //绘制中心轴线
				}
				//绘制纵轴
				for(var j:int=40;j<width;j+=40){
					doDraw(0.1,0xCCCCCC,j,0,j,height);  //绘制中心轴线
				}
				
				var dataCount:Number = lengthTime*44.1;
				sound.extract(ba, dataCount);  //将所有的语音数据读取到字节数组里面
				ba.position = 0;//文件指针的当前位置
				var startX:Number = 0,startY:Number = 100;//开始点
				var m:int = 1;//记录数据个数
				while(ba.bytesAvailable > 0){
					var value:Number = ba.readFloat();
					var endX:Number = m*width/dataCount;
					var endY:Number = height/2;
					endY = (1-value)*(height/2);//正数
					doDraw(0.1, 0x00FF00, startX, startY, endX, endY);//绘制波形
					startX = endX; startY = endY;
					if(ba.bytesAvailable > 0){
						ba.position += 84;
						m += 11;
					}
				}
				
				//完成自动播放
				playState=1;
				chanel = sound.play(stopPosition);
				chanel.soundTransform=vol;			
				this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
				playBtn.visible=false;
				pauseBtn.visible=true;
				pState.text = "状态: 播放";
				
				load.visible = false;
			}
			
			//绘制曲线
			private function doDraw(cx:Number,color:uint,startX:Number,startY:Number,endX:Number,endY:Number):void{  
				_sperite.graphics.lineStyle(cx,color,1);  
				_sperite.graphics.moveTo(startX,startY);  
				_sperite.graphics.lineTo(endX,endY);  
			}  
			
			//播放暂停
			private function onPlayBtnClick(e:MouseEvent):void{
				//正常状态控制播放与暂停
				if(playState==1){
					playState=0;	
					stopPosition = chanel.position; 
					chanel.stop();
					this.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
					playBtn.visible=true;
					pauseBtn.visible=false;
					pState.text = "状态: 暂停";
				}else if(playState==0){
					playState=1;
					chanel = sound.play(stopPosition);
					chanel.soundTransform=vol;			
					this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
					playBtn.visible=false;
					pauseBtn.visible=true;
					pState.text = "状态: 播放";
				}
			}
			
			//停止播放
			public function musStop():void{
				playState=0;
				stopPosition = 0; 
				this.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
				proccessBar.value=0;
				playTime.text="00:00/"+totalTime;
				playBtn.visible=true;
				pauseBtn.visible=false;
				pState.text = "状态: 停止";
				if(chanel!=null){
					chanel.stop();
				}
			}
			
			//静音处理按钮
			private function onSoundClick(e:MouseEvent):void{
				//点击正常状态的静音按钮处理函数
				if(soundState==1){
					soundState=0;
					vol.volume=0;
					soundValue = soundSlide.value;
					soundSlide.value=0;
					soundBtnJ.visible=true;
					soundBtn.visible=false;
				}else if(soundState==0){
					soundState=1;
					soundSlide.value = soundValue;
					vol.volume=soundSlide.value;
					soundBtnJ.visible=false;
					soundBtn.visible=true;
				}
				chanel.soundTransform=vol;
			}
			
			//控制音量大小
			private function soundSlideChange():void{
				vol.volume=soundSlide.value;
				chanel.soundTransform=vol;
			}
			
			//控制播放进度
			private function onEnterFrame(e:Event):void{
				if(chanel!=null){
					proccessBar.value=chanel.position*(100/sound.length);
					playTime.text=formatTime(chanel.position) + "/" + totalTime;
					if(proccessBar.value>99){
						musStop();
					}
				}
			}
			
			//鼠标拖动进度条更改播放进度的处理
			private function changePos():void{
				if(chanel!=null){
					chanel.stop();
					//完成自动播放
					playState=1;
					chanel = sound.play(proccessBar.value*sound.length/100);
					chanel.soundTransform=vol;			
					this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
					playBtn.visible=false;
					pauseBtn.visible=true;
					pState.text = "状态: 播放";
				}
			}
			
			//时间格式处理
			private function formatTime(time:Number):String{
				var s:String;
				var m:Number = Math.floor(time / 60000);//分钟
				if(m >= 60){
					//小时
					var h:Number = Math.floor(m / 60);
					if (h < 10)
						s = "0" + h;
					else
						s = String(h);
					
					//分钟
					m = m - h*60;
					if (m < 10)
						s += ":0" + m;
					else
						s += ":" + String(m);
				}else{
					if (m < 10)
						s = "0" + m;
					else
						s = String(m);
				}
				
				m = Math.floor((time / 1000 ) % 60)
				if (m < 10)
					s += ":0" + m;
				else
					s += ":" + m;
				
				return s;
			}
			
			//从Url中得到参数,得到   ? 以后的所有
			private function getParams():Object {
				params = {};
				//获取整个URI
				var query:String = ExternalInterface.call("window.location.search.substring", 1);
				var url:String = ExternalInterface.call("window.location.href.toString", 1);
				var index:int = url.indexOf("dsas")
				serverIP = url.substring(0,index-1);
				
				if(query) {
					var pairs:Array = query.split("&");
					for(var i:uint=0; i < pairs.length; i++) {
						var pos:int = pairs[i].indexOf("=");
						if(pos != -1) {
							var argname:String = pairs[i].substring(0, pos);
							var value:String = pairs[i].substring(pos+1);
							params[argname] = value;
						}
					}
				}
				return params;
			}
			
			//下载语音文件
			private function downLoadsVoice():void{
				var args:Object = getParams();      //获取URL中的参数列表
				var fileName:String = args.audio;
				var file:String = serverIP + fileName + ".mp3";//得到语音文件名
				var urlReq:URLRequest = new URLRequest(file);  
				var fileRef:FileReference = new FileReference(); 
				var index:int = fileName.indexOf("voice/");
				var tempFile:String = fileName.substring(index+6,fileName.length)+".mp3";
				fileRef.download(urlReq,tempFile);
			}
		]]>
	</fx:Script>
	
	<s:Panel id="panel" x="1.3" y="1.35" width="806" height="302" title="乘务员标准化作业语音监控系统" 
			 backgroundColor="#448FF5" backgroundAlpha="0.72" >
		
		<s:Label x="738" y="-24" text="状态:暂停" id="pState" color="#FF0404" fontWeight="bold"/>
		
		<s:BorderContainer x="2" y="2" width="800" height="200" id="box" backgroundColor="#0211D6">
			<s:Label x="260" y="84" text="语音加载完成后自动播放,请稍后..." id="load" fontSize="20" color="#FC0000" fontWeight="bold" fontStyle="italic" fontFamily="Courier New"/>
		</s:BorderContainer>
		
		<s:BorderContainer id="bufferRect" x="1" y="210" width="7" height="7" buttonMode="true" borderColor="red" backgroundColor="red">
		</s:BorderContainer>
		
		<s:HSlider x="1" y="207" width="801" id="proccessBar" change="changePos()" 
				   minimum="0" maximum="100" snapInterval="0.1" liveDragging="true" 
				   showDataTip="false" height="13" alpha="0.5" buttonMode="true"/>
		
		<mx:Image x="6" y="227" source="assets/play.png" id="playBtn"/>
		<mx:Image x="6" y="227" source="assets/pause.png" id="pauseBtn" visible="false"/>
		<mx:Image x="56" y="227" source="assets/stop.png" id="stopBtn" click="musStop()"/>
		<mx:Image x="106" y="227" source="assets/volume.png" id="soundBtn"/>
		<mx:Image x="106" y="227" source="assets/volumeJ.png" id="soundBtnJ" visible="false"/>
		<s:HSlider x="149" y="238" width="107" id="soundSlide" change="soundSlideChange()" minimum="0" maximum="5"/>
		<s:Label y="224" right="1" text="00:00" id="playTime"/>
		<s:Button x="758" y="247" label="下载" width="46" click="downLoadsVoice()" id="dl"/>
	</s:Panel>
</s:Application>
 

 

 

 

 

 

  • 大小: 84 KB
分享到:
评论
1 楼 yii1234 2012-08-24  
无法播放声音

相关推荐

    Flex4实现音频播放器-显示语音波形

    在本文中,我们将深入探讨如何使用Flex4技术来创建一个功能丰富的音频播放器,特别是将重点放在如何在播放器界面上显示语音波形这一高级特性上。Flex4是Adobe Flash Platform的一部分,它提供了强大的组件库和框架,...

    Flex4实现音频播放器

    直接上代码,在Flash Builder 4中新建 FLEX项目,复制代码可以可以直接运行 需要将 file = "D:\\voice\\3791.MP3"; 改为自己的路径 以后还准备增加流式播放!

    flex 精简音频播放器

    综上所述,"flex 精简音频播放器"是一个利用Flex框架和ActionScript 3.0实现的轻量级Web音频播放解决方案,它包括了UI设计、音频处理、事件处理和网页集成等多个方面的知识点。通过深入学习这些技术,开发者可以创建...

    flex 音频播放器

    Flex音频播放器是一种基于Adobe Flex技术构建的交互式媒体播放器,它允许用户不仅能够播放音频文件,还提供了丰富的用户体验,如拖放播放位置和调节音量大小的功能。Flex是Adobe开发的一个开源框架,主要用于创建富...

    flex音乐播放器源代码

    除了基本功能外,开发者还可以根据需求扩展Flex音乐播放器,比如添加歌词同步显示、音乐库管理、播放列表编辑等功能,以满足更复杂的用户需求。 通过对Flex音乐播放器源代码的分析,我们可以了解到Flex开发的基本...

    非常不错的Flex播放器

    综上所述,"非常不错的Flex播放器"通过Microphone类实现了无需服务器参与的录音功能,为用户提供了一种高效、便捷的音频处理体验。通过深入理解和运用这些知识点,开发者可以构建出更高级、功能更全面的Flex多媒体...

    Flex4网页音乐播放器

    在这个项目中,Flex4被用来设计和实现一个功能丰富的音乐播放器,它具有以下特性: 1. **播放与暂停**:音乐播放器的核心功能之一是播放和暂停音乐。这通常通过ActionScript中的事件监听和处理来实现,例如`play()`...

    FLEX播放器 flex 开发AIR及Flex之mp3播放器教程

    在本教程中,我们将深入探讨如何使用Adobe Flex技术开发一个MP3播放器,这涉及到FLEX播放器、Flex SDK以及Adobe Integrated Runtime (AIR)的使用。Flex是一种强大的开放源代码框架,用于构建富互联网应用程序(RIA)...

    flex MP3播放器

    Flex MP3播放器是一款基于Adobe Flex技术开发的音频播放软件,专为播放MP3格式的音乐文件设计。Flex是ActionScript 3.0的富互联网应用程序框架,它提供了丰富的用户界面组件和强大的数据服务功能,使得开发出具有...

    Flex播放器实例带源码的flex制作的播放器

    Flex播放器实例是基于Adobe Flex框架开发的多媒体播放器应用,它允许开发者创建交互式的、富用户体验的Flash应用程序。Flex是一种开源的、基于MXML和ActionScript的开发工具,主要用于构建运行在Adobe Flash Player...

    Flex实现了一个FlV格式的视频播放功能

    这是Flex SDK中的一个核心组件,它可以处理音频和视频内容。通过创建一个MediaElement实例,我们可以加载FlV文件并控制其播放、暂停、停止等操作。以下是一个简单的FlV播放器的代码示例: ```actionscript ('...

    flex4做的MP3播放器

    在这个“flex4做的MP3播放器”项目中,我们可以探讨几个关键的技术点和知识点。 1. **Flex SDK与Flash Player**: Flex SDK是Adobe提供的开发工具,包含了编译Flex应用程序所需的编译器和框架。编译后的Flex应用通过...

    基于微信小程序实现的一个带音频波形图的音乐播放器源码.zip

    【描述】: 这个项目是一个使用微信小程序开发的音乐播放器,其独特之处在于它能够显示音频的波形图,为用户提供更为直观的音乐体验。通过这个源码,我们可以深入学习微信小程序的开发技巧,以及如何结合音频处理技术...

    flex制作的MP3播放器

    总之,使用Flex制作MP3播放器是一个涉及UI设计、音频处理、事件机制、数据管理等多个方面的综合性项目。通过深入学习和实践,开发者不仅可以掌握Flex的相关技能,还能提升对多媒体处理和用户体验设计的理解。这个MP3...

    基于flex的flv简易播放器

    综上所述,基于Flex的FLV简易播放器是一个基本的视频播放解决方案,涵盖了连接服务器、处理流媒体数据、显示视频内容以及提供用户交互的基本功能。通过深入理解这些组件和机制,开发者可以进一步扩展和定制播放器,...

    Flex简单的Mp3播放器。

    这款名为“tingDemo”的简单MP3播放器是使用Flex技术实现的,它允许用户在Web上播放MP3音频文件。通过深入理解Flex的基础和MP3播放器的工作原理,我们可以从中学习到以下几个关键知识点: 1. **ActionScript**: ...

    baidu语音识别 flex 版实现

    在本文中,我们将深入探讨如何在Flex环境中实现百度语音识别功能。Flex是一种基于ActionScript的开源框架,用于构建富互联网应用程序(RIA)。结合百度的语音识别API,我们可以为用户提供便捷的语音输入体验。 首先...

    FLEX--本地播放器(ActionScript 3.0实现)

    本项目“FLEX--本地播放器(ActionScript 3.0实现)”专注于利用这两者来创建一个能够在用户本地运行的视频播放器。 ActionScript 3.0是AS2的升级版,具有显著的性能提升和更严格的面向对象编程模型。在这个项目中...

    flex4.5在线视频播放器

    总结来说,Flex 4.5在线视频播放器是一个功能强大的工具,它不仅提供了一个完善的视频播放体验,还能灵活地与网页上的JavaScript环境进行交互,实现更丰富的功能和定制化需求。对于开发者而言,理解Flex 4.5的架构和...

    Flex Air音乐播放器源码

    音乐播放器可能需要包含音频处理库或播放控制库来实现其功能。 `src` 目录是源代码的主要存放位置,其中包含MXML(Flex的标记语言,用于创建用户界面)和ActionScript类文件。开发者可能在这里定义了音乐播放器的类...

Global site tag (gtag.js) - Google Analytics