2013-11-02 4 views
2

저는 자바의 오디오 프로젝트에서 파일 확장명이 아닌 데이터를 기반으로 오디오 파일 유형을 결정해야하며 MP3로 벽을 치고 있습니다. 내가 이해하는 한, MP3 파일은 각 프레임이 프레임 동기화를위한 11과 다른 데이터의 모음을 포함하는 4 바이트 헤더를 갖는 프레임으로 나뉩니다. 지금은 내 코드가 WAVE 파일을 정확하게 식별 할 수 있지만 테스트 MP3 파일의 바이트를 읽기 시작하면 11111111 바이트 (처음 11 번째 프레임 동기 비트)를 찾을 수 없습니다.MP3 프레임 헤더 바이트를 읽을 수 없습니까?

try { 
     FileInputStream fis = new FileInputStream(f); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] buff = new byte[11]; 
     byte[] byteData; 
     int bytes = 0; 

     while ((bytes = fis.read(buff)) != -1) { 
      baos.write(buff, 0, buff.length); 
     } 

     byteData = baos.toByteArray(); 

     fis.close(); 
     baos.close(); 

     if ((int)byteData[0] == 255) { 
      type = "MP3"; 
     } else if (("" + (char)byteData[8] + (char)byteData[9] + 
       (char)byteData[10] + (char)byteData[11]) == "WAVE") { 
      type = "WAVE"; 
     } 

    } 

답변

2

당신은 아마 MP3 파일의 처음 세 바이트를 찾을 수 있습니다 :

49 44 33 

이의 ID3v2 태그가있는 MP3를위한 '매직 넘버'입니다 .... at least according to wikipedia

편집

좋아요, 그래서 내 시스템을 살펴 봤는데 MP3의 마법 번호가 포함되어 있습니다 :

73 68 51 

아스키는 'ID3'입니다.

byte x = ....; 
if (x == 255) {...} 

: INT는 당신이 변환 권리를 수행해야합니다 .... 시험을 내리는 데 필요한 값에 대해 당신이 바이트 값을 테스트 할 때 당신은 .... 당신의 바이트 조작에 약간의 문제가

(byte)x의 범위는 -128에서 +127이므로 'x'의 값은 true가 아닙니다.

if ((x & 0xff) == 255) { .... } 

내 시스템에 물건을 테스트하기 위해 방법을 수정 한 및 WAV 파일과 몇 MP3의를 시도 :

은 당신이해야 할이 테스트 작업을 확인하십시오. 이것은 내가 가지고있는 코드입니다 :

public static final String getValid(File f) throws IOException { 
    FileInputStream fis = new FileInputStream(f); 
    byte[] buff = new byte[12]; 
    int bytes = 0, pos = 0; 

    while (pos < buff.length && (bytes = fis.read(buff, pos, buff.length - pos)) > 0) { 
     pos += bytes; 
    } 

    fis.close(); 

    // this is your test.... which should bitmask the value too: 
    if ((buff[0] & 0x000000ff) == 255) { 
     return "MP3 " + f; 
    } 
    // My testing indicates this is the MP3 magic number 
    if ( 'I' == (char)buff[0] 
     && 'D' == (char)buff[1] 
     && '3' == (char)buff[2]) { 
     return "MP3 ID3 Magic" + f; 
    } 
    // This is the magic number from wikipedia (spells '1,!') 
    if (49 == buff[0] && 44 == buff[1] && 33 == buff[2]) { 
     return "MP3 ID3v2" + f; 
    } 
    if ( 'W' == (char)buff[8] 
     && 'A' == (char)buff[9] 
     && 'V' == (char)buff[10] 
     && 'E' == (char)buff[11]) { 
     return "WAVE " + f; 
    } 

    return "unknown " + f; 

} 
+0

지금 제가 읽고있는 첫 번째 바이트는 '-1 ​​-5 -78'입니다. 어떻게 든 while 루프를 종료하지 않습니다. 정보를 저장하는 방식에 오류가있을 수 있습니까? – Chris

+0

예, 당신은 잘못하고 있습니다, 나는 내 대답을 편집 할 것입니다 ....하지만 처음에는 처음 11 바이트 만 읽으려는 의도입니까? – rolfl

+0

예, 파일의 전체 내용은 다른 곳에서 읽습니다. 나는 현재 반환 된 바이트가 정확하다는 것을 깨달았습니다.'-1 -5'는 내가 찾고있는 11 비트를 포함하고 있습니다. 그러나 이것이 MP3 검증에 접근하는 가장 좋은 방법인지는 아직 확실하지 않습니다. – Chris

관련 문제