2010-04-05 4 views
2

java를 사용하여 두 개의 wav 파일을 병합하는 방법은 무엇입니까?2 개의 wav 파일을 하나의 wav 파일로 결합/병합하는 방법은 무엇입니까?

나는 this을 시도했지만 제대로 작동하지 않았으며, 다른 방법으로 시도 했습니까?

+2

어떻게 제대로 작동하지 않습니까? 무엇이 잘못 되었습니까? –

+0

결과 파일이 너무 짧게 나옵니다. 병합을 시도하는 파일의 각 파일을 1 초 이하로 고려해야합니다. 어쩌면 이것이 원인 일 수 있습니다. –

+0

그래서 각 파일의 길이는 1 초 이하입니까? 최대 노래 길이는 2 초가됩니까? 네가하는 일이 아닌가? –

답변

11

wav 파일의 바이트를 직접 사용하면 모든 프로그래밍 언어에서 동일한 전략을 사용할 수 있습니다. 이 예제에서는 두 소스 파일의 비트 전송률/숫자가 같고 길이/크기가 같다고 가정합니다. (병합을 시작하기 전에 편집 할 수없는 경우).

일반적인 헤더 길이가 44 또는 46 바이트 다음에 WAV specificaiton 이상

먼저 보면, 나는 stanford 물론 웹 사이트에서 좋은 것을 발견했다. 두 개의 파일을 연결하려면

(즉, 하나의 파일에 다음 다른 하나 WAV를 재생) :

  1. 하여 wav 파일이
  2. 처음 46분의 44 바이트를 잘라입니다 포맷 무엇인지 알아 파일의 나머지 부분은 데이터입니다.
  3. 새 파일을 만들고 거기에 헤더 중 하나를 붙여야합니다.

    새 wav 파일 = {헤더} = {46분의 44}는 긴

  4. 은 원본 파일

    새 wav 파일 = {헤더 데이터 1 + 데이터 2 +} =에서 두 개의 데이터 부분을 추가 바이트 { 44/46 + 크기 (데이터 1) + 크기 (데이터 2)} 바이트 길이

  5. 새 파일의 길이를 반영하도록 헤더를 두 곳에서 수정하십시오.

    a. 바이트 4 + 4를 수정하십시오 (즉, 오프셋 4에서 시작하는 4 바이트). 새 값은 새 wav 파일의 크기를 바이트 수 {44/46 + 크기 (data1) + 크기 (data2)} - 8 바이트로 나타내는 16 진수 여야합니다.

    b. 40 + 4 또는 42 + 4 바이트를 수정하십시오 (44 바이트 또는 46 바이트 헤더가 있는지에 따라 오프셋 40 또는 42에서 시작하는 4 바이트). 새 값은 새 wav 파일의 전체 크기를 나타내는 16 진수 여야합니다.즉, {46분의 44 + 크기 (데이터 1) + 크기 (데이터 2)}

대신 병합하거나 (둘 다 다음 같은 시간에 재생되도록) 두 파일을 혼합 할 경우

  1. 두 파일의 길이가 같으면 머리글을 편집 할 필요가 없습니다.
  2. 바이트 44/46부터 시작하여 각 샘플을 data1의 값 + data2의 값으로 편집해야합니다. 예를 들어 SampleRate가 8 비트라면 1 바이트를 수정하고, 샘플 속도가 16 비트라면 2 바이트를 수정할 것입니다. 나머지 파일은 그 당시의 사운드 파형을 나타내는 int 값을 저장하는 1/2bytes 샘플입니다.

    a. 파일의 나머지 샘플 각각에 대해 1/2 바이트 16 진수 문자열을 가져 와서 파일 data1과 data2에서 int 값을 가져옵니다.

    b. 1/2 바이트 정수를 함께 더하십시오. 결과를 16 진수로 다시 변환하고 출력 파일에서이 값을 사용하십시오.

    c. 원래의 1/2byte 샘플 블록에 맞는 평균값을 얻으려면 일반적으로이 숫자를 2로 나눠야합니다. objc (아마 signed 또는 unsigned int와 관련이 있음)에서 시도했을 때 왜곡이 발생하고 매우 큰 소리를 함께 병합하는 경우에만 문제가 될 가능성이 있으므로 분할 부분을 생략했습니다. 즉 data1 + data2가 1/2 바이트보다 클 때 사운드가 잘립니다. 클리핑 문제 here에 대한 토론이 있었으며 클리핑 기술 중 하나를 시도해 볼 수 있습니다.

+0

Hi Thamster, 나는 두 개의 wav 파일을 병합하고 싶습니다.하지만 그 파일을 병합 한 후에 우리는 노래와 노래를 함께 사용할 수 있습니다. 제발 ... int a = buffer_1 [i]/2; \t \t \t int b = buffer_2 [i]/2; \t \t \t int c = (a + b); \t \t \t datafinal [i] = (byte) c; – sandeep

+0

이 솔루션을 이용해 주셔서 감사합니다. 2로 나누지 않으면 미래에이 문제가 발생할 수있는 사람에게는 왜곡이 생깁니다. 16 비트 PCM 파일에 대해 모든 바이트를 개별적으로 추가합니다. –

2

병합은 믹싱을 의미하지만, 병합을 의미하는 것처럼 들립니다.

중간에 묵음으로 연결하려면 파일에 여러 개의 묵음 프레임을 삽입해야합니다. 묵음 프레임은 모든 채널에 "0"이있는 프레임입니다. 서명 된 샘플을 사용하는 경우 이것은 문자 그대로 0이며, 부호가없는 경우 maxvalue/2입니다.

각 프레임에는 각 채널마다 하나의 샘플이 있습니다. 따라서 CD 포맷으로 1 초의 무음을 생성하려면 44100 (hz) * 2 (프레임 당 채널) = 88200 16 비트 부호있는 int를 값 0으로 삽입합니다. Java 오디오 추상화에 의해 추상화 된 원시 파일에 액세스하는 방법을 모르지만 삽입 할 데이터입니다.

관련 문제