定期送福利,今天给大家送上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);
}

源码下载:http://pan.baidu.com/s/1kTj05Fp

------------------------------------------------------------
本文转自www.easydarwin.org,更多开源流媒体解决方案,请关注我们的微信:EasyDarwin 

DirectShow音频采集pcm,实时编码AAC,附源码的更多相关文章

  1. Zookeeper+websocket实现对分布式服务器的实时监控(附源码下载)

    ​ 我就是个封面 Zookeeper简介 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统. 简单来说就是一个Zookeeper注册同步中心,内部结构为一个树形目录,每个节点上 ...

  2. Android 音视频深入 一 AudioRecord录音生成pcm转换为wav(附源码下载)

    本篇项目地址,名字是AudioRecord录音(能暂停,将pch转换为wav),求starhttps://github.com/979451341/Audio-and-video-learning-m ...

  3. 13行代码实现:Python实时视频采集(附源码)

    一.前言 本文是<人脸识别完整项目实战>系列博文第3部分:程序设计篇(Python版),第1节<Python实时视频采集程序设计>,本章内容系统介绍:基于Python+open ...

  4. HTML5与CSS3实例教程(第2版) 附源码 中文pdf扫描版

    HTML5和CSS3技术是目前整个网页的基础.<HTML5与CSS3实例教程(第2版)>共分3部分,集中讨论了HTML5和CSS3规范及其技术的使用方法.这一版全面讲解了最新的HTML5和 ...

  5. 日志组件Log2Net的介绍和使用(附源码开源地址)

    Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...

  6. (原创)通用查询实现方案(可用于DDD)[附源码] -- 设计思路

    [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html).   [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...

  7. (原创)通用查询实现方案(可用于DDD)[附源码] -- 简介

    [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3985353.html).   [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...

  8. C#编程总结(七)数据加密——附源码

    C#编程总结(七)数据加密——附源码 概述 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容 ...

  9. 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)

    本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...

随机推荐

  1. 【CF173B】Chamber of Secrets(二分图,最短路)

    题意:给你一个n*m的地图,现在有一束激光从左上角往右边射出,每遇到‘#’,你可以选择光线往四个方向射出,或者什么都不做,问最少需要多少个‘#’往四个方向射出才能使关系在n行往右边射出. 思路:将每一 ...

  2. 【Linux】多进程与多线程之间的区别

    http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?  答案一: 1,进程:子 ...

  3. 【leetcode】Find All Anagrams in a String

    [leetcode]438. Find All Anagrams in a String Given a string s and a non-empty string p, find all the ...

  4. Linux 之 文件内容查看

    文件内容查看 参考教程:[千峰教育] 文件内容查看: cat: 作用:一次性顺序显示文件的所有内容 格式:cat file tac: 作用:一次性倒序显示文件的所有内容 格式:tac file hea ...

  5. Adoquery的 moveby和GotoBookmark,RecNo

    GotoBookmark 是必须存在的记录,再次返回原来那个记录的位置,但是原来的那个记录必须存在,所以不适合[删除订单后回到原来的位置],因为原来的订单已经不存在了,删除了, moveby(),从当 ...

  6. LeetCode OJ--Merge Two Sorted Lists

    http://oj.leetcode.com/problems/merge-two-sorted-lists/ 有序链表的归并排序 #include <iostream> using na ...

  7. (1)JavaScript基础1

    一.javaScript 由三部分组成 1.核心(ECMAScript) 2.文档对象模型(DOM) 3.浏览器对象模型(BOM) 二.在html中使用javascript HTML5模板 <! ...

  8. GitHub 上受欢迎的 Android UI Library 整理(一)

    抽屉菜单 https://github.com/mikepenz/MaterialDrawer ★7337 - 安卓抽屉效果实现方案https://github.com/Yalantis/Side-M ...

  9. [转]IIS7.5优化--提高线程数来适应高并发

    根据压测结果做出的修改历史: 第一步:只针对maxWorkerThreads.maxIoThreads和minWorkerThreads做了修改<processModel autoConfig= ...

  10. Software Engineering | Factory method pattern

    工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象.这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象. 有时,特定类型对象的控制过程比简单地创建一个对象更复杂.在 ...