|
일일 결과물 | |||
이 름 |
유 진명 |
일 시 |
2010-10-25 |
계획시간 |
3 시간 |
소요시간 |
2 시간 |
주 제 명 |
음성 구간별 비교하여 변화구간 찾기 |
원본데이터에서 변환된 신호 그래프를 새로운 wav 파일로 저장하기 위해 파일 명을 지정하고 저장하는 기능을 추가 하였다.
변환 데이터 저장 그룹박스 안에 TextBox에 파일 명을 입력하고 저장 버튼을 눌렀을 때 동작하는 코드이다.
private void b_save_Click(object sender, EventArgs e) { string fname = string.Format(textBox1.Text + ".wav"); Record sr = new Record(fname, size, tdatas); } |
위의 코드는 텍스트 박스에입력된 파일이름에 .wav 확장자를 추가하여 Record 클래스로 파일 명과, 데이터의 크기, 그리고 수정된 데이터를 전달하여 Record 개체를 생성한다.
이 Record 클래스를 생성하는 동시에 파일명을 셋팅하고 WaveFormat를 지정하며 SoundFile을 생성한다. 그리고 실제 데이터를 SoundFile 스트림에 추가하면서 wav 파일을 만들게 된다.
public Record(string _fname, int _size, short[] _datas) { SetFileName(_fname); mWavFormat = CreateWaveFormat(); CreateSoundFile(); AddSoundData(_size, _datas); } |
SetFileName 함수는 다음과 같은 동작을 한다.
public void SetFileName(string filename) { mFileName = filename; } |
이 함수는 별다른 일을 하지 않고 전역으로 선언된 파일 명에 클래스 생성시에 전달된 파일명을 대입해 주는 역할을 한다.
CreateWaveFormat 함수는 wave 파일의 포멧 형식을 지정한다.
private WaveFormat CreateWaveFormat() { WaveFormat wf = new WaveFormat(); wf.BitsPerSample = 16; wf.SamplesPerSecond = 44100; wf.Channels = 1; wf.BlockAlign = (short)(wf.Channels * wf.BitsPerSample / 8); wf.AverageBytesPerSecond = wf.BlockAlign * wf.SamplesPerSecond; wf.FormatTag = WaveFormatTag.Pcm; return wf; } |
여기서는 고정적으로 설정하였는데 필요하면 설정 값을 변경하여 wav 파일을 제작 할 수 있다.
CreateSoundFile 함수는 FileStream에 기초 데이터와 포멧을 기록하는 역할을 한다.
private void CreateSoundFile() { mWaveFile = new FileStream(mFileName, FileMode.Create); mWriter = new BinaryWriter(mWaveFile); char[] ChunkRiff = { 'R', 'I', 'F', 'F' }; char[] ChunkType = { 'W', 'A', 'V', 'E' }; char[] ChunkFmt = { 'f', 'm', 't', ' ' }; char[] ChunkData = { 'd', 'a', 't', 'a' }; short shPad = 1; int nFormatChunkLength = 0x10; int nLength = 0; short shBytesPerSample = 0;
if (8 == mWavFormat.BitsPerSample && 1 == mWavFormat.Channels) shBytesPerSample = 1;
else if ((8 == mWavFormat.BitsPerSample && 2 == mWavFormat.Channels) || (16 == mWavFormat.BitsPerSample && 1 == mWavFormat.Channels)) shBytesPerSample = 2;
else if (16 == mWavFormat.BitsPerSample && 2 == mWavFormat.Channels) shBytesPerSample = 4;
// RIFF mWriter.Write(ChunkRiff); mWriter.Write(nLength); mWriter.Write(ChunkType); // WAVE mWriter.Write(ChunkFmt); mWriter.Write(nFormatChunkLength); mWriter.Write(shPad); mWriter.Write(mWavFormat.Channels); mWriter.Write(mWavFormat.SamplesPerSecond); mWriter.Write(mWavFormat.AverageBytesPerSecond); mWriter.Write(shBytesPerSample); mWriter.Write(mWavFormat.BitsPerSample); // mWriter.Write(ChunkData); mWriter.Write((int)0); } |
마지막으로 AddSoundData 함수는 데이터크기와 데이터를 파일스트림에 추가하는 역할을 한다.
private void AddSoundData(int _size, short[] _datas) { mWriter.Seek(4, SeekOrigin.Begin); mWriter.Write((int)(_size + 36)); mWriter.Seek(40, SeekOrigin.Begin); mWriter.Write(_size);
for (int i = 0; i < _size; i++) { mWriter.Write(_datas[i]); } mWriter.Close(); mWaveFile.Close(); mWriter = null; mWaveFile = null; } |
BinaryWriter의 Seek 함수는 데이터를 기록할 부분을 찾아 그곳에 데이터를 쓸수 있도록 해준다. 그래서 RIFF 헤더를 제외한 나머지 크기를 기록하고, 기록된 마지막 부분을 찾아서 실제 음성 데이터의 크기를 기록한다음에 반복문을 통해 데이터를 기록 하게 된다.
[일일결과물]데이터를 wav 파일로 저장 및 재.doc
|