Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


MP3 File Footer ID3V2 Spec Navigator
 
MP3파일을 분석하고 응용해봄으로 다른 파일들의 헤더를 조사할수 있는 부분까지 확장할수 있는 능력을 배양해 보도록 한다 ( 2003/02/28 ) 72
Written by ienvyou - 최지웅
1 of 1
 
이번에는 JAVA를 이용하여 mp3 파일의 정보를 읽어 들이는 방법에 대해 알아 보도록 하겠습니다
다행히 mp3 파일은 헤더 부분에 유용한 정보를 갖고 있기 때문에 FileSystemOject를 
이용하여 필요한 정보들을 얻어올 수 있습니다.

이것은 예전에 JMF를 이용하여 웹과 애플리케이션 파일공유를 위한 프로그램을 작성하는 
수강생분께서 요청하신 자료를 www.id3.org의 멀티미디어파일헤더 내용을 조사하여
byte단위로 체크하여 보여주는 프로그램을 작성했습니다.

개요를 보자면 우리가 사용하는 모든 파일, 프로토콜들은 각자를 인식할수 있게끔
꼬리표를 달아놓게 됩니다. 말그대로 여러분들 약국에 가서 약을 사려구 하는데 약에 
상표들이 붙어있지 않게 되면 약사는 제대로 된 약을 줄수 있을까요? 
당연히 없겠죠? 우리가 사용하는 모든 컴퓨터의 자료들이 그렇게 생겼다 이겁니다.
전산을 전공하신 분들이야 당연히 아실테구, 사실 모르셔도 되죠. 하지만 모르는게 
약이기 보다는 아는 것이 힘이므로 아셔야 합니다.

보통 파일이나 네트웍전송정보같은 것들은 수신하는 측이나 이용하는 측에서 그에 대한 
정보를 알아야 하기때문에 헤더라는 곳을 먼저 작성하여 그것에 대한 내용들을 담고 있게 됩니다.

여기서는 MP3파일을 예로 들었지만 AVI, MPEG등등의 파일또한 이런 구조를 가지고 있습니다. 
자 그러면 그 파일정보에 뭐가 들어있는지 한번 보도록 한 후 프로그램을 보도록 합시다.

	ID3/file identifier   "ID3" 
	ID3 version $02 00 
	ID3 flags %xx000000 
	ID3 size 4 *  %0xxxxxxx 

위와 같은 내용으로 시작해서 song name, artist info, album name 등등을 알아낼수가 있습니다. 
자세한 내용은 아래 프로그램을 보시도록 하죠
실제 MP3파일을 읽어들여서요 그 정보를 result.txt로 저장하는 부분입니다. 
파일에 대한 정보는 최종 128byte에 담겨있게 됩니다.

 그 부분을 각각에 대한 정보를 이용하여 parseParam()이라는 메소드를 이용하여 파싱하게 됩니다.

 자 이제 결과입니다.

source : HeaderTest.java

import java.io.*;

public class  HeaderTest
{

	public HeaderTest() {}
	public void  go() throws Exception
	{
		File f = new File("e:\\mp3\\pop\\shape.mp3");
		FileInputStream fis = new FileInputStream(f);

		FileOutputStream fos = new FileOutputStream("result.txt");
		System.out.println("FileSize : " + f.length());
		//최종 128byte skip
		fis.skip(f.length() - 128);


		int ch = 0;
		int count =0;
		byte [] b = new byte[128];

		while((ch = fis.read(b, 0, b.length)) != -1) {
			fos.write(b, 0, ch);
		}

		String tag = parseParam(b, 0, 3);
		String songName = parseParam(b, 3, 30);
		String artist = parseParam(b, 33, 30);
		String album = parseParam(b, 63, 30);
		String year = parseParam(b, 93, 4);
		String comment   = parseParam(b, 97, 30);
		String genre = parseParam(b, 127, 1);
		System.out.println("Tag : " + tag);
		System.out.println("Song Name : " + songName);
		System.out.println("Artist : " + artist);
		System.out.println("Album : " + album);
		System.out.println("Year : " + year);
		System.out.println("Comment : " + comment);
		System.out.println("Genre : " + genre);
	
	}
	
	public String parseParam(byte [] src, int start, int offset) {
		String paramValue = "";
		int end = start + offset;
		for( int i = start ; i < end ; i++ ) {
			paramValue += (char)src[i];
		}
		return paramValue;
	}


	public static void main(String[] args) throws Exception 
	{
		HeaderTest ht = new HeaderTest();
		ht.go();
	}
}


위와 같은 내용정보를 읽어서 파싱하는 프로그램을 작성하게 되면요, 
나중에 다른 미디어파일이나 네트웍전송정보를 자유자재로 핸들링 하실수 있습니다. 
또한 그러한 것들이 경험으로 점점 쌓인다면 여러분들이 직접 자신만의 프로토콜을 정의하여
여러분들의 애플리케이션에 적용시킬수 있는 수준이 이를겁니다.
 
1
References
 
http://www.id3.org
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD