本文实例讲述了C语言使用libZPlay录制声音并写到文件的方法。分享给大家供大家参考。具体实现方法如下:
/** * Record samples from line-in and save to out.mp3 * */ #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <olectl.h> #include <ole2.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <dos.h> #include <conio.h> #include \"../include/libzplay.h\" using namespace libZPlay; ZPlay* player; int nRate = 100; int nPitch = 100; int nTempo = 100; int fCenterCut = 0; int fSideCut = 0; int fMixChannels = 0; int lVolume = 100; int rVolume = 100; int fPause = 0; int fEcho = 0; int fEq = 0; int fReverse = 0; TStreamStatus status; TStreamTime pos; int main(int argc, char **argv) { // clear screen system(\"CLS\"); // create class instance player = CreateZPlay(); // chek if we have class instance if(player == 0) { printf(\"Error: Can\'t create class instance !\\nPress key to exit.\\n\"); getch(); return 0; } // get library version int ver = player->GetVersion(); // check if we have version 2.00 and above if(ver < 200) { printf(\"Error: Need library version 2.00 and above !\\nPress key to exit.\\r\\n\"); getch(); player->Release(); return 0; } // display version info printf(\"libZPlay v.%i.%02i\\r\\n\\r\\n\", ver / 100, ver % 100); printf( \"x: play \\tj: fade out \\ti: side cut \\td: pitch down\\r\\n\" \"c: pause \\tk: fade in \\to: center cut \\tf: pitch up\\r\\n\" \"v: stop \\tl: loop \\tn: volume down\\tg: tempo down\\r\\n\" \"y: rew \\tp: equalizer \\tm: volume up \\th: tempo up\\r\\n\" \"b: fwd \\te: echo \\ta: rate down \\r\\n\" \"r: reverse \\tt: channel mix\\ts: rate up \\tq: quit\\r\\n\\r\\n\"); // open wavein using Line In if(player->OpenFile(\"wavein://src=line;volume=50;\", sfAutodetect) == 0) { printf(\"Error: %s\\nPress key to exit.\\r\\n\", player->GetError()); getch(); player->Release(); return 0; } // set wave output to disk file, mp3 encoding if(player->SetWaveOutFile(\"out.mp3\", sfMp3, 1) == 0) { printf(\"Error: %s\\nPress key to exit.\\r\\n\", player->GetError()); getch(); player->Release(); return 0; } // get stream info TStreamInfo pInfo; player->GetStreamInfo(&pInfo); // display info about stream char *sVbr = \"CBR\"; if(pInfo.VBR) sVbr = \"VBR\"; printf(\"\\r\\n%s %i Hz %s Channel: %u Length: %02i:%02i:%02i:%02i\\r\\n\\r\\n\", pInfo.Description, pInfo.SamplingRate, sVbr, pInfo.ChannelNumber, pInfo.Length.hms.hour, pInfo.Length.hms.minute, pInfo.Length.hms.second, pInfo.Length.hms.millisecond); printf(\"Status| kbps | POS: |Echo|Equ|Cut|Fade|Rev|Rate|Pitch|Tempo|Vol|Loop|Ch mix|\\r\\n\"); // start playing if(player->Play() == 0) { printf(\"Error: %s\\nPress key to exit.\\r\\n\", player->GetError()); player->Release(); // delete ZPlay class return 0; } while(1) { // get current status player->GetStatus(&status); char *st = 0; if(status.fPlay) st = \"Play \"; else if(status.fPause) st = \"Pause\"; else st = \"Stop \"; // get current position player->GetPosition(&pos); printf(\"%s %04i %02i:%02i:%02i %i %i %i %i %i %03i %03i %03i %03i %i %i\\r\", st, player->GetBitrate(0), pos.hms.hour, pos.hms.minute, pos.hms.second, status.fEcho, status.fEqualizer, status.fVocalCut, status.fSlideVolume, status.fReverse, player->GetRate(), player->GetPitch(), player->GetTempo(), lVolume, status.nLoop, fMixChannels ); if(kbhit()) { int a = getch(); switch(a) { case \'i\': // side cut fSideCut = !fSideCut; player->StereoCut(fSideCut, 1, 0); fCenterCut = 0; break; case \'o\': // center fCenterCut = !fCenterCut; player->StereoCut(fCenterCut, 0, 0); fSideCut = 0; break; case \'s\': // higher rate nRate += 5; player->SetRate(nRate); break; case \'a\': // lower rate nRate -= 5; if(nRate < 0) nRate = 0; player->SetRate(nRate); break; case \'d\': // lower pitch nPitch -= 5; if(nPitch < 0) nPitch = 0; player->SetPitch(nPitch); break; case \'f\': // higher pitch nPitch += 5; player->SetPitch(nPitch); break; case \'g\': // lower tempo nTempo -= 5; if(nTempo < 0) nTempo = 0; player->SetTempo(nTempo); break; case \'h\': // higher tempo nTempo += 5; player->SetTempo(nTempo); break; case \'r\': // reverse mode fReverse = !fReverse; if(player->ReverseMode(fReverse) == 0) { printf(\"Error: %s\\n\", player->GetError()); fReverse = 0; } break; case \'p\': // enable or disable equalizer { fEq = !fEq; player->EnableEqualizer(fEq); if(fEq) { player->SetEqualizerPreampGain(-100000); player->SetEqualizerBandGain(0, 104000); player->SetEqualizerBandGain(1, 104000); player->SetEqualizerBandGain(2, 104000); } } break; case \'l\': // play loop { TStreamTime pCurrentTime; player->GetPosition(&pCurrentTime); TStreamTime pEndTime; pEndTime.ms = pCurrentTime.ms + 5000; player->PlayLoop(tfMillisecond, &pCurrentTime, tfMillisecond, &pEndTime ,5, 1); } break; case \'j\': // fade out volume { TStreamTime start; TStreamTime end; player->GetPosition(&start); end.sec = start.sec + 5; player->SlideVolume( tfSecond, &start, 100,100, tfSecond, &end, 0,0); } break; case \'k\': // fade in volume { TStreamTime start; player->GetPosition(&start); TStreamTime end; end.sec = start.sec + 5; player->SlideVolume( tfSecond, &start, 0,0, tfSecond, &end, 100, 100); } break; case \'e\': // enable echo { fEcho = !fEcho; player->EnableEcho(fEcho); } break; case \'x\': // play if(player->Play() == 0) printf(\"Err: %s\\n\", player->GetError()); fPause = 0; break; case \'v\': // stop player->Stop(); fPause = 0; break; case \'c\': // pause if(fPause) { player->Resume(); fPause = 0; } else { player->Pause(); fPause = 1; } break; case \'y\': // jump back 5 seconds { TStreamTime pTime; pTime.sec = 5; player->Seek(tfSecond, &pTime, smFromCurrentBackward); } break; case \'b\': // jump forward 5 seconds { TStreamTime pTime; pTime.sec = 5; player->Seek(tfSecond, &pTime, smFromCurrentForward); } break; case \'t\': { // mix stereo channels to mono fMixChannels = !fMixChannels; player->MixChannels(fMixChannels, 50, 50); } break; case \'n\': // volume down if(lVolume >= 5) lVolume -= 5; if(rVolume >= 5) rVolume -= 5; player->SetMasterVolume(lVolume, rVolume); break; case \'m\': // volume up if(lVolume <= 95) lVolume += 5; if(rVolume <= 95) rVolume += 5; player->SetMasterVolume(lVolume, rVolume); break; case \'q\': case \'Q\': player->Release(); return 0; } } Sleep(50); } }
希望本文所述对大家的C语言程序设计有所帮助。
本文地址:https://www.stayed.cn/item/13418
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我