ActionScript3가 제공하는 Sound클래스에서 구하는 재생시간은 구하는데 너무 오래걸립니다.
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.as

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]

 
Posted by 머드초보

댓글을 달아 주세요

  1. 2008.11.20 13:27  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 머드초보 2008.11.21 16:29  댓글주소  수정/삭제

      와우 감사합니다 ^^
      이거 블로그코리아의 리뷰룸같은건가요? ^^

  2. 지나가다가 2008.11.21 18:12  댓글주소  수정/삭제  댓글쓰기

    ID3 태그가 있는 경우는 괜찮겠지만, 그 외에 저 위의 계산식으로는 CBR에 대해서만 정확히 나오게 됩니다.
    VBR에 대해서는 정확한 시간이 안나오죠..

    • 머드초보 2008.11.21 23:28  댓글주소  수정/삭제

      아네 ^^ 맞습니다. 제가 VBR은 시간을 어떻게 구하는지몰라서 ㅠ
      저기 C#구현체는 VBR인 경우도 추출할 수 있게 구현이 되어있습니다.
      그래서 제가 포팅한 as3용도 VBR MP3의 재생시간을 잘 구해옵니다^^

  3. 2008.12.11 15:43  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 머드초보 2008.12.12 02:23  댓글주소  수정/삭제

      안녕하세요~
      혹시....프로젝트 이름이 MP3Header가 아니신지?
      아니라면MP3Header.as에 있는 package이름이 해당 폴더에 정확히 있는지가 중요합니다.
      지금 파일에는 rtplayer.util이라고 되어있는데, 만약 이 클래스파일이 src 바로 아래 있다면 rtplayer.util을 지워야합니다.
      음...안되시면 다시 또 연락주세요 ^^

  4. air어려워 2009.02.17 09:21  댓글주소  수정/삭제  댓글쓰기

    본문과 관계없지만
    에어를 윈도우창이 아닌 웹브라우저나~~ flex등에서 호출해서 사용할 수 있는 건가요?
    플렉스로 로컬파일 경로가져오는 부분을 찾다가 에어를 사용해서 해결했다기에 검색하다 보니 여기까지 오게 되었네요~~~

    • 머드초보 2009.02.18 20:40  댓글주소  수정/삭제

      안녕하세요!
      에어는 데스크톱에서 돌아가는 애플리케이션입니다. Flex에서 호출하고 그런 것이 아닙니다. Flex를 이용해서 에어애플리케이션을 만들 수 있죠.
      로컬파일 접근은 Flex에서 할 수 없습니다. Flex에서 특정파일을 선택하면 가능하지만, 임의로 타 컴퓨터에 있는 파일을 접근할 순 없습니다^^