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

 更新时间:2020年4月25日 17:39  点击:1884

本文实例讲述了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语言程序设计有所帮助。

[!--infotagslink--]

相关文章