2011-03-20 2 views
1

Java에서 X-Y 오실로스코프를 만들려고 노력 중입니다. jFlac에 대한 모든 설명서를 읽었습니다.이 라이브러리는 제 .flac 오디오 파일과 무료 무손실 오디오 코덱 설명서 here을 디코딩하는 데 사용하고 있습니다. 내가 겪고있는 문제에 대한 해답을 찾을 수없는 것 같습니다. 다음을 고려하십시오.Java : X-Y 그리드에서 .flac 오디오 파일의 왼쪽 및 오른쪽 채널을 플로팅합니다. (오실로 스코프)

public void processPCM(ByteData pcm) { 
    byte[] temp = pcm.getData(); 
    line.write(temp, 0, pcm.getLen()); 
    leftAndRight = new int[pcm.getData().length]; 
    for(int i = 0; i < temp.length; i+=2){ 
     leftAndRight[i/2] = (temp[i + 1]<<8) + (temp[i] & 0xff); 
    } 
} 

여기 내 파일의 샘플 데이터가 SourceDataLine에 저장되어 재생됩니다. 내가 데이터를 라인에 쓴 후, 왼쪽과 오른쪽 오디오를 별도의 정수 배열 변수 x []와 y []로 각각 변환하려고합니다.

는 STREAMINFO 파일에 대한 전 사용하고있다 : 상기 코드, PCM에서

리틀 엔디안

PCM_SIGNED 44100.0 ㎐, 16 비트, 스테레오, 4 바이트/프레임, .getLen()은 16384의 값을 반환하고 pcm.getData()는 길이가 90,112 인 바이트 배열을 반환합니다.이 바이트 배열의 데이터입니다. 잘못 입력하지 않았다면 왼쪽 및 오른쪽 채널을 분리해야합니다. 그런 다음 정수 배열로 변환하십시오. 이것은 내가 성취하는 방법을 이해하지 못하는 부분입니다.

편집 : 위의 코드는 정수 배열로 바이트 배열을 얻는 방법이 될 수 있다고 생각했지만 위의 코드를 변경했지만 왼쪽 및 오른쪽 채널이 배열되는 방식은 여전히 ​​우둔합니다.

답변

1

http://jflac.cvs.sourceforge.net/viewvc/jflac/jFLAC/src/java/org/kc7bfi/jflac/FLACDecoder.java?revision=1.13&view=markup의 코드를 보면 바이트 배열의 내용이 다음과 같은 것으로 나타났습니다. 각각 일련의 채널 : 일련의 채널 : 하나의 샘플을 나타내는 일련의 바이트 채널, 최하위 바이트 먼저. getLen()의 값은 유효 바이트 수입니다.

byte[] data = pcm.getData(); 
int n_bytes = pcm.getLen(); 
int n_samples = n_bytes/(n_channels*bytes_per_sample); 
int k=0; 
for (int i=0; i<n_samples; ++i) { 
    for (int j=0; j<n_channels; ++j) { 
    output[j][i] = data[k] + (data[k+1)<<8); 
    k += 2; 
    } 
} 

(경고 : 코드

그래서, 당신이 뭔가를 할 것 등 같은 ByteData 개체를 재사용하기 때문에 그이, 반복 재 할당을 피하기 위해 overallocated 될 수보다 더 많은 데이터가있을 수 있습니다 테스트되지 않았고 문법 오류와 버그로만 구성되었을 수도 있지만, 그 아이디어는 충분히 명확하다.

+0

고맙습니다. 매우 도움이됩니다. – kieve

관련 문제