2019년 12월 1일

MP3 파일에서 썸네일 이미지 추출하기 (Extract a thumbnail image from a mp3 using java )

MP3(MPEG Audio Layer III)는 오늘날 가장 널리 사용되는 오디오 표준중 하나로 MPEG(Moving Pictures Experts Group) 에 의하여 만들어졌으며 MPEG1 또는 MPEG-2 Audio Layer 3 을 줄인말이다. MP3는 전체 파일 크기를 줄이기 위하여 압축 알고리즘을 사용하기 때문에 손실음원(lossy)으로 알려져있다. MP3 파일은 메타정보를 가지고 있는 태그(ID3V1, ID3V2)들과 그 사이에 연속하는 Frame 의 집합으로 구성된다.



이글에서는 음악파일에 대한 전체적인 정보 (가수, 제목, 앨범, 앨범 이미지 등) 가 포함된 ID3V2 태그를 사용하여 이미지를 추출하고자 한다. 다음은 ID3V2 의 기본 구조이다.



다행스러운 것은 ID3V2 데이터 접근을 위한 라이브러리가 이미 존재하고 있다는 점이다. 이 글에서는 jid3lib 라이브러리를 사용하였다. jid3lib 라이브러리는 아래와 같이 pom.xml 파일에 라이브러리를 추가하여 사용할 수 있다.

 

  
  
      net.sf.javamusictag
      jid3lib
      0.5.4
  



이제 jid3lib 라이브러리를 이용하여 mp3파일을 ID3v2 에서 앨범 이미지를 추출해보자.

 
package tests;

import java.io.File;
import java.util.Iterator;

import org.apache.commons.io.FileUtils;
import org.farng.mp3.MP3File;
import org.farng.mp3.filename.FilenameTag;
import org.farng.mp3.id3.AbstractID3v2;
import org.farng.mp3.id3.FrameBodyAPIC;
import org.farng.mp3.id3.ID3v2_3Frame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Mp3Test {

 private Logger log = LoggerFactory.getLogger(getClass().getName());
 
 public void extractImage (File mp3File, File thumbnail) {
  
  try {
   MP3File mp3file = new MP3File(mp3File);
   FilenameTag fileNameTag = mp3file.getFilenameTag();
   AbstractID3v2 id3v2 = mp3file.getID3v2Tag(); 
   log.debug("fileNameTag: '{}'", fileNameTag);
   Iterator iter = id3v2.getFrameIterator();
   while(iter.hasNext())
   {
    ID3v2_3Frame frame =  (ID3v2_3Frame)iter.next(); 
    log.debug("Frame: '{}' {}", frame.getIdentifier(), frame.getClass().getName());
    if( frame.getBody() instanceof FrameBodyAPIC ) { 
     FrameBodyAPIC apicBody = (FrameBodyAPIC) frame.getBody();
     Object bytes = apicBody.getObject("Picture Data");
     log.debug("Found APIC Frame.");
     log.debug( "encoding : {}, mine type : {}, image : {}" , apicBody.getObject("Text Encoding"), apicBody.getObject("MIME Type"), bytes );
     if( bytes!= null)
         FileUtils.writeByteArrayToFile(thumbnail, (byte[]) bytes);
     break;
    }else {
     continue;
    }
   } 
  } catch (Exception e) {
   log.error(e.getMessage(), e);
  }
  
  
 }
}


참고자료
http://id3.org/id3v2-chapters-1.0
https://www.semanticscholar.org/paper/MP3-files-as-a-steganography-medium-Zaturenskiy/6c024648400e55744906e9ab7cf2ceaf52f422cd
http://devqoo.blogspot.com/2012/06/mpeg-1-layer-3-mp3.html
https://stackoverflow.com/questions/37910962/get-image-from-mp3-file-with-java-id3-tag-library

댓글 없음:

댓글 쓰기