C语言使用libZPlay录制声音并写到文件的方法

前端技术 2023/09/05 C++

本文实例讲述了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

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。