13音视频捕捉

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

音视频捕获本章目标音频捕获、播放API介绍利用vfw实现视频捕获波形声音格式(2-1)wave声音格式由结构体WAVEFORMATEX表示,typedefstruct{WORDwFormatTag;WORDnChannels;DWORDnSamplesPerSec;DWORDnAvgBytesPerSec;WORDnBlockAlign;WORDwBitsPerSample;WORDcbSize;}WAVEFORMATEX;波形声音格式(2-2)wFormatTag:编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等nChannels:声道数,单声道为1,双声道为2nSamplesPerSec:采样频率nAvgBytesPerSec:每秒的数据量nBlockAlign:块对齐wBitsPerSample:WAVE文件的采样大小cbSize:设置声音格式示例(2-1)voidSetAudioFormat(unsigned_uChannel,unsigned_uSampleRate,unsigned_uBitsPer){//通道只有1与2通道Assert(_uChannel==1||_uChannel==2);//数据位只有8或16位Assert(_uBitsPer==8||_uBitsPer==16);WAVEFORMATEX*m_pWaveFormat=NULL;if(m_pWaveFormat!=NULL)free(m_pWaveFormat);m_iSize=sizeof(WAVEFORMATEX);m_pWaveFormat=(WAVEFORMATEX*)malloc(m_iSize);Assert(m_pWaveFormat!=NULL);设置声音格式示例(2-2)//设置声卡格式m_pWaveFormat-wFormatTag=WAVE_FORMAT_PCM;m_pWaveFormat-nChannels=_uChannel;m_pWaveFormat-wBitsPerSample=_uBitsPer;m_pWaveFormat-nSamplesPerSec=_uSampleRate;m_pWaveFormat-nBlockAlign=(WORD)(_uChannel*_uBitsPer/8);m_pWaveFormat-nAvgBytesPerSec=m_pWaveFormat-nSamplesPerSec*m_pWaveFormat-nBlockAlign;m_pWaveFormat-cbSize=0;}WAVEHDR结构(2-1)通过定义WAVEHDR机构体来指定波形声音缓冲区所的头结构typedefstruct{LPSTRlpData;DWORDdwBufferLength;DWORDdwBytesRecorded;DWORD_PTRdwUser;DWORDdwFlags;DWORDdwLoops;structwavehdr_tag*lpNext;DWORD_PTRreserved;}WAVEHDR;WAVEHDR结构(2-2)•lpData:指向存放音频数据的缓冲区•dwBufferLength:存放音频数据缓冲区的长度•dwBytesRecorded:音频数据对应录音数据时,存放录音数据的长度•dwUser:用户定义数据•dwFlags:音频缓冲区的标志•dwLoops:只在播放缓存区中使用该标志,每次播放的数量•wavehdr_tag:保留字段设置WAVEHDR示例classCWaveBuffer{private:WAVEHDRm_header;char*m_pData;}voidCWaveBuffer::m_vPrepareCommon(int_iCount){memset(&m_header,0,sizeof(m_header));m_header.lpData=(char*)m_pData;m_header.dwBufferLength=_iCount;m_header.dwUser=(DWORD)this;}录音和回放对于录音和挥放,windows提供了一组wave***的API函数利用wave***API进行录音和回放的流程是不一样的,对于录音来说,比较复杂,需要使用步骤比较多,对于回放来说,则相对比较简单声音回放流程1.打开回放设备-waveOutOpen2.准备wave数据头-waveOutPrepareHeader3.写wave数据-waveOutWrite4.停止放音-waveOutReset5.关闭回放设备-waveOutClose打开回放设备打开给定的音频播放设备•phwo:句柄,用来存放打开后的播放设备对应的句柄,其他相关的API函数要操作该设备,都是通过此句柄•uDeviceID:设备序列id•pwfx:指向WAVEFORMATEX的音频数据格式•dwcallback:可以指向一个回调函数,一个事件内核对象,窗口句柄或一个专门用来处理消息的线程idMMRESULTwaveOutOpen(LPHWAVEOUTphwo,UINT_PTRuDeviceID,LPWAVEFORMATEXpwfx,DWORD_PTRdwCallback,DWORD_PTRdwCallbackInstance,DWORDfdwOpen);waveOutOpen示例boolCSoundChannel::m_bOpenDevice(unsigned_uID){WAVEFORMATEX*waveFormat=(WAVEFORMATEX*)m_sfAudioFormat;DWORDdwErr=MMSYSERR_BADDEVICEID;//打开播放设备dwErr=waveOutOpen(&m_hWaveOut,_uID,waveFormat,(DWORD)m_hEventDone,NULL,CALLBACK_EVENT);if(dwErr!=MMSYSERR_NOERROR)returnfalse;returntrue;}准备wave数据头hwo:指向声音播放设备的句柄pwh:设置好相关数据的wave数据头cbwh:WAVEHDR的大小MMRESULTwaveOutPrepareHeader(HWAVEOUThwo,LPWAVEHDRpwh,UINTcbwh);写wave数据到设备中将要播放的音频数据块写入指定播放设备中hwo:指向声音播放设备的句柄pwh:设置好相关数据的wave数据头cbwh:WAVEHDR的大小MMRESULTwaveOutWrite(HWAVEOUThwo,LPWAVEHDRpwh,UINTcbwh);停止回放声音通过waveOutWrite函数停止播放声音,并将播放设备缓冲区中的音频数据清空,播放标志设为已播放hwo:指向声音播放设备的句柄调用成功,返回MMSYSERR_NOERRORMMRESULTwaveOutReset(HWAVEOUThwo);关闭播放声音设备waveOutClose()关闭指定的声音播放设备hwo:指向声音播放设备的句柄调用成功,返回MMSYSERR_NOERRORMMRESULTwaveOutClose(HWAVEOUThwo);声音录制流程1.打开录音设备--waveInOpen()2.准备wave数据头—waveInPrepareHeader()3.准备数据块--waveInAddBuffer()4.开始录音—waveInStart()5.停止录音—waveInReset()6.关闭录音设备—waveInClose()打开录音设备(2-1)通过waveInOpen函数来打开一个指定的录音设备,调用成功返回MMSYSERR_NOERRORMMRESULTwaveInOpen(LPHWAVEINphwi,UINT_PTRuDeviceID,LPWAVEFORMATEXpwfx,DWORD_PTRdwCallback,DWORD_PTRdwCallbackInstance,DWORDfdwOpen);打开录音设备(2-2)•phwi:句柄,用来存放打开后的录音设备对应的句柄,其他相关的API函数要操作该设备,都是通过此句柄•uDeviceID:设备序列id•pwfx:指向WAVEFORMATEX的音频数据格式•dwcallback:可以指向一个回调函数,一个事件内核对象,窗口句柄或一个专门用来处理消息的线程id准备数据块将一组数据存入播放缓冲区中,当播放缓冲区满时,应用程序会被通知到hwi:指向声音录制设备的句柄pwh:设置好相关数据的wave数据头cbwh:WAVEHDR的大小MMRESULTwaveInAddBuffer(HWAVEINhwi,LPWAVEHDRpwh,UINTcbwh);开始录音hwi:指向声音录制设备的句柄调用该函数开始从录音设备中获取声音数据MMRESULTwaveInStart(HWAVEINhwi);停止录音hwi:指向声音录制设备的句柄调用成功,返回MMSYSERROR_NOERR调用该函数停止从录制设备中获取音频数据并清空缓冲区MMRESULTwaveInReset(HWAVEINhwo);关闭录音设备MMRESULTwaveInClose(HWAVEINhvi)视频捕获视频捕获是指由专用的视频采集卡捕获声频和视频信息,然后将其进行数据化处理,再经过软件的压缩进行处理,这时就可对这些数据进行保存、回放、传输等各种操作。VFWWindows专门提供了VideoforWindows来对视频处理进行支持,提供的接口可以被大多数的视频采集卡支持,并有多种视频压缩驱动供选择(当然视频压缩可以自己开发),采集卡支持摄像头,TV等多种输入。捕获视频方法利用视频捕获卡所附带的SDK开发工具,这种捕获方法的实现是与设备有关的,依赖于视频捕获卡与摄像头的类型,不利于灵活应用Microsoft的VisualC++自从4.0版就开始支持VideoforWindows(简称VFW),这给视频捕获编程带来了很大的方便,利用VFW技术的可以提高视频捕获的灵活性,减少了对视频设备的依赖。VFW捕获流程1.列举安装的捕获驱动程序2.查找匹配的设备名3.创建视频捕获窗口4.设置回调函数5.与选择的设备取得联系列举视频捕获驱动程序名称•wDeriverIndex:捕获设备驱动序列号,范围从0到9•lpszName:用来存放对应设备名称的字符串•cbName:lpszName字符串缓冲区的长度•lpszVer:用来存放对应设备驱动版本号的缓冲区•cbVer:szVer字符串缓冲区的长度BOOLVFWAPIcapGetDriverDescription(WORDwDriverIndex,LPSTRlpszName,INTcbName,LPSTRlpszVer,INTcbVer);capGetDriverDescription示例intnNameLen=300;charstrs[10][300];char*pszDevName=newchar[nNameLen];char*pszDevVer=newchar[nNameLen];for(inti=0;i10;i++){if(capGetDriverDescription(i,pszDevName,nNameLen,pszDevVer,nNameLen)){strncpy(strs[i],pszDevName,300);}}deletepszDevName;deletepszDevVer;创建视频捕获窗口•lpszWindowName:要创建的捕获窗口的名称•dwStyle:要创建的捕获窗口的窗体样式•x,y:捕获窗口对应的左上角x坐标和y坐标•nWidth,nHeight:窗口对应的宽度和高度•hWnd:捕获窗口对应的父窗口•nID:捕获窗口对应的idHWNDVFWAPIcapCreateCaptureWindow(L

1 / 42
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功