wave 파일 mixing 하기. (웨이브 믹싱) | |||
| |||
검증은 좀 덜됐지만, 이런식으로 하면.. 얼마든지 응용이 가능할꺼 같네요. 그럼.. 문제 있으시면 답글 부탁드립니다. // WAVE 파일을 Mixing 한다. - 배경음 + 목소리용 // [in] pFile1 : 목소리 파일 // [in] pFile2 : 배경음 파일(목소리 파일보다 커야한다.) // [in]nPreMargineSec : 몇초 후부터 음성을 합칠것인가. (배경음만 출력되는 초기시간) int WavFileMix(char *pFile1, char *pFile2, char *pFileRes, int nPreMargineSec) { int len1, len2, len; short *in1, *in2; short *out; char pWaveHeader[44]; CFile cf1, cf2, cfRes; if(!cf1.Open(pFile1, CFile::modeRead)) { return -1; } if(!cf2.Open(pFile2, CFile::modeRead)) { return -1; } DWORD dwFileSize1 = cf1.GetLength(); len1 = dwFileSize1 - 44; DWORD dwFileSize2 = cf2.GetLength(); len2 = dwFileSize2 - 44; int nRead2 = cf2.Read(pWaveHeader, 44); // wave 헤더를 읽어온다. if(nRead2 <= 0) return -1; int nSamplesPerSec; memcpy(&nSamplesPerSec, &pWaveHeader[24], 4); // 초당 샘플링을 읽어온다. if(len1 > len2) len = len1; else len = len2; in1 = (short*)malloc(sizeof(short)*len1); in2 = (short*)malloc(sizeof(short)*len2); out = (short*)malloc(sizeof(short)*len); cf1.Read(in1, len1); cf1.Close(); cf2.Read(in2, len2); cf2.Close(); // wave data mix WavMix(in1, in2, out, len1, len2, nPreMargineSec, nSamplesPerSec); //save output file if(!cfRes.Open(pFileRes, CFile::modeCreate | CFile::modeWrite)) { free(in1); free(in2); free(out); return -1; } cfRes.Write(pWaveHeader, 44); // wave 헤더를 먼저 기록. cfRes.Write(out, len); cfRes.Close(); free(in1); free(in2); free(out); return 0; } // Music + Voice 용도로만 사용한다. (목소리 재생시 배경음악은 볼륨을 낮춘다.) // WAVE 데이터를 합성한다. void WavMix(short *in1, short *in2, short *out, int nVoiceSize, int nMusicSize, int nPreMargineSec, int nSamplesPerSec) { int i; float tmp; float nTemp; int nVoiceMute = nSamplesPerSec * nPreMargineSec/*초*/; for(i = 0 ;i < nMusicSize; i++) { if(i < (nVoiceSize/2)+nVoiceMute) { if( i >= nVoiceMute && i < nVoiceMute+20) { // 합쳐지는 부분의 순간 잡음을 없애기 위해. // 추후 Fade Out , Fade In 사용예정 out[i] = 0; } else if(i < nVoiceMute) { // 앞에 x초는 배경음만 out[i] = (short)in2[i]; } else { // 합친다. (합친후 다시 나누기할때의 배율은 입맛에 맞게 조절한다.) nTemp = in1[i-nVoiceMute]; nTemp += (float)(in2[i]*0.7); //tmp = (float)(nTemp / 2.0); tmp = (float)(nTemp / 1.7); out[i] = (short)tmp; } } else { // 배경음 뒷부분은 그대로.. out[i] = (short)in2[i]; } } } Tags: MFC WIN32 wave 윈도우즈 | |||
| |||
| |||
Login for comment |
OTHER POSTS IN THE SAME CATEGORY 투명 윈도우 구현 방법 |