변환하는 방법.WAV 오디오 데이터 샘플로 두 번 입력?
-
12-09-2019 - |
문제
나는 작업에 처리하는 응용 프로그램 오디오 데이터입니다.나는 자바를 사용하여(추가했 MP3SPI,Jlayer 및 Tritonus).나는 오디오를 추출하는 데이터.wav 파일을 바이트 배열입니다.오디오 데이터 샘플을 나와 작업하는 16 비트오.
에 따르면 내가 무엇을 읽은 형식을 중 하나에 대한 샘플입니다:
AABBCCDD
는 AABB 을 나타내는 왼쪽 채널 CCDD 궁 채널(2 개의 바이트에 대한 각 채널).I'd 변환이 필요한 샘플 이 double 값으로 입력.나는에 대해 읽기 데이터 형식입니다.Java 를 사용하 Big endian,.wav 파일에서 사용하는 작은 endian.나는 조금의 혼란이다.당신은 도울 수 있습니다 저는 변환 프로세스?감사합니다 당신은 모든
해결책
경고 : 정수 및 바이트가 서명됩니다. 어쩌면 낮은 바이트를 함께 포장 할 때 마스킹해야 할 수도 있습니다.
for (int i =0; i < length; i += 4) {
double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8));
double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8));
... your code here ...
}
다른 팁
바이트 버퍼를 사용할 때 (java.nio.Bytebuffer) 메소드 순서를 사용할 수 있습니다.
주문하다
공개 최종 바이 테 버퍼 주문 (바이오더 BO)
Modifies this buffer's byte order.
Parameters:
bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN
Returns:
This buffer
그 후에는 위에서 언급 한 값을 다음과 같이 얻을 수 있습니다.
getChar () getShort () getInt () getFloat () getDouble ()
위대한 언어는 Java ;-)
Little Endian은 데이터가 BBAA 및 DDCC 형식이라는 것을 의미합니다. 당신은 단지 그것을 주위에 교환 할 것입니다.
프레임의 시작부터 :
int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];
여기서 내가 당신의 샘플의 색인입니다.
나 개인적으로 보이는 라이브러리에 대한 않 endian 교환습니다.각 오디오 파일 형식은 가정에 대한 엔디안을 위해 당신고 받고 이 권리는 까다로운 모든 조금 깊이/데이터 형식 파일의 지원:
- 8bit-uint8
- 16 비트-int16
- 24bit-int32
- 32 비트-int32 으로 떠
- 32 비트-떠
- 64bit 블
하려는 경우 지원 가장 일반적인 형태의 파일해야 합 endian 변환 모두를 위해 이 데이터 형식.
내가 보기에 ByteSwapper, 을 줄 것이다,당신은 byteswapping 대부분의 유형을 위에 나열되어 있습니다.
그가 너무 나쁜 Java 없는 엔디안 분야에 자신의 파일 IO 클래스입니다.할 수 있는 단순히 파일을 열린 edianness 크거나 작은 훨씬 더 쉬운 솔루션은 이 문제를 해결합니다.