2017-02-26 10 views
0

입력에 삽입 된 file.wav를 분석하기위한 프로그램을 만들었습니다. 원본 파일에서 시간 간격을 제거 할 수 있는지 알고 싶습니다 .wav. 명확한 시간 내에있는 분석을 위해 불필요한 부분을 잘라 냈습니다. 이러한 사운드 부분을 제거한 후에는 제거되지 않은 모든 사운드를 병합하는 새로운 연속 사운드를 얻게됩니다. 가능합니까? 나를 도와 줄 수 있습니까?사운드의 세그먼트를 삭제하는 방법은 무엇입니까?

+0

지금까지 시도한 것은 무엇입니까 – gpasch

답변

1

WAV 형식 파일을 읽고 머리글을 파싱 한 다음 오디오 곡선 데이터 요소를 일부 데이터 구조에 주차하면 두 가지 선택 사항이 있습니다. 장소에

  • 갱신

  • (이 작업을 수행 할 수 있습니다) 새로운 데이터 구조에 좋은 데이터 포인트를 복사 (난이도가 구현하는)

WAV 형식의

멋진 측면은 PCM 인 오디오 커브가 해당 커브의 불연속 점으로 표시된다는 의미입니다. 헤더에서 사용할 수있는 비트 심도를 확인했는지 확인하십시오. 일반적인 비트 심도는 16 비트이므로 각 샘플은 메모리 버퍼에서 2 바이트의 데이터를 사용합니다. 100 개 정도의 샘플 값을 출력하여 올바른 형식의 샘플을 준비했는지 확인하십시오. 16 비트이면 가능한 값의 범위는 2^16 개의 고유 정수 값에 매핑됩니다. 이 샘플 값을 검사 할 때 서명했는지 서명하지 않은지 여부가 중요합니다.

스테핑 스톤으로 나는 WAV 파일을 읽고 출력 파일에 각 바이트를 복사하는 몇 가지 코드 작업을 먼저 얻습니다. 이 새로운 출력 WAV 파일을 재생할 수 있는지 확인하십시오. 다음은 헤더를 파싱하고, 샘플 레이트 필드를 확인하고, 44100에서 22050으로 그 값을 업데이트하고 헤더 다음에 WAV 파일에 나타나는 오디오 데이터 바이트가 뒤 따르는이 업데이트로 헤더를 출력하는 것을 제외하고 비슷한 코드를 작성합니다. 이 WAV 파일을 재생하면 오디오 트랙의 속도가 빨라지거나 느려 집니까?

입력 WAV 파일을 열고 각 바이트를 읽은 후 헤더 바이트 다음에 두 바이트를 단일 16 비트 정수 변수로 결합하는 작업 기능을 얻습니다 (헤더에 16 비트 샘플이있는 경우). 각 오디오 샘플은 여러 바이트 (8 비트 오디오 끔찍한 소리)를 소비합니다. 따라서 24 비트 오디오가있는 경우 해당 채널의 각 오디오 샘플은 파일의 3 바이트에 걸쳐 있습니다. 크고 작은 엔디안 개념 (두 바이트가 왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽으로 나타남)을 알고 있어야합니다. 단순성을 위해 먼저 모노 채널 입력 WAV 파일을 작업하십시오. 스테레오 (2 채널) 또는 X 채널은 WAV 형식이 가능하지만 모노는 더 쉽습니다.

우리가 10 개 샘플 (각 16 비트 정수)

  • 0이 있다고 가정하자 - 3 선을
  • 4-7 나쁜 (우리는이 삭제됩니다)
  • 8-9 좋은

그래서 출력 파일에는 잘못된 샘플 4-7을 무시한 채로 남아 있기 때문에 단지 6 개의 샘플 만 남게됩니다. 모든 샘플에서

루프 - 입력 및 출력 데이터 구조 각각 자신의 인덱스가>에만이 코드에서 출력 데이터 구조로

int out_index = 0; 

int bit_depth = 16; // get this 16 from header, could be 24 for example 

// how many bytes in bit depth, 2 if 16 bit, 3 if 24 bit 
int incr_index = bit_depth/8; 

for (int in_index = 0; in_index < size; in_index += incr_index) { 

    if (is_sample_good(in_index)) { // is this sample good or bad 

     output_data[out_index]  = input_data[in_index]; 
     output_data[out_index + 1] = input_data[in_index + 1]; 

     out_index += incr_index; 
    } 
} 

공지 사항을 좋은 샘플을 복사 ... -> 현재 샘플이 좋은 여부를 식별 .우리가 좋은 표본에 대해서만 출력 지수를 올리기 때문에 중요합니다.

WAV 형식 파일 헤더는 항상 WAV 파일의 첫 번째 X 바이트 수입니다 (올바르게 기억하면 32 바이트). 이 헤더에는 전체 데이터 크기의 표시기가 있습니다. 출력 WAV 파일의 헤더 섹션에 넣을이 데이터 길이 헤더 태그의 값을 유도 할 좋은 샘플 수를 추적하십시오. 입력 파일을 반복하고 출력 데이터 구조 (메모리 버퍼)를 생성 한 다음 새 출력 파일을 열고이 파일에 길이 태그의 업데이트 된 값으로이 파일을 쓴 다음 새 메모리 버퍼를 작성하고 파일을 닫은 다음 그것을해라. 여기

는 일부 WAV 형식

http://unusedino.de/ec64/technical/formats/wav.html

https://www.gamedev.net/resources/_/technical/game-programming/loading-a-wave-file-r709

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

http://www.topherlee.com/software/pcm-tut-wavformat.html

http://www.labbookpages.co.uk/audio/javaWavFiles.html

링크입니다

http://www.drdobbs.com/database/inside-the-riff-specification/184409308

+0

감사합니다. 이 목적에 유용한 링크를 표시 할 수 있습니까? – Margherita