본문 바로가기

IT/개발

오디오 raw PCM 데이터에 wav header 생성 하기(파이썬)

반응형

미디어를 다루다보면 raw pcm data를 처리하는 경우가 많이 있습니다. 

 

pcm 자체는 헤더 정보가 없기 때문에 재생을 하기 위해서는 sample rate와 sample 당 byte 수 channel 정보등을 알아야 합니다. 

 

따라서 raw pcm을 플레이어에서 바로 재생하기 위해 wav header를 추가하여 wav 파일로 만들어 주어야 합니다.  

이때 wav header는 단순히 오디오의 재생정보를 포함하고 있습니다. 

 

기본적으로 44 byte이고 이외 확장형태들도 있습니다. 

 

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

 

Wave File Specifications

Audio File Format Specifications File Description: WAVE or RIFF WAVE sound file File Extension: Commonly .wav, sometimes .wave File Byte Order: Little-endian Prof. Peter Kabal, MMSP Lab, ECE, McGill University: Last update: 2022-09-27 WAVE Specifications T

www.mmsp.ece.mcgill.ca

 

 

 

오다시티나 ffmpeg을 이용해서 wav 변환을 하면 디코딩 인코딩 과정에서 약간의 파형변화가 생길 수 있어 원래 생성했던 PCM의 데이터를 완벽하게 유지할 수 없는 경우가 있습니다. 

 

파이썬에서는 간단하게 헤더를 만들어 붙일 수 있는 패키지가 있습니다. 

 

아래와 같이 바이너리로 파일을 열고 wave 패키지를 통해 헤더를 생성해서 붙여주면 됩니다. 

 

import wave
import struct
import sys

def add_wav_header(pcm_file, wav_file, sample_width, channels, sample_rate):
   
    # WAV 파일 생성
    with wave.open(wav_file, 'w') as wav:
        wav.setnchannels(channels)
        wav.setsampwidth(sample_width)
        wav.setframerate(sample_rate)
        wav.setnframes(0)
        wav.setcomptype('NONE', 'not compressed')

        # PCM 데이터를 WAV 파일에 추가
        with open(pcm_file, 'rb') as pcm:
            pcm_data = pcm.read()
            wav.writeframes(pcm_data)

if __name__ == "__main__":
    # PCM 파일 및 WAV 파일 경로 설정
    #pcm_file_path = './pcm/original.PCM'
    #wav_file_path = './pcm/original.wav'
   
    pcm_file_path = sys.argv[1]
    wav_file_path = sys.argv[2]

    # PCM 파일의 속성 설정 (sample_width, channels, sample_rate)
    sample_width = 2  # 예: 16비트 PCM이면 2, 8비트 PCM이면 1
    channels = 2  # 스테레오인 경우 2, 모노인 경우 1
    sample_rate = 48000  # 샘플 레이트 설정

    # WAV 헤더 추가
    add_wav_header(pcm_file_path, wav_file_path, sample_width, channels, sample_rate)

 

반응형