基于DirectShow和libaac采集编码示例
来源:互联网 发布:mac 翻译软件 编辑:程序博客网 时间:2024/06/13 10:45
定期送福利,今天给大家送上Windows中利用DirectShow采集microphone音频,并将采集到的pcm数据,利用FAAC库编码成AAC,进行本地存储或者网络传输。
直接贴代码,解析看注释:
- /*
- 功能描述: 简单实现用DirectShow采集Windows麦克风音频PCM数据
- 经过FAAC编码成AAC存储文件,可根据项目修改成直播,对讲
- 等实时传输类应用。
- From: http://blog.csdn.net/xiejiashu
- Site: http://www.easydarwin.org
- 时间: 2014/07/28
- */
- #include "../DSAudio/General.h"
- #include<iostream>
- #include<cstring>
- #include<windows.h>
- #include<conio.h>
- #include "../DSAudio/dscapture.h"
- #include "DSAudio/FAACEncoder.h"
- unsigned char fBitsPerSample, fNumChannels;
- unsigned fSamplingFrequency;
- unsigned fGranularityInMS;
- DSCapture* ds_capture_;
- FAACEncoder* faac_encoder_;
- unsigned long max_out_bytes;
- unsigned char* outbuf;
- FILE* f_aac_;
- int main()
- {
- fBitsPerSample = 16; //单个采样音频信息位数
- fNumChannels = 2; //通道数
- fSamplingFrequency = 44100;//采样率
- faac_encoder_ = new FAACEncoder(); //新建AAC编码对象
- faac_encoder_->Init(fSamplingFrequency,fNumChannels,fBitsPerSample); //初始化AAC编码器
- ds_capture_ = new DSCapture();
- std::map<CString, CString> a_devices = ds_capture_->DShowGraph()->AudioCapDevices();
- if(a_devices.size() == 0 ) ::exit(0);
- DSAudioFormat audio_fmt;
- audio_fmt.samples_per_sec = fSamplingFrequency;
- audio_fmt.channels = fNumChannels;
- audio_fmt.bits_per_sample = fBitsPerSample;
- // 枚举音频采样设备,选择最后一个
- CString audio_device_id;
- for (std::map<CString, CString>::iterator it = a_devices.begin(); it != a_devices.end(); ++it)
- {
- audio_device_id = it->first;
- }
- ds_capture_->Create(audio_device_id, audio_fmt, NULL);
- // 开始采集音频数据
- ds_capture_->StartAudio();
- ::Sleep(10);
- max_out_bytes = faac_encoder_->MaxOutBytes();
- outbuf = (unsigned char*)malloc(max_out_bytes);
- // 编码后存文件
- f_aac_ = fopen("./audio.aac","wb");
- printf("Recording...");
- while(1)
- {
- int pcmLen = 0;
- // 采集音频pcm数据
- char* pcmBuf = ds_capture_->GetBuffer(pcmLen);
- if(pcmLen > 0)
- {
- unsigned int sample_count = (pcmLen << 3)/fBitsPerSample;
- unsigned int buf_size = 0;
- // 编码AAC
- faac_encoder_->Encode((unsigned char*)pcmBuf, sample_count, (unsigned char*)outbuf, buf_size);
- if(buf_size > 0)
- {
- printf(".");
- // 存文件或者自定义
- fwrite(outbuf,1,buf_size,f_aac_);
- }
- }
- // 释放采集的pcm数据
- ds_capture_->ReleaseBuffer(pcmBuf);
- ::Sleep(1);
- }
- free(outbuf);
- }
0 0
- 基于DirectShow和libaac采集编码示例
- DirectShow视频采集和OpenCV
- DirectShow音频采集pcm,实时编码AAC,附源码
- 7.使用directshow采集视音频并进行H264和ACC实时编码再实时用MP4V2封装成MP4
- directshow和vfw采集并转发视频数据的接口
- 最简单的基于DirectShow的示例:视频播放器
- 最简单的基于DirectShow的示例:获取Filter信息
- 最简单的基于DirectShow的示例:视频播放器
- DirectShow音频采集
- directshow的视频采集
- DirectShow视频采集方案
- directshow 采集视频
- DirectShow 音频采集
- 使用DirectShow采集图像
- directshow 采集视频
- 使用DirectShow采集图像
- 使用DirectShow采集图像
- 使用DirectShow采集图像
- linux的ipc信号量简单实例
- 一些资源
- UISliderControl学习记录
- Android笔记---点击事件的四种写法
- 使用C#+socket实现用移动设备控制的虚拟手柄
- 基于DirectShow和libaac采集编码示例
- PopupWindow的使用以及注意事项
- 题目1534:数组中第K小的数字
- Longest Substring Without Repeating Characters
- centos安装pycrypto
- 学习日志1---运用匈牙利命名法的命名规范,以及注释规范
- 大话设计模式(六 关于Flex的争论)
- Basic Calculator II
- hsacm 字符串训练之AB串