2013-11-26 7 views
2

보통 wav 파일의 subchunk1 크기는 16입니다. 그러나 subchunk1size = 18 인 wav 파일이 있습니다. subchunk1size = 16 인 wav 파일을 읽는 데 C++ 코드가 있습니다. subchunk1size = 18 인 wav 파일을 읽고 싶습니다. 어떤 도움을 주시면 감사하겠습니다.C++는 wav 파일을 읽습니다. subchunk1size = 18

typedef struct header_file 
{ 
    char chunk_id[4]; 
    int chunk_size; 
    char format[4]; 
    char subchunk1_id[4]; 
    int subchunk1_size; 
    short int audio_format; 
    short int num_channels; 
    int sample_rate;    
    int byte_rate; 
    short int block_align; 
    short int bits_per_sample; 
    char subchunk2_id[4]; 
    int subchunk2_size;   
} header; 

위는 subchunk1size와 wav 파일을 읽을 수있는 내 코드는 기대로 = 16

+0

코드를 입력하는 것을 잊지 마십시오. –

+2

μ-law와 같은 비 PCM 데이터의 "fmt"청크입니다. 하위 덩어리가 첫 번째 덩어리라고 가정하지 마십시오. 기본 참조 [여기에 있습니다] (http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html). –

+1

WAV 파일을 손으로 파싱 할 때의 고통을 피하고 "무료"로 많은 다른 오디오 포맷에 대한 지원을 받으려면 libsndfile을 확인하십시오. 거의 모든 오디오 파일을 sf_open() 할 수 있고 오디오 샘플을 읽을 수 있습니다. (http://www.mega-nerd.com/libsndfile/) –

답변

3

WAV 파일은 같은 단단한 구조가없는에서 구조체 header_file입니다. "fmt"청크는 반드시 파일 헤더를 따라가는 첫 번째 파일 일 필요는 없지만 (보통은 그렇지만), 그 크기는 반드시 16 바이트 일 필요는 없습니다. 압축 된 오디오는 wav 파일에 저장할 수 있습니다.이 경우 audio_format 필드는 1이 아니며 "fmt"청크는 16 바이트가 아닌 다른 크기를 가질 수 있습니다.

WAV 파일을 구문 분석 할 수있는 적절하고 유연한 방법은보다 세분화 된 구조를 사용하는 것입니다

struct wave_header 
{ 
    char chunk_id[4]; 
    int chunk_size; 
    char format[4];  
}; 

struct riff_chunk_header 
{ 
    char id[4]; 
    int size; 
}; 

struct wave_fmt_chunk 
{ 
    short audio_format; 
    short num_channels; 
    int sample_rate;    
    int byte_rate; 
    short block_align; 
    short bits_per_sample; 
}; 

그런 다음 구문 분석 로직 (데이터 각 단계에서 읽은 유효성을 검사 돌보는)해야합니다

  1. 당신이 읽은 청크 헤더의 ID는 "FMT는"없는 경우 wave_header
  2. 가하는 riff_chunk_header
  3. 읽기 읽기의 청크를 킵 audio_format 필드
  4. 을 읽고 다음 청크 헤더
  5. 을 읽을이 audio_format에 따라 "FMT"덩어리의 나머지 데이터를 해석하는 2 단계로 다시 루프 (당신은 바이트의 크기를 가지고). 1이면 PCM 데이터가 있고 그 청크는 예상되는 16 바이트를 가져야합니다. 1이 아닌 경우 해당 압축 형식에 대한 설명서를 찾아야합니다.

일반적으로 추가 데이터는 정상적으로 무시하는 것이 좋습니다. 따라서 "fmt"청크가 18 바이트 인 PCM 인코딩 wav 파일을 보면 마지막 2 바이트를 무시하고 그것이 당신을 얻는 곳.

1

파일의 형식이 고정 된 구조입니다. 이 구조를 준수하지 않으면 일부 응용 프로그램에서 파일을 재생하거나 편집 할 수 없습니다.

원래 질문 : 웨이브 파일을 두 그룹으로 나눌 수 있습니다. 첫 번째 그룹은 두 개 이상의 오디오 채널을 가진 파일로 구성되거나 16보다 큰 PCM 비트 심도 또는 두 가지 모두로 구성됩니다. 두 번째 그룹은 두 조건을 모두 충족하지 않는 파일, 즉 최대 16 비트의 1 또는 2 채널로 구성됩니다. 수년 동안 마이크로 소프트는 컴퓨터 오디오 기술의 진보를 수용하기 위해 wav 파일에 포함 된 구조를 kludged했습니다. 특히 그들은 WAVEFORMATEX 구조에 cbSize라는 2 바이트 필드를 추가했습니다. 이것이 16과 18의 subchunk1size 값을 보는 이유입니다. 2 바이트 차이는 cbSize 필드의 유무에 따라 다릅니다. 현재 버전의 WAVEFORMATEX을 사용하여 올바르게 구성된 최신 오디오 파일은 채널 수 또는 비트 심도에 관계없이 subchunk1 크기가 18입니다. Microsoft는 WAVEFORMATEX 구조를 변경하기 전에 생성 된 파일은 내 정책이 여기에 16

의 subchunk1size 있습니다

파일을 읽고, subchunk1size는 16 또는 18이 될 수 있으므로 코드 이에 따라 적응해야한다. 오래된 형식의 오래된 wav 파일이 많이 있거나 cbSize 필드가없는 이전 WAVEFORMATEX 구조로 현대 파일을 잘못 쓸 수 있습니다.

wav 파일을 만들 때 마이크로 소프트가 WAVEFORMATEX 구조를 영구히 변경했기 때문에 항상 채널 수 또는 비트 심도에 관계없이 18이라는 subchunk1 크기를 사용합니다. 그러면 파일이 규격을 준수하게됩니다.

Windows Media Player는 wav 파일을 열고 재생할 수 있도록하는 데 유용합니다.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd390970%28v=vs.85%29.aspx