2013-07-31 5 views
0

WAVE 파일을 데이터 구조로로드 한 다음 원래 파일의 사본으로 디스크에 다시 저장하려고합니다. 로드 및 저장은 정상적으로 작동하지만 복사 된 WAVE 파일은 소리를 재생하지 않습니다 (오류없이 열리지 만). 이것이 엔디안과 관련이 있는지 궁금합니다.WAV 파일로드 및 저장

이것은 WAVE 파일을 저장할 내 데이터 구조입니다 :

struct WaveFile 
{ 
public: 

    static const uint16 NUM_CHARS = 4; 

public: 

    WaveFile() : Data(nullptr) {} 

    ~WaveFile() { delete[] Data; } 

    char ChunkID[NUM_CHARS]; 

    uint32 ChunkSize; 

    char Format[NUM_CHARS]; 

    char SubChunkID[NUM_CHARS]; 

    uint32 SubChunkSize; 

    uint16 AudioFormat; 

    uint16 NumChannels; 

    uint32 SampleRate; 

    uint32 ByteRate; 

    uint16 BlockAlign; 

    uint16 BitsPerSample; 

    char SubChunk2ID[NUM_CHARS]; 

    uint32 SubChunk2Size; 

    byte* Data; 
}; 

이다 나는 그것을로드 방법 :

std::ifstream file(filename, std::ios::binary); 

if (file.good()) 
{ 
    file.read(waveFile.ChunkID, WaveFile::NUM_CHARS); 
    file.read(reinterpret_cast<char*>(&waveFile.ChunkSize), size_ui32); 
    file.read(waveFile.Format, WaveFile::NUM_CHARS); 
    file.read(waveFile.SubChunkID, WaveFile::NUM_CHARS); 
    file.read(reinterpret_cast<char*>(&waveFile.SubChunkSize), size_ui32); 
    file.read(reinterpret_cast<char*>(&waveFile.AudioFormat), size_ui16); 
    file.read(reinterpret_cast<char*>(&waveFile.NumChannels), size_ui16); 
    file.read(reinterpret_cast<char*>(&waveFile.SampleRate), size_ui32); 
    file.read(reinterpret_cast<char*>(&waveFile.ByteRate), size_ui32); 
    file.read(reinterpret_cast<char*>(&waveFile.BlockAlign), size_ui16); 
    file.read(reinterpret_cast<char*>(&waveFile.BitsPerSample), size_ui16); 
    file.read(waveFile.SubChunk2ID, WaveFile::NUM_CHARS); 
    file.read(reinterpret_cast<char*>(&waveFile.SubChunk2Size), size_ui32); 
    waveFile.Data = new byte[waveFile.SubChunk2Size]; 
    file.read(reinterpret_cast<char*>(waveFile.Data), sizeof(waveFile.SubChunk2Size)); 
    file.close(); 
} 

그리고 이것은 내가 파일에서 데이터를 다시 작성하는 방법입니다 :

std::ofstream file(outfile, std::ios::binary); 

if (file.good()) 
{ 
    file.flush(); 
    file.write(waveFile.ChunkID, WaveFile::NUM_CHARS); 
    file.write(reinterpret_cast<const char*>(&waveFile.ChunkSize), size_ui32); 
    file.write(waveFile.Format, WaveFile::NUM_CHARS); 
    file.write(waveFile.SubChunkID, WaveFile::NUM_CHARS); 
    file.write(reinterpret_cast<const char*>(&waveFile.SubChunkSize), size_ui32); 
    file.write(reinterpret_cast<const char*>(&waveFile.AudioFormat), size_ui16); 
    file.write(reinterpret_cast<const char*>(&waveFile.NumChannels), size_ui16); 
    file.write(reinterpret_cast<const char*>(&waveFile.SampleRate), size_ui32); 
    file.write(reinterpret_cast<const char*>(&waveFile.ByteRate), size_ui32); 
    file.write(reinterpret_cast<const char*>(&waveFile.BlockAlign), size_ui16); 
    file.write(reinterpret_cast<const char*>(&waveFile.BitsPerSample), size_ui16); 
    file.write(waveFile.SubChunk2ID, WaveFile::NUM_CHARS); 
    file.write(reinterpret_cast<const char*>(&waveFile.SubChunk2Size), size_ui32); 
    file.write(reinterpret_cast<const char*>(waveFile.Data), waveFile.SubChunk2Size); 
    file.close(); 
} 

사본의 크기는 원본과 동일합니다. 누군가 궁금해하는 경우, uint16, uint32 및 byte는 부호없는 short, unsigned int 및 unsigned char에 대한 typedef입니다. size_ui32 변수는 다음과 같습니다.

static const uint32 size_ui32 = sizeof(uint32); 
static const uint32 size_ui16 = sizeof(uint16); 

나는 잘못 된 부분을 찾을 수없는 것 같습니다.

도움을 청합니다.

답변

1

이 질문을 올린 후 방금 문제를 발견했습니다.

file.read(reinterpret_cast<char*>(waveFile.Data), sizeof(waveFile.SubChunk2Size)); 

해야한다 : 내가이 짓을했는지에

는 데이터를 읽을 때 나는를 sizeof를 제거 할 때

file.read(reinterpret_cast<char*>(waveFile.Data), waveFile.SubChunk2Size); 

일했다(). 바보 나.

0

대부분의 웨이브 파일에서 작동하지만 일부 헤더에는 특정 사용자 데이터가 포함될 수 있습니다. 구조체 WAVEHEADER의 sigle 쓰기를 사용할 수 있습니다.

struct WAVEFILEHEADER 
{ 
    // don't change the order of attributes 
    char m_lpcChunkId[4]; 
    int m_iChunkSize; 
    char m_lpcFormat[4]; 
    char m_lpcSubChunkFmt[4]; 
    int m_iSubChunkFmtSize; 
    short int m_siAudioFormat; 
    short int m_siNumChannels; 

    int m_iSampleRate; 
    int m_iByteRate; 
    short int m_siBlockAlign; 
    short int m_siBitsPerSample; 

    char m_lpcChunkData[4]; 
    int m_iSubChunkDataSize; 
    // unsigned char * m_data; 
}; 

WAVEFILEHEADER whdr; 
FILE* fid = fopen("newaudio.wav","wb"); // important to use binary file 

// some inicialization for whdr - RIFF etc. 
// You can use only 1 write to save whole header: 
fwrite(&whdr, 1, sizeof(WAVEFILEHEADER), fid); 

// or you can read wav header 
fread(&whdr, 1, sizeof(WAVEFILEHEADER), fid); 
// check chunk size, few headers have aditional 2 bytes (by definition user data, but they was always 0x0000)