栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

本文实例讲述了C语言使用libZPlay录制声音并写到文件的方法。分享给大家供大家参考。具体实现方法如下:


#define WIN32_LEAN_AND_MEAN
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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.rn");
    getch();
    player->Release();
    return 0;
  }
  // display version info
  printf("libZPlay v.%i.%02irnrn", ver / 100, ver % 100);
  printf( "x: play  tj: fade out  ti: side cut  td: pitch downrn"
 "c: pause  tk: fade in  to: center cut tf: pitch uprn"
 "v: stop  tl: loop    tn: volume downtg: tempo downrn"
 "y: rew   tp: equalizer tm: volume up th: tempo uprn"
 "b: fwd   te: echo    ta: rate down rn"
 "r: reverse tt: channel mixts: rate up  tq: quitrnrn");
    // open wavein using Line In
    if(player->OpenFile("wavein://src=line;volume=50;", sfAutodetect) == 0)
    {
      printf("Error: %snPress key to exit.rn", 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: %snPress key to exit.rn", 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("rn%s %i Hz %s Channel: %u Length: %02i:%02i:%02i:%02irnrn",
      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|rn");
  // start playing
  if(player->Play() == 0)
  {
    printf("Error: %snPress key to exit.rn", 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  %ir", 
 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: %sn", 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: %sn", 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语言程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/65114.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号