基于DirectShow和libaac采集编码示例

来源:互联网 发布:mac 翻译软件 编辑:程序博客网 时间:2024/06/13 10:45

定期送福利,今天给大家送上Windows中利用DirectShow采集microphone音频,并将采集到的pcm数据,利用FAAC库编码成AAC,进行本地存储或者网络传输。


直接贴代码,解析看注释:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /* 
  2.     功能描述:   简单实现用DirectShow采集Windows麦克风音频PCM数据 
  3.                 经过FAAC编码成AAC存储文件,可根据项目修改成直播,对讲 
  4.                 等实时传输类应用。 
  5.                  
  6.     From:       http://blog.csdn.net/xiejiashu 
  7.     Site:       http://www.easydarwin.org 
  8.     时间:     2014/07/28 
  9. */  
  10. #include "../DSAudio/General.h"  
  11. #include<iostream>  
  12. #include<cstring>  
  13. #include<windows.h>  
  14. #include<conio.h>  
  15. #include "../DSAudio/dscapture.h"  
  16. #include "DSAudio/FAACEncoder.h"  
  17.   
  18. unsigned char fBitsPerSample, fNumChannels;  
  19. unsigned fSamplingFrequency;  
  20. unsigned fGranularityInMS;  
  21.   
  22. DSCapture* ds_capture_;  
  23. FAACEncoder* faac_encoder_;  
  24.   
  25. unsigned long max_out_bytes;  
  26. unsigned char* outbuf;  
  27.   
  28. FILE* f_aac_;  
  29.   
  30. int main()  
  31. {  
  32.   
  33.     fBitsPerSample = 16; //单个采样音频信息位数  
  34.     fNumChannels = 2; //通道数  
  35.     fSamplingFrequency = 44100;//采样率  
  36.   
  37.     faac_encoder_ = new FAACEncoder(); //新建AAC编码对象  
  38.   
  39.     faac_encoder_->Init(fSamplingFrequency,fNumChannels,fBitsPerSample); //初始化AAC编码器  
  40.   
  41.     ds_capture_ = new DSCapture();  
  42.     std::map<CString, CString> a_devices = ds_capture_->DShowGraph()->AudioCapDevices();  
  43.   
  44.     if(a_devices.size() == 0 ) ::exit(0);  
  45.   
  46.     DSAudioFormat audio_fmt;  
  47.     audio_fmt.samples_per_sec = fSamplingFrequency;  
  48.     audio_fmt.channels = fNumChannels;  
  49.     audio_fmt.bits_per_sample = fBitsPerSample;  
  50.   
  51.     // 枚举音频采样设备,选择最后一个  
  52.     CString audio_device_id;  
  53.     for (std::map<CString, CString>::iterator it = a_devices.begin(); it != a_devices.end(); ++it)  
  54.     {  
  55.         audio_device_id = it->first;  
  56.     }  
  57.   
  58.     ds_capture_->Create(audio_device_id, audio_fmt, NULL);  
  59.      
  60.     // 开始采集音频数据  
  61.     ds_capture_->StartAudio();  
  62.   
  63.     ::Sleep(10);  
  64.   
  65.     max_out_bytes = faac_encoder_->MaxOutBytes();  
  66.     outbuf = (unsigned char*)malloc(max_out_bytes);  
  67.   
  68.     // 编码后存文件  
  69.     f_aac_ = fopen("./audio.aac","wb");  
  70.     printf("Recording...");  
  71.     while(1)  
  72.     {  
  73.         int pcmLen = 0;  
  74.         // 采集音频pcm数据  
  75.         char* pcmBuf = ds_capture_->GetBuffer(pcmLen);  
  76.         if(pcmLen > 0)  
  77.         {  
  78.             unsigned int sample_count = (pcmLen << 3)/fBitsPerSample;  
  79.             unsigned int buf_size = 0;  
  80.             // 编码AAC  
  81.             faac_encoder_->Encode((unsigned char*)pcmBuf, sample_count, (unsigned char*)outbuf, buf_size);     
  82.             if(buf_size > 0)  
  83.             {  
  84.                 printf(".");  
  85.                 // 存文件或者自定义  
  86.                 fwrite(outbuf,1,buf_size,f_aac_);  
  87.             }             
  88.         }  
  89.         // 释放采集的pcm数据  
  90.         ds_capture_->ReleaseBuffer(pcmBuf);    
  91.         ::Sleep(1);  
  92.     }  
  93.   
  94.     free(outbuf);  
  95. }  
0 0
原创粉丝点击