随笔分类 -  VC++

MFC
摘要:PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志。Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV格式的文件。脉冲编码调制PCM文件格式简介将音频数字化,其实就是将声音数字化。最常见的方式是透过脉冲编码调制PCM(Pulse Code Modulation) 。运作原理如下。首先我们考虑声音经过麦克风,转换成一连串电压变化的信号,如图一所示。这张图的横座标为秒,纵座标为电压大小。要将这样的信号转为 PCM 格式的方法,是使用三个参数来表示声音,它们是:声道数、采样位数和采样频率。采样频率即取样 阅读全文
posted @ 2011-07-25 20:19 心随灵动 阅读(1044) 评论(0) 推荐(1)
摘要:在VOIP的音频算法中,回音处理已经成为一个关系通话质量的主要问题。回声的产生在IP网络主要有两种:1.声学回声2.电路回声声学回声主要又分成以下几种:a ) 直接回声:由扬声器产生的声音未经任何反射直接进入麦克风b ) 间接回声: 由扬声器发出的声音经过多次反射后,再进入Mic对于第二种回声,拥有多路径,时变性的特点.是比较难处理的.由于IP网络下的传输的延迟较大,而一般情况下,对于人耳,如果声音延迟达到了10ms以上的话,那么回声就会越来越明显.一般来讲,VOIP中的声音延迟主要来自于几个方面:1. 编码延迟: 一般情况下编码算法在声音压缩时都会产生延迟,就我们采用的Speex来讲,延迟大 阅读全文
posted @ 2011-07-21 22:08 心随灵动 阅读(1732) 评论(0) 推荐(1)
摘要:view plaincopy to clipboardprint?// demo.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <speex/speex.h>#include <stdio.h>#include <ostream>#include <speex/speex_preprocess.h>#include <speex/speex_echo.h>#pragma comment( 阅读全文
posted @ 2011-07-21 22:07 心随灵动 阅读(4032) 评论(1) 推荐(0)
摘要:在Speex(www.speex.org)的最新版本中,开始集成了回音消除的模块,而回音消除一直是Voip之中亟待解决的主要问题。很多朋友和我说speex的aec模块的效能并不好,我们先来看一下speex的aec的api调用方式。/**创建AEC对象*/SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length);frame_size 的取值最好是一个编码的frame大小, 在低带宽条件下,一般延迟20ms,而大小为160filter_length,最好是房间内反射时间的1/3如: 一个房间的反射时延 阅读全文
posted @ 2011-07-21 17:20 心随灵动 阅读(3430) 评论(0) 推荐(0)
摘要:看到网上很多希望使用speex aec的, 似乎找不到win32下的例子, 我这里尝试做了一个, 效果还行, 使用上面是三路实时音频录下后, 在audacity中显示, 第一路为本地mic采集, 第二路为本地回放, 第三路为经过speex_echo_cancellation() 处理后的, 这个测试中, 为间断的读"1, 2, 3...", 图中选中的是 "2". capture到playback之间,大约差了1百多毫秒.下面开始叙述实现过程, 并附上源码.其实aec中最困难的问题是如何同步capture和playback, 一开始我也尝试用 speex 阅读全文
posted @ 2011-07-21 15:07 心随灵动 阅读(2177) 评论(0) 推荐(0)
摘要:Speex是近年来开发出的一套功能强大的语音引擎,能够实现高质量和低比特率的编码。它不仅提供了基于码激励线性预测(CELP)算法的编/解码模块,而且在其最新发布的版本中还提供了声音预处理和声学回声消除模块,为保障IP网络中的语音通信质量提供了技术手段。此外,Speex还具有压缩后的比特率低(2~44 kbps)的特点,并支持多种比特率。这些特点使得Speex特别适合VoIP的系统。虽然是开源的,但是使用的人还不是很多,网上的资料也很少,下面简单给大家介绍一下如何使用speex的API。一:编码流程使用Speex的API函数对音频数据进行压缩编码要经过如下步骤:1、定义一个SpeexBits类型 阅读全文
posted @ 2011-07-21 10:29 心随灵动 阅读(6364) 评论(1) 推荐(0)
摘要:一、波形声音 波形声音就是通过计算机的声音采集设备将现实世界当中的声波通过模数转化之后用数字的方式表示声音波形的一种声音储存方案。在播放声音的时候声卡将以数字储存的声音波形信号转换为一系列的电流信号。 声音的采集过程当中涉及到两个术语:采样率表示声音采集设备每秒钟采集声音信号的次数,一般有44.1KHZ、22.05KHZ等等;样化位数表示每次采样得到的声音信号用多少位来表示。在声音的采样当中采样率和样化位数越高声音的质量就越高。在windows程序设计当中,波形声音的采集和回放有两种方式来实现:一种是使用一系列底层的函数调用来实现;另一种是使用MCI接口来实现。我们首先介绍底层函数的使用。1. 阅读全文
posted @ 2011-07-20 10:49 心随灵动 阅读(1156) 评论(0) 推荐(0)
摘要:随着计算机网络的日益普及,人们通过网络进行交流显得越来越重要,于是出现了一系列语音通信的软件,比如NetMeeting、IPPhone、MediaRing以及VoxPhone等等,但这些软件都功能完善、相对独立,不利于集成到自己开发的软件中,有时我们也希望将这种语音通信功能集成到自己的软件中,尤其当一个单位的局域网用户分散在不同的房间时。本文给出一种灵活、简单的实现方法,采用基于对话框的方式编程,硬件上只需要一块双DMA通道的声卡(目前的声卡大多支持双DMA通道)和一支耳麦,其余全部由软件编程实现。程序在 Windows98/2000、Visual C++6.0 下编译通过,在Windows 阅读全文
posted @ 2011-07-20 08:59 心随灵动 阅读(1142) 评论(2) 推荐(0)
摘要:基于API的录音机程序作者/栾义明一、数字音频基础知识Fourier级数:任何周期的波形可以分解成多个正弦波,这些正弦波的频率都是整数倍。级数中其他正线波的频率是基础频率的整数倍。基础频率称为一级谐波。PCM:pulse code modulation,脉冲编码调制,即对波形按照固定周期频率采样。为了保证采样后数据质量,采样频率必须是样本声音最高频率的两倍,这就是Nyquist频率。样本大小:采样后用于存储振幅级的位数,实际就是脉冲编码的阶梯数,位数越大表明精度越高,这一点学过数字逻辑电路的应该清楚。声音强度:波形振幅的平方。两个声音强度上的差常以分贝(db)为单位来度量,计算公式如下:20* 阅读全文
posted @ 2011-07-19 09:03 心随灵动 阅读(554) 评论(0) 推荐(0)
摘要:wstring MultCHarToWideChar(string str){//获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的int len=MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),NULL,0);TCHAR *buffer=new TCHAR[len+1];//多字节编码转换成宽字节编码MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),buffer,len);buffer[len]='/0';//添加字符串结尾//删除缓冲区并返回值wstring r 阅读全文
posted @ 2011-07-18 17:18 心随灵动 阅读(2298) 评论(0) 推荐(0)
摘要:char :单字节变量类型,最多表示256个字符,wchar_t :宽字节变量类型,用于表示Unicode字符,它实际定义在<string.h>里:typedef unsigned short wchar_t。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,定义宽字节类型方法如下: wchar_t c = `A' ;wchar_t * p = L"Hello!" ;wchar_t a[] = L"Hello!" ;其中,宽字节类型每个变量占用2个字节,故上述数组a的sizeof(a) = 14TCHAR / _T( ) 阅读全文
posted @ 2011-07-14 14:51 心随灵动 阅读(405) 评论(0) 推荐(0)
摘要:#ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned char TCHAR; #endif typedef unsigned char CHAR; typedef unsigned wchar_t WCHAR; 由此可以看出,CHAR实施上就是unsigned char,WCHAR为宽字符,而TCHAR根据是否支持unicode而不同。在程序使用sizeof(TCAHR),当默认设置时,这个值是1;当定义UNICODE宏时,这个值是2。 阅读全文
posted @ 2011-07-14 14:48 心随灵动 阅读(377) 评论(0) 推荐(0)
摘要:.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件。如果要完成源代码的编译和链接,有头文件和lib就够了。如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。.h .lib .dll三者的关系是:H文件作用是:声明函数接口DLL文件作用是: 函数可执行代码当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用: 告诉链接器 调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项 .LIB 阅读全文
posted @ 2011-07-14 14:30 心随灵动 阅读(2101) 评论(0) 推荐(1)
摘要:并行接口,简称并口。并口采用的是25针D形接头。所谓“并行”,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错,目前,并行接口主要作为打印机端口等。 并口的工作模式: 1:SPP(Standard Parallel Port)称为标准并口,它是最早出现的并口工作模式,几乎所有使用并口的外设都支持该模式。 2:EPP(Enhanced Parallel Port)称为增强型高速并口,它是在SPP 的基础上发展起来的新型工作模式,也是现在应用最多的并口工作模式,目前市面上的大多数打印机、扫描仪都支持EPP 模式 阅读全文
posted @ 2011-07-14 14:28 心随灵动 阅读(2683) 评论(0) 推荐(0)
摘要:你用的如果VC是5.0,5.0要从光盘上拷几个dll如果是6.0,也许要设置一下。在"工作区"相应的对话宽点右键,属性中有"语言"项,选择"Chinese(P.R.C)"就可以了。更改字体,首先改变你的static控件的ID,然后GetDlgItem(IDC_YOURSTATIC)->SetFont(&font);不支持汉字,可能是没有拷贝appwzchs.dll[附:控件字体颜色修改相关]很多人定义了基于MFC的程序项目,当设计界面使用控件时,却不知道如何对各控件进行字体与颜色的设计;其实这些修改是需要动手添加代码的, 阅读全文
posted @ 2011-07-13 16:28 心随灵动 阅读(7290) 评论(0) 推荐(0)
摘要:是因为vs 2005之后项目使用的是unicode字符集,在“项目-属性”中将"unicode字符集"换成"多字节字符集"就行了,也可以将文本内容放在_T()里面,不变字符集。使用unicode的话MessageBox会被替换成MessageBoxW 否则是MessageBoxA多字节字符 英文1个字节,中文2个字节unicode 英文2字节 中文2字节.unicode下数据类型转换:CString转intCString b="123";int i;i=_ttoi(b);//在使用多字符集下 _atoi(array to intege 阅读全文
posted @ 2011-07-13 14:50 心随灵动 阅读(1460) 评论(0) 推荐(0)
摘要:GDB概述GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。4、动态的改变你程序的执行环境。从上面看来,GDB和一般的调试工具没有 阅读全文
posted @ 2011-07-10 12:07 心随灵动 阅读(453) 评论(0) 推荐(0)
摘要:上网看着文章教程的时候意外得到了这份VC++6.0的快捷键清单,觉得挺有用的,写下来备忘:F1 显示帮助,如果光标停在代码的某个字符上,显示MSDN中相应的帮助内容F2 书签功能: Ctrl+F2 --在某行设置一个书签(再按一次次是取消)F2 --跳到下一个书签位置Shift+F2 --跳到上一个书签位置Ctrl+Shift+F2 --删除所有书签F3 查找: Ctrl+F3 --在文件中查找,如果当前光标在一个字符串上,那么自动查找此字符串.相似的有Ctrl+FF3 --查找文件中下一个串Shift+F3 --查找文件中上一个串F4(不是流行花园那个) 如果是编译后或者Find in Fi 阅读全文
posted @ 2011-07-07 09:33 心随灵动 阅读(813) 评论(0) 推荐(0)
摘要:在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并提供一个服务器客户端具体的实例。希望对您有所帮助一、原理部分 (个人觉得这篇写的可以,所以转与此,原文地址:http://dev.yesky.com/78/2683078.shtml) 在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一 直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务 阅读全文
posted @ 2011-07-06 10:23 心随灵动 阅读(301) 评论(0) 推荐(0)
摘要:如果树形控件含有TVS_EDITLABELS样式,用户就可以直接编辑这个控件的项标签。用户可以通过点击项标签开始进行编辑,而程序通过使用EditLabel()成员函数开始进行编辑。当开始编辑、取消或完成时,树形控件就会发送一个通知消息。当编辑完成时,你需要响应更新项标签。当标签编辑开始时,树形控件会发送一个TVN_BEGINLABELEDIT通知消息。通过处理这个消息,你可以允许一些标签可编辑并防止其他标签可编辑。允许编辑返回0,阻止编辑返回非0。当标签编辑被取消或完成时,树形控件会发送一个TVN_ENDLABELEDIT通知消息。lParam参数是一个指向NMTVDISPINFO结构的地址。 阅读全文
posted @ 2011-07-01 18:00 心随灵动 阅读(1072) 评论(0) 推荐(0)