2016-11-17 2 views
1

현재 파이썬 만 사용하여 웨이브 파일에 대한 소규모 연구를하고 있습니다. 지금 당장 해결할 수없는 한 가지 문제는 wav 데이터를 분리하는 것입니다. 24 비트 사운드 깊이의 형식 파일.splititng 순수 파이썬에서 간격이 24 비트 깊이의 웨이브 사운드

기본 아이디어는 다음과 같습니다. t1 - 시작 및 t2 -end가 주어 졌으므로 slice을 가져와야합니다. 이는 매우 명확합니다.

def split_in_interval(self, start, end): 
    start *= ONE_SEC_MS 
    end *= ONE_SEC_MS 
    header = self.wav_header.header_description 
    infile = open(self.file_name, 'rb') 

    rate = header['sample_rate'] 
    frames_per_m_sec = rate // 1000 
    length = (end - start) * frames_per_m_sec 
    start_ms = start * frames_per_m_sec 

    name_str = self._naming_fragment(start, end) 
    out_file = open(name_str, 'wb') 

    # as the size changes - need to recalculate only last part of header, 
    # it takes 4 last bytes of header 
    out_file.write(infile.read(WAV_HEADER - 4)) 

    size = length * header['block_align'] 
    # header['num_channels'] * width 
    packed_size = struct.pack('<L', size) 
    out_file.write(packed_size) 

    anchor = infile.tell() 
    infile.seek(anchor + start_ms) 

    out_file.write(infile.read(size)) 
    out_file.close() 
    infile.close() 

내 코드는 꽤 간단하고 16 비트 및 8 비트 깊이 사운드와 잘 작동한다고 생각하지만 24 회 시도한 후에는 실패합니다.

속도와 밀리 초로 변환, 내 시작 및 끝 매개 변수 또한 ms로 변환합니다. 그리고이 계산에 기초하여, 그들이 맞다고 가정하고, 내 소스 오디오에서 start_point를 찾고이 지점에서 끝까지 씁니다. 무엇을 잘못 할 수 있습니까? 만 사용하여이 문제를 해결하는 방법 외부 라이브러리가없는 Python.

미리 감사드립니다.

+0

이것이 문제와 직접 관련이 있는지는 모르지만 정수 분할로 인해 'frames_per_m_sec = rate // 1000'이 나에게 문제가있어 숫자 정밀도가 떨어질 수 있습니다. 샘플 속도가 예를 들어 44.1kHz이고 흔하지 않은 경우'frames_per_m_sec = 44'가되고 프레임 오프셋으로의 시간 전환은 몇 % 정도 벗어납니다. – wildwilhelm

+0

24 비트 파일에서 코드가 "실패"하는 것을보다 구체적으로 설명 할 수 있습니까? 문제가 어떻게 나타나나요? – wildwilhelm

+0

정밀도에 대한 귀하의 메모가 절대적으로 잡음이없는 소리에 유용 할 수 있다고 생각하지만, 16 비트 구성에서는 괜찮습니다. 그러나, 24 비트 시도는 결과 파일이 noize로 가득 차고 원음이 들리지 않습니다. – Lescott

답변

0

외부 라이브러리를 사용할 수 있다면 soundfile 모듈을 권장합니다.이 모듈은 24 비트 파일을 즉시 처리합니다.

순수한 파이썬을 사용하고 싶다면 적어도 내장 된 wave 모듈을 사용해야합니다.이 모듈은 적어도 헤더를 처리합니다. 당신은 여전히 ​​원시 바이트를 의미있는 것으로 변환해야합니다.

코드의 일부만 표시하기 때문에 어떤 일이 잘못 될지 알기가 어렵습니다. 16 비트와 8 비트에서 작동하며 24에서는 작동하지 않는 코드를 보여줘야합니다. 코드에 비트 깊이에 대한 언급이 없습니다.

tutorial about the wave module을 보면 도움이 될 것입니다.

관련 문제