AIR로 사운드 재생이 가능한 것을 알았습니다-_-;
초초초초초간단한 MP3플레이어를 만들어봤습니다.
사운드 컨트롤하기 참 쉽게 되어있군요.
아래는 대략 소스입니다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" width="400" height="300" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private var file:File = new File();
private var req:URLRequest;
private var sound:Sound;
private var channel:SoundChannel;
private var pausePosition:int;
public function findFile():void {
try {
file.addEventListener(Event.SELECT, selectFileHandler);
file.browse();
} catch (error:Error) {
Alert.show("파일열기 실패했습니다.");
}
}
public function selectFileHandler(event:Event):void {
if (channel != null) {
channel.stop();
}
sound = new Sound();
sound.addEventListener(Event.COMPLETE, onSoundLoaded);
sound.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
sound.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
pausePosition = 0;
textFileName.text = event.currentTarget.nativePath;
sound.load(new URLRequest(event.currentTarget.nativePath));
btnPlay.enabled = true;
}
public function onLoadProgress(event:ProgressEvent):void {
var loadedPct:Number = Math.round(100 * (event.bytesLoaded / event.bytesTotal));
trace("The sound is " + loadedPct + "% loaded.");
fileLoadingPB.setProgress(loadedPct, 100);
}
public function onSoundLoaded(event:Event):void {
var localSound:Sound = event.target as Sound;
textArtist.text = localSound.id3.artist;
textSongName.text = localSound.id3.songName;
}
public function onIOError(event:IOErrorEvent):void {
Alert.show("The sound could not be loaded: " + event.text);
trace("The sound could not be loaded: " + event.text);
}
public function btnPlayClickHandler(event:Event):void {
btnPlay.enabled = false;
btnStop.enabled = true;
channel = sound.play(pausePosition);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
}
private function onEnterFrame(event:Event):void {
var estimatedLength:int =
Math.ceil(sound.length / (sound.bytesLoaded / sound.bytesTotal));
var playbackPercent:uint =
Math.round(100 * (channel.position / estimatedLength));
playPB.setProgress(playbackPercent, 100);
trace("Sound playback is " + playbackPercent + "% complete.");
}
private function onPlaybackComplete(event:Event):void {
btnPlay.enabled = false;
btnStop.enabled = false;
trace("The sound has finished playing.");
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function btnStopClickHandler(event:Event):void {
btnPlay.enabled = true;
btnStop.enabled = false;
pausePosition = channel.position;
channel.stop();
}
]]>
</mx:Script>
<mx:ProgressBar id="fileLoadingPB" x="125.5" y="160" mode="manual"/>
<mx:ProgressBar id="playPB" x="125.5" y="196" mode="manual" label="PLAYING %1%"/>
<mx:Label x="72.5" y="196" text="재생바" height="28" width="45" textAlign="right"/>
<mx:Label x="72.5" y="160" text="파일읽기" height="28" textAlign="right"/>
<mx:Label x="82.5" y="35" text="제목 :" width="44" textAlign="right"/>
<mx:Label x="82.5" y="61" text="가수명 :" textAlign="right"/>
<mx:Label x="82.5" y="87" text="파일명 :" textAlign="right"/>
<mx:Button id="btnPlay" x="91.5" y="248" label="플레이" click="btnPlayClickHandler(event);" enabled="false"/>
<mx:Button id="btnStop" x="158.5" y="248" label="일시정지" click="btnStopClickHandler(event);" enabled="false"/>
<mx:Button x="236.5" y="248" label="파일열기" click="findFile();"/>
<mx:Text id="textSongName" x="134.5" y="35" text="KHJ 바보" width="191"/>
<mx:Text id="textArtist" x="134.5" y="61" text="KHJ 돼지" width="191"/>
<mx:Text id="textFileName" x="134.5" y="87" text="KHJ 멍충이" width="191"/>
</mx:WindowedApplication>
[/code]
소스를 보면 그리 어렵지 않습니다.
Sound라는 클래스가 있습니다.
사운드객체를 하나 선언하고, 파일명으로 URLRequest를 이용해 객체를 생성해서 그걸 Sound객체의 load메소드를 통해서 로드를 한 다음에, play만 해주면됩니다.
게다가 이것저것 자체적으로 지원해주는게 많습니다. 일시정지를 할 수 있게 stop을 하기전에 channal이라는 클래스를 통해 현재 position을 얻어오면 stop한다음에 그 포지션으로부터 다시 시작할 수 있습니다.
재생완료시 이벤트를 추가할 수 있고, 파일이 로드될 때 이벤트 등의 이벤트를 지원하는군요.
PS. AIR로 MP3플레이어만들면 더 멋있을 것 같은데-_-;
'사운드'에 해당되는 글 1건
- 2008.04.21 [AIR/FLEX] 에어를 이용한 초초초초초간단 MP3플레이어-_-;