본문 바로가기

Actionscript3.0

[AS3] Flash 로 오디오 플레이어 만들기

 Flash Player 는 다양한 멀티미디어를 불러오고 재생 할 수 있다. 그 중에서 오디오 관련 파일은 기본적으로 MP3 파일을 재생 할 수 있으며, popforge (http://code.google.com/p/popforge/) 와 같은 라이브러리를 사용하면 WAVE 파일도 재생 가능 하다. 하지만 이 문서에서는 Actionscript3 에서 제공하고 있는 기본 API 를 가지고 파일을 불러오고 재생 하기 위한 기본적인 이론에 대해 다룬다.


 Flash 에서 오디오 파일을 재생 하기 위해서는 Sound, SoundChannel 를 사용한다. 디테일한 플레이어를 구현하기 위해서는 다른 클래스도 알아야 하지만 기본 기능만 만든다면 위 두가지 클래스의 레퍼런스만 봐도 충분히 구현 할 수 있다. 


Sound Class


 Sound Class 를 MP3 파일을 로드 하고 재생 하는 기능을 담당한다. 파일을 로드 하기 위한 load, 재생하기 위한 play, 재생을 끈어버리기(재생의 멈춤이 아니다) 위한 close 메소드 등을 가지고 있다. MP3 파일을 재생 하기 위해서는 다음과 같은 절차를 따라야 한다.


1. Sound 객체 생성

2. Sound 객체에 Event.COMPLETE 이벤트 등록

3. load 메소드를 이용하여 파일 로드

4. 로드가 완료 되면 2 에서 등록했던 이벤트가 발생

5. 로드가 완료 된 후에 play 메소드를 이용해서 재생 


 오디오 파일을 로드 하는 방법은 URLLoader 나 Loader 에서 사용하는 방법과 동일하다. 다음은 위의 절차를 코드화 한 것이다.



package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.SecurityErrorEvent;
	import flash.media.Sound;
	import flash.net.Socket;
	import flash.net.URLRequest;
	
	public class SoundPlayerTest extends Sprite
	{
		private var _player:Sound;
		public function SoundPlayerTest()
		{
			_player = new Sound();
			_player.addEventListener(Event.COMPLETE, playerReadyHandler);			
			_player.addEventListener(IOErrorEvent.IO_ERROR, playerIOErrorHandler);
			_player.addEventListener(SecurityErrorEvent.SECURITY_ERROR, playerSecurityErrorHandler);
			
			_player.load(new URLRequest("remote/file/10cm_01.mp3"));
		}
		private function playerReadyHandler(event:Event):void 
		{		
			_player.play();
		}		
		private function playerIOErrorHandler(event:IOErrorEvent):void 
		{
			trace("로드에러");
		}
		private function playerSecurityErrorHandler(event:SecurityErrorEvent):void 
		{
			trace("보안에러");
		}
		
	}
}


 위와 같은 방법으로 로드를 하면 해당 파일에 대한 length 로 음원의 길이를 알수 있고, MP3 파일은 곡의 정보를 담고 있는 id3 태그를 가질수 있기 때문에 해당 파일에 id3 태그가 있다면 접근 할 수 있다. 기본적으로 접근 할 수 있는 id3 는 다음과 같다.



_player.addEventListener(Event.ID3, id3TagLoadHandler);
private function id3TagLoadHandler(event:Event):void 
{
	trace("album : "+_player.id3.album);
	trace("artist : "+_player.id3.artist);
	trace("comment : "+_player.id3.comment);
	trace("genre : "+_player.id3.genre);
	trace("songName : "+_player.id3.songName);
	trace("track : "+_player.id3.track);
	trace("year : "+_player.id3.year);
}


id3 태그에 대한 더 자세한 내용은 뒷부분에서 다루고 있다.


주의 해야 할 점은 새로운 파일을 로드 할때마다 Sound 객체를 새로 생성해 줘야 한다. 재사용할시 에러가 발생한다.


SoundChannel Class 


Sound Class 가 중요한 기능을 하고 있지만 모든 기능을 제공 하지는 않는다. SoundChannel Class 를 이용하여 사운드를 재생 하면서 디테일한 조작을 할 수 있다. SoundChannel Class 를 보면 다음과 같은 메소드와 속성이 정의 되어 있다.


속성


leftPeak, rightPeak : 왼쪽 오른쪽의 현재 진폭(볼륨)을 나타내는 0(묵음)부터 1(최대 진폭)까지의 값

position : 사운드가 재생 중일 때 position 속성은 사운드 파일에서 재생 중인 현재 위치를 밀리초 단위 나타냄

soundTransform : SoundChannel 이 가지고 있는 사운드를 조작하기 위한 SoundTransform 객체



메소드

stop : 사운드 재생을 중단


위의 Sound 객체에 stop 메소드가 없고, SoundChannel 에 stop 메소드가 정의 되어 있다. 그 이유는 Sound 객체는 play 메소드를 이용하여 로드한 파일을 열어 주는 역할을 하고 SoundChannel 은 열린 파일 스트림에 대해 조작 역할을 한다.

load 메소드를 이용해 파일을 로드 하고 play 를 할때 play 메소드의 반환값으로 SoundChannel 객체가 넘어오므로 사운드를 조작 하기위해서는 이 반환객체를 조작 하여 사운드를 컨트롤 할 수 있다.



var channel:SoundChannel = new SoundChannel();

channel = _player.play();


일시 정지 및 재생 위치 변경


Sound Class 나 SoundChannel Class 나 모두 일시정지하는 메소드가 없다. 일시정지 기능은 SoundChannel 의 position 값과 Sound Class 의 play 메소드를 사용하여 구현 할 수 있다. 먼저 사운드를 일시 정지 할때 SoundChannel 의 position 값을 저장하고, 다시 재생 하면 Sound 의 play 메소드의 파라미터로 해당 position 값을 넘겨 줘서 사운드를 재생 하면 된다. 코드는 다음과 같다.

 
private function play(position:Number = 0):void 

{	
		
	_channel = _player.play(position);

}


private function pause():void 

{

	_channel.stop();

}

// 재생 버튼 클릭

private function playButtonClicked(event:MouseEvent):void

{

	play(_channel.position);

}

// 일시 정지 버튼 클릭		

private function pauseButtonClicked(event:MouseEvent):void

{

	pause();

}


재생 위치를 변경하는것도 위와 같은 방식으로 하면 된다. 단 play 할때 position 의 위치가 로드된 파일 길이보다 길면 재생이 안된다. 그러므로 Sound 객체의 length 보다 긴지 확인이 필요하다.


private function play(position:Number = 0):void 

{		

       if(position > _player.length)	
       { 
                 position  = _player.length; 
       }

       _channel = _player.play(position);

}


볼륨 변경


볼륨은 SoundChannel 의 soundTransform 을 이용한다. soundTransform 속성은 SoundTransform 객체 이다. 이 객체는 사운드 볼륨을 조작 하기 위한 여러 속성을 가지고 있다. 이 속성 중 volume 값을 변경 하면 된다. 값은 0 ~ 1 사이 이다.



var soundTransform:SoundTransform = new SoundTransform();

soundTransform.volume = 변경할 값;

_channel.soundTransform = soundTransform;


주의할 점은 SoundChannel 객체의 soundTransform 값을 직접 변경 하는것이 아니라, 새로운 SoundTransform 을 생성하여 값을 변경한 후에 적용해 주는 방식이다.


id3 태그



 MP3 파일에는 id3 태그가 파일안에 정의 되어 있다. 그 형식들은 여러가지가 있으며, Flash Player 9 이후 버전 및 AIR 에서는 ID3 2.0 태그, 특히 2.3 및 2.4 태그를 지원 한다. 위의 예제에서 Event.ID3 이벤트를 통해 접근한 속성들은 Actionscript3 ID3Info (http://help.adobe.com/ko_KR/Flash/CS5/AS3LR/flash/media/ID3Info.html객체에서 정의하고 있는 값들이고 이외에도 Flash IDE 나 Flash Builder 의 자동완성에는 나오지 않지만 아래의 속성들이 접근 가능하다. 하지만 모든 값들은 해당 파일에 해당 속성이 정의 되어 있을 경우에만 접근 가능하고 정의 되어 있지 않다면 null 을 반환 한다.