2014-09-03 3 views
1

먼저, 독점 라이브러리없이이 작업을 수행하려고합니다. 이식성이 뛰어나며 여기에서 일어나는 일에 대해 더 잘 이해하고 있습니다. 나는 필자의 클래스와 라이브러리를 작성하여 반복적 인 기능 (헤더 등의 파싱)을 처리 할 수있다.wav 파일의 프레임과 샘플 얻기

그래서 나는 오디오 파일에 대한 정보를 계산할 수있는 스트림을 통해 WAV/RIFF 파일을 읽을 수 있는지 궁금합니다 (즉, 파일의 오디오 길이, 샘플 수, 프레임 등). 그런 다음 다른 기능을 위해 프레임이나 샘플을 반복합니다.

fstream을 통해 이진 파일로 읽는 것이고 RIFF specs에 지정된대로 헤더를 허용하고 헤더에서 일부 정보를 얻을 수 있지만 바이트를 프레임 또는 샘플로 식별하는 방법과 길이까지?

다른 언어로이 문제를 해결할 수 있지만 C++에서 직접적으로 관련된 내용은 없습니다.

답변

0

WAV/RIFF 헤더는 샘플링 크기 (8 비트, 16 비트 등)를 알려줍니다. 또한 endian-ness와 각 샘플을 부호가 있거나 부호없는 숫자 (16 비트 +의 경우)로 해석해야하는지 여부를 알려줍니다. 채널 수를 표시합니다.

기타 필요한 항목이 확실하지 않습니다. 그것은 파일을 씹는 데 필요한 모든 것입니다. 인용 된 링크를 읽으면 모든 질문에 거의 답할 것 같습니다.

내 라디오에 첨부 된 사운드 카드에서 오디오를 잡아 내기 위해 간단한 해킹을 함께 할 때 참고로 사용했던 것과 같은 링크입니다. 앞서 말한 해킹은 오디오를 즉각적으로 분석하여 침묵하는 곳을 찾은 다음 오디오 스트림을 묵음 부분에서 개별 파일로 분리합니다. 결과 데이터는 .wav 파일이 내 .mp3 인코더에서 받아 들일 수있을 정도로 충분히 전달되어 나중에 mp3 플레이어에 덤프 할 수있는 .mp3 파일을 생성하므로 나중에 내가 좋아하는 라디오 쇼를들을 수 있습니다.

2

비트 맵과 같은 이진 파일을 읽을 때 WAV 파일을 읽는 것이 동일하다고 생각합니다. 기본 개념은 파일 헤더를 먼저 읽은 다음 헤더에 표시된 정보에 따라 데이터를 읽는 것입니다. 헤더는 일반적으로 C 데이터 구조로 채울 수 있으며 직접 정보를 사용할 수 있습니다.

struct wavfile 
{ 
    char id[4];   // should always contain "RIFF" 
    int totallength;  // total file length minus 8 
    char wavefmt[8];  // should be "WAVEfmt " 
    int format;   // 16 for PCM format 
    short pcm;    // 1 for PCM format 
    short channels;   // channels 
    int frequency;  // sampling frequency 
    int bytes_per_second; 
    short bytes_by_capture; 
    short bits_per_sample; 
    char data[4];   // should always contain "data" 
    int bytes_in_data; 
}; 

FILE * fp = fopen("file.wav", "rb"); 
wavfile info; 
if (fp) { 
    fread(&info, 1, sizeof(wavfile), fp); 
    // try to read data here 
} 

난 그냥 wavinfo.bits_per_sample/8 각 샘플 포인트의 길이 확인, WAV 파일에 프레임이 생각하지 않습니다. 값이 2이면 short을 샘플로 읽을 수 있습니다.

Here 블로그는 몇 가지 더 많은 샘플 코드가 있지만 여전히 디버그가 필요합니다.

+0

이 방법이 유효하지만 32 비트 또는 64 비트 컴퓨터에서 작업하는 경우 고려해야합니다. 'int'와'short'의 실제 길이는 기계 아키텍처에 달려 있지만, wav 헤더 부분의 길이는 다릅니다. 따라서이 코드는 32 비트 아키텍처에서는 작동하지만 64에서는 작동하지 않을 수 있습니다. – lCapp