2009-06-02 18 views
14

오디오 파일을 처리해야하는 응용 프로그램에서 작업하고 있습니다. mp3 파일을 사용할 때 데이터 처리 방법을 잘 모릅니다. 관심이있는 데이터는 오디오 바이트입니다. 우리가들을 수있는 데이터를 나타냅니다.MP3에서 오디오 데이터를 가져 오는 방법은 무엇입니까?

내가 wav 파일을 사용하고 있다면 44 바이트 헤더와 데이터가 있다는 것을 알고 있습니다. 그것이 mp3에 관해서, 나는 그들이 프레임들로 구성되어 있고, 각 프레임은 헤더와 오디오 데이터를 포함한다는 것을 읽었다. mp3 파일에서 모든 오디오 데이터를 가져올 수 있습니까?

자바 (나는 MP3SPI, Jlayer 및 Tritonus를 추가했습니다)를 사용 중이며 파일에서 바이트를 가져올 수 있지만이 바이트가 나타내는 내용이나 처리 방법에 대해 잘 모르겠습니다. . documentation for MP3SPI에서

답변

26

:

File file = new File(filename); 
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); 

그런 다음 바로 din에서 데이터를 읽을 - 그것은 decodedFormat에 따라, "원시"데이터가 될 것입니다. (자세한 내용은 docs for AudioFormat를 참조하십시오.)

(이 샘플 코드는 같은 스트림 또는 아무것도 닫지 않습니다 -. 정상으로 적절한 시도/마침내 블록을 사용)를

+0

안녕하세요 Jon, 빠른 답변 주셔서 감사합니다. 귀하의 제안에; 'decodedFormat'은 다른 형식으로 디코딩 된 mp3 데이터의 표현입니까? "din.read()"라고 쓰면 디코딩 된 형식으로 데이터 바이트가 나옵니까? 감사합니다. – dedalo

+0

예. 이 디코딩 된 형식은 "서명 된 PCM 데이터로 디코딩하기를 원합니다"라고 말합니다. –

+0

안녕하세요. 당신의 충고에 따라 행동했습니다. 내가 사용하는 데이터를 시각화하려면 : while ((numBytesRead = din.read (audioBytes))! = -1) {} 이것은 'din'의 바이트를 읽고이를 audioBytes 배열에 저장합니다. 나는 데이터를 시각화하려고 노력했다 : while ((numBytesRead = din.read (audioBytes))! = -1) { System.out.println ("Bytes Decoded value"+ audioBytes [0]);} 이 데이터에 대한 질문이 있습니다. 모든 샘플은 16 비트를 사용합니다. 즉, 배열 audioBytes에서 2 순위입니까? 모든 샘플 값을 어떻게 얻을 수 있습니까? 디코딩 된 형식 (wav)의 헤더 바이트가 44 바이트입니까? 도움을 주셔서 대단히 감사합니다! – dedalo

0

당신이 원하는 데이터를 실제 샘플, MP3는 데이터를 다르게 나타냅니다. 따라서 다른 모든 사람들이 말했듯이 MP3 데이터를 실제 샘플로 디코딩하여 용도에 맞게 라이브러리가 필요합니다.

0

다른 답변에서 언급했듯이 MP3를 일반 오디오 샘플로 디코딩하는 디코더가 필요합니다.

인기있는 옵션 중 하나는 JavaLayer (LGPL)입니다.

관련 문제