이글에서는 음악파일에 대한 전체적인 정보 (가수, 제목, 앨범, 앨범 이미지 등) 가 포함된 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
댓글 없음:
댓글 쓰기