이글에서는 음악파일에 대한 전체적인 정보 (가수, 제목, 앨범, 앨범 이미지 등) 가 포함된 ID3V2 태그를 사용하여 이미지를 추출하고자 한다. 다음은 ID3V2 의 기본 구조이다.
다행스러운 것은 ID3V2 데이터 접근을 위한 라이브러리가 이미 존재하고 있다는 점이다. 이 글에서는 jid3lib 라이브러리를 사용하였다. jid3lib 라이브러리는 아래와 같이 pom.xml 파일에 라이브러리를 추가하여 사용할 수 있다.
1 2 3 4 5 6 | < dependency > < groupid >net.sf.javamusictag</ groupid > < artifactid >jid3lib</ artifactid > < version >0.5.4</ version > </ dependency > |
이제 jid3lib 라이브러리를 이용하여 mp3파일을 ID3v2 에서 앨범 이미지를 추출해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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
댓글 없음:
댓글 쓰기