声卡录制:采集声卡播放的声音,并录制成mp3文件!

声卡录制是一个常见的需求,比如我们在线观看视频或听歌,觉得一段音乐特别好,但是,又没有提供下载,那么,我们就可以使用声卡录制技术,边播放边将其录制下来。

实现声卡录制,涉及到两个基础的技术:声卡捕捉、录制声音成mp3文件。语音视频采集组件MCapture提供了声卡采集的功能,而语音视频录制组件MFile提供了将声音数据录制生成mp3文件的功能。所以,结合MCaptureMFile,将它们组合起来,就可以实现我们想要的软件。

本文实现了一个简单的声卡录制的Demo,Demo运行起来后的截图如下:

停止录制后,将在运行目录下生成一个名为 test.mp3 的文件,然后,我们可以使用各种播放器(如QQ音乐播放器)来播放它。下面,我们来看这个Demo的详细实现。

        private ISoundcardCapturer soundcardCapturer;
        private AudioFileMaker audioFileMaker;
        private volatile bool isRecording = false;
        //开始声卡采集、录制
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //根据声卡采集器 【目前声卡采集仅支持vista以及以上系统】
                this.soundcardCapturer = CapturerFactory.CreateSoundcardCapturer();
                this.soundcardCapturer.AudioCaptured += new ESBasic.CbGeneric<byte[]>(soundcardCapturer_AudioCaptured);
                this.soundcardCapturer.CaptureError += new CbGeneric<Exception>(microphoneCapturer_CaptureError);
                //开始采集声卡
                this.soundcardCapturer.Start();

                this.audioCount = 0;
                this.audioFileMaker = new AudioFileMaker();
                this.audioFileMaker.Initialize("test.mp3",AudioCodecType.MP3, this.soundcardCapturer.SampleRate, this.soundcardCapturer.ChannelCount);
                this.isRecording = true;

                this.button_startRecord.Enabled = false;
                this.button_stopRecord.Enabled = true;
                this.label_recording.Visible = true;
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
            }
        }

        //停止声卡采集、停止录制
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                CbGeneric cb = new CbGeneric(this.StopRecordAsyn);
                cb.BeginInvoke(null, null);
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
            }
        }

        private void StopRecordAsyn()
        {
            this.isRecording = false;
            this.soundcardCapturer.Stop();
            this.soundcardCapturer.Dispose(); //必须要释放声卡采集器!!!!!!!!
            this.audioFileMaker.Close(true);
            this.audioFileMaker.Dispose();
            this.audioFileMaker = null;
            this.AfterStopRecord();
        }

        private void AfterStopRecord()
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new CbGeneric(this.AfterStopRecord));
            }
            else
            {
                this.button_startRecord.Enabled = true;
                this.button_stopRecord.Enabled = false;
                this.label_recording.Visible = false;
                this.Cursor = Cursors.Default;
                MessageBox.Show("录制完成!" + (this.audioCount * 0.05).ToString() + "秒。");
            }
        }

        private int audioCount = 0;
        void soundcardCapturer_AudioCaptured(byte[] audioData) //采集到的语音数据
        {
            if (this.isRecording)
            {
                this.audioFileMaker.AddAudioFrame(audioData);
                ++this.audioCount;
            }
        }

        void microphoneCapturer_CaptureError(Exception obj)
        {

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (this.isRecording)
            {
                MessageBox.Show("正在录制视频,请先停止!");
                e.Cancel = true;
                return;
            }
        }     

对于一般的机器而言,MCapture采集声卡得到的音频数据的基本信息是这样的:

(1)bit位数:16

(2)声道数:2

(3)采样率:48000

(4)MCapture每隔50毫秒触发一次AudioCaptured事件。

要特别注意:在初始化MFile的AudioFileMaker的时候(即调用其Initialize方法),传入的采样率和声道数,必须使用ISoundcardCapturer的SampleRate和ChannelCount属性。

下载声卡录制Demo的源码:RecordSoundCardDemo.rar

时间: 2024-10-06 16:10:41

声卡录制:采集声卡播放的声音,并录制成mp3文件!的相关文章

什么录音软件可以录制电脑内部播放的声音

说起录音,我们应该都不陌生,多多少少都会使用到录音这个功能,不管是商业还是日常的工作学习中,录音已经成为人们生活中不可或缺的一项小功能,可能很多人使用录音这个功能都是通过手机,但是我们都知道手机中想录音只能录制外部声音,而无法录制手机中正在播放的内容,目前手机只支持录制外部声音,但是对于电脑而言就方便多了,那什么录音软件可以录制电脑内部播放的声音呢? 1.由于手机和电脑系统的不同,所以在电脑上录制其系统发出的声音不是难事,但是需要借助第三方录音工具,类似的录音工具还是很多的,小编直接安利如何?

Unity3d:播放物理目录下的MP3文件

u3d里,是支持播放MP3文件的,但要放到资源里,不支持播放物理目录下的MP3文件.由于界面上无需显示,只是当作背景音乐来播放,所以想到调用c#的组件来解决此问题.主要代码都在附件中,根据需要加到自己的u3d程序里即可.贴士:此类问题容易造成局限性,只局限在u3d里面,u3d不支持了就判了死刑,而忘记真正的药是c#,u3d只是汤而已 源码下载 Unity3d:播放物理目录下的MP3文件,布布扣,bubuko.com

iOS中声音采集与播放的实现(使用AudioQueue)

都说iOS最恶心的部分是流媒体,其中恶心的恶心之处更在即时语音. 所以我们先不谈即时语音,研究一下,iOS中声音采集与播放的实现. 要在iOS设备上实现录音和播放功能,苹果提供了简单的做法,那就是利用AVAudioRecorder和AVAudioPlayer.度娘大多数也是如此.但是这种方法有很大的局限性.单说说这种做法:录音,首先得设置录音文件路径,然后录音数据直接写入了文件.播放也是首先给出文件路径,等到音频整个加载完成了,才能开始播放.这相当不灵活. 我的做法是利用音频队列AudioQue

AudioToolbox--利用AudioQueue音频队列,通过缓存对声音进行采集与播放

都说iOS最恶心的部分是流媒体,其中恶心的恶心之处更在即时语音. 所以我们先不谈即时语音,研究一下,iOS中声音采集与播放的实现. 要在iOS设备上实现录音和播放功能,苹果提供了简单的做法,那就是利用AVAudioRecorder和AVAudioPlayer.度娘大多数 也是如此.但是这种方法有很大的局限性.单说说这种做法:录音,首先得设置录音文件路径,然后录音数据直接写入了文件.播放也是首先给出文件路径,等到音 频整个加载完成了,才能开始播放.这相当不灵活. 我的做法是利用音频队列AudioQ

麦克风采集与播放 (源码)

在网络聊天系统中,采集麦克风的声音并将其播放出来,是最基础的模块之一.本文我们就介绍如何快速地实现这个基础模块. 一. 基础知识 有几个与声音采集和播放相关的专业术语必须要先了解一下,否则,后面的介绍将无法展开.语音采集指的是从麦克风采集音频数据,即声音样本转换成数字信号.其涉及到几个重要的参数:采样率.采样位数.声道数. 简单的来说: 采样率:即采样频率,就是在1秒内进行采集动作的次数. 采样位数:又叫采样深度,就是每次采集动作得到的数据长度,即使用多少个bit来记录一个样本. 声道数:一般是

C#实现麦克风采集与播放

在网络聊天系统中,采集麦克风的声音并将其播放出来,是最基础的模块之一.本文我们就介绍如何快速地实现这个基础模块. 一. 基础知识 有几个与声音采集和播放相关的专业术语必须要先了解一下,否则,后面的介绍将无法展开.语音采集指的是从麦克风采集音频数据,即声音样本转换成数字信号.其涉及到几个重要的参数:采样率.采样位数.声道数. 简单的来说: 采样率:即采样频率,就是在1秒内进行采集动作的次数. 采样位数:又叫采样深度,就是每次采集动作得到的数据长度,即使用多少个bit来记录一个样本. 声道数:一般是

音频的采集和播放

音频的采集和播放主要由专门的codec芯片完成,主流的codec芯片厂商有Circus Logic.Wolfson等.采集时codec芯片通过A/D采样把声音的模拟信号转换成数字信号并通过I2S总线送给CPU处理,播放时CPU把处理好的数字信号通过I2S总线送给codec芯片并通过D/A转换为模拟信号播放出来.codec芯片除了A/D, D/A功能外还有其他功能,主要有1)对音频通路进行控制,比如播放音乐打电话等在codec芯片内部的流通线路是不一样的.2)对音频信号做相应的处理,比如音量控制.

OSX/iOS 播放系统声音

系统会自带了些声音,有时候一些操作用必要自己播放一下声音提醒一下,用bash的直接say something就ok了,写代码的时候呢?原来很简单的,一句: [[NSSound soundNamed:@"Hero"] play]; 就ok了其中Hero是文件名,具体都有啥文件名去这里找 /System/Library/Sounds 一般的文件名列表: BassoBlowBottleFrogFunkGlassHeroMorsePingPopPurrSosumiSubmarineTink 哎

iOS调用AudioServicesPlaySystemSound方法播放系统声音

播放系统声音需要导入框架:AudioToolbox.framework 图片看不清请双击查看大图 System Sound ID 介绍如下: AudioServices AudioServices is a group of C functions in AudioToolbox for playing short (≤30 seconds) sounds. Predefined sounds There are some predefined system sounds, for the sy