문제

나는 작업에 처리하는 응용 프로그램 오디오 데이터입니다.나는 자바를 사용하여(추가했 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 크거나 작은 훨씬 더 쉬운 솔루션은 이 문제를 해결합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top