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


댓글 없음:
댓글 쓰기