2011-11-29 3 views
1

오디오 디코딩 관련 문제가 있습니다. mp3 디코딩 용 SPIMP3 라이브러리가 있고 mp3를 디코딩하여 바이트 배열에 저장하려고합니다. 여기 Java - MP3 디코딩 및 바이트 배열에 저장

내가 2 분의 MP3 노래를 디코딩 할 때 그것은 나를 부여 것은, 예를 들어, 다음 바이트 :

[-1, 0, 42, -115, -45, 0, 14 ... 등].

하지만 절반이 MP3를 자르고 난 다음 바이트를 얻을 상반기 디코딩 할 때 :

[1, 0, 0, 65, -97, 135, -64, 32 ... 등]

이상한 것은 그들이 일치하지 않는다는 것입니다. 여기에있는 유일한 차이점은 오디오 길이이지만, mp3 샘플의 첫 부분을 모두 디코딩합니다. 여기

내 코드입니다 :

public void testPlay(String mp3) { 
    try { 
     File file = new File(mp3); 
     AudioInputStream in = AudioSystem.getAudioInputStream(file); 
     AudioInputStream din = null; 
     AudioFormat baseFormat = in.getFormat(); 
     AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
       baseFormat.getSampleRate(), 
       16, 
       baseFormat.getChannels(), 
       baseFormat.getChannels() * 2, 
       baseFormat.getSampleRate(), 
       false); 
     din = AudioSystem.getAudioInputStream(decodedFormat, in); 

     play(decodedFormat, din); 
     spi(decodedFormat, in); 
     in.close(); 
    } catch (Exception e) { 
     System.out.println("MP3"); 
    } 

} 

private void play(AudioFormat targetFormat, AudioInputStream din) throws IOException, LineUnavailableException { 

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    byte[] data = new byte[4096]; 
    SourceDataLine line = getLine(targetFormat); 

     int nBytesRead = 0, nBytesWritten = 0; 
     while (nBytesRead != -1) { 
      nBytesRead = din.read(data, 0, data.length); 
      if (nBytesRead != -1) { 
       nBytesWritten = line.write(data, 0, nBytesRead); 
       out.write(data, 0, 4096); 
      } 

     } 

     byte[] audio = out.toByteArray(); 

} 

예상되는이 일이 아니면 내 코드에 문제가 ???

내 mp3의 일치하는 부분에 대해 동일한 바이트를 가져 오도록 내 코드를 어떻게 변경합니까?

감사합니다.

답변

3

이 행은 다음과 같습니다

out.write(data, 0, nBytesRead); 
+0

안녕하세요 jtahlborn 및 응답 주셔서 감사합니다. 나는 당신의 제안을 시도했지만 운이 없었습니다. 데이터에는 여전히 처음부터 약간의 편차가 있습니다. 내가 무엇을하고 있는지 설명해 주겠다. – DaReDeViL

+0

2 분짜리 노래가 있고, 위 코드로 디코드하려고하면 다음과 같은 바이트 배열의 특정 위치를 얻는다. [2, 44, -71, - 99, 134]. 그런 다음 대담을 사용하여 mp3의 끝에서 1 초를 자릅니다. 그런 다음 해독하려고합니다. 마지막 데이터와 동일한 위치에 다음 데이터를 얻습니다. [9, 35, -66, -33, 124]. 포기 자리는 배열의 시작 부분에 있습니다. 데이터가 마지막으로 한 번만 남아 있으면 안됩니까? 감사합니다. – DaReDeViL

+0

@DaReDeViL - 대담을 사용하여 끝에서 1 초를 자르면 시작 부분이 변경되지 않았습니까? 대담성은 파일을 다시 인코딩하여 이전과 약간 다르게 만들 수 있습니다. 한 가지 쉬운 방법은 mp3 바이너리 데이터가 제거 된 부분까지 일치하는지 확인하는 것입니다 (디코딩하기 전에). – jtahlborn

관련 문제