Sound객체를 생성에 Complete이벤트가 발생한 다음에야 재생시간을 구할 수 있습니다.
재생목록에 추가를 해서 그냥 간단히 재생시간을 보여줘야하는데, 100곡을 재생목록에 추가를 해버리면 AIR애플리케이션이 미친듯이 메모리를 잡아먹는 것을 볼 수 있습니다-_-;
그래서 찾아보니, mp3 Header정보를 이용해서 재생시간을 구할 수 있습니다.
재생시간 = 파일크기 * 8 / 비트레이트 로 구할 수 있습니다.
그러면 비트레이트만 구하면 되는데, 이건 MP3Header에서 찾을 수 있습니다.
MP3 BITRATE는 http://www.datavoyage.com/mpgscript/mpeghdr.htm에 의하면 MPEG버전, LAYER, Bitrate Index로 구할 수 있습니다. MP3는 각각 Frame별로 Header가 존재하는데, 거기서 위에 정보를 구할 수 있는 것 같습니다.
ID3v2태그가 있는 경우는 ID3v2태그 다음에 MP3Header가 나옵니다. 그렇다면 ID3v2태그의 길이를 구해서 그 다음부터 MP3Header를 찾아야 합니다. ID3v2태그는 길이가 가변적입니다.그래서 총길이를 알아야하는데, 총길이는 ID3v2태그 맨 앞에 나오는 10byte Header부분에서 구할 수 있습니다.
이 Header부분의 6byte~10byte까지가 ID3v2의 총 길이인데요. 여기의 값이 00 00 1F 76(00011111 01110110)이라면 각각 MSB를 제거하여 붙인 값이 총 길이가 된다더군요. 00111111110110 -> 4086byte.
우선 C#으로 구현해놓은 소스가 있습니다. 그것을 Actionscript3로 변환했습니다(구현하려니 힘들어서 ㅠ)
C#소스 -> http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=79
제가 변환한 AS3용 MP3Header클래스입니다. 제가 가지고 있는 MP3 대부분 테스트해봤는데 잘 되더라구요.

MP3Header클래스
사용법은 이렇게 쓰시면 됩니다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="init()">
<mx:Script>
<![CDATA[
import util.MP3Header;
private function init():void
{
var mp3Header:MP3Header = new MP3Header();
mp3Header.readMP3Information("D:/눈물이 글썽 - 서진영.MP3");
trace("BITRATE = " + mp3Header.intBitRate);
trace("Frequency = " + mp3Header.intFrequency);
trace("Mode = " + mp3Header.strMode);
trace("LengthFormatted = " + mp3Header.strLengthFormatted);
trace("Length = " + mp3Header.intLength);
}
]]>
</mx:Script>
</mx:WindowedApplication>
[/code]
[code]
BITRATE = 64
Frequency = 44100
Mode = Stereo
LengthFormatted = 04:00
Length = 240
[/code]
댓글을 달아 주세요
비밀댓글입니다
와우 감사합니다 ^^
이거 블로그코리아의 리뷰룸같은건가요? ^^
ID3 태그가 있는 경우는 괜찮겠지만, 그 외에 저 위의 계산식으로는 CBR에 대해서만 정확히 나오게 됩니다.
VBR에 대해서는 정확한 시간이 안나오죠..
아네 ^^ 맞습니다. 제가 VBR은 시간을 어떻게 구하는지몰라서 ㅠ
저기 C#구현체는 VBR인 경우도 추출할 수 있게 구현이 되어있습니다.
그래서 제가 포팅한 as3용도 VBR MP3의 재생시간을 잘 구해옵니다^^
비밀댓글입니다
안녕하세요~
혹시....프로젝트 이름이 MP3Header가 아니신지?
아니라면MP3Header.as에 있는 package이름이 해당 폴더에 정확히 있는지가 중요합니다.
지금 파일에는 rtplayer.util이라고 되어있는데, 만약 이 클래스파일이 src 바로 아래 있다면 rtplayer.util을 지워야합니다.
음...안되시면 다시 또 연락주세요 ^^
본문과 관계없지만
에어를 윈도우창이 아닌 웹브라우저나~~ flex등에서 호출해서 사용할 수 있는 건가요?
플렉스로 로컬파일 경로가져오는 부분을 찾다가 에어를 사용해서 해결했다기에 검색하다 보니 여기까지 오게 되었네요~~~
안녕하세요!
에어는 데스크톱에서 돌아가는 애플리케이션입니다. Flex에서 호출하고 그런 것이 아닙니다. Flex를 이용해서 에어애플리케이션을 만들 수 있죠.
로컬파일 접근은 Flex에서 할 수 없습니다. Flex에서 특정파일을 선택하면 가능하지만, 임의로 타 컴퓨터에 있는 파일을 접근할 순 없습니다^^