TAG:
终于可以用了,原本directsound就是来播放声音的,怎么现在看来这么费劲呢?好多directsound的sample代码都是播放wav文件的,而我从一开始就打算把音频数据通过以太网以流的形式传输,这样必然就需要一个循环缓冲区,从网络接收数据,解码后写入这个缓冲区,然后另外一个线程,周期性的读取这个缓冲区,来实现声音播放。还是采用与directsound的抓取音频数据的思路,编写了一个封装类,很好用,目前也只是8KHz,16Bits,Mono的PCM码流,可以直接播放而已。
咱为人厚道,贴出代码,希望对后来者有用:
这个是CStreamAudio类的头文件:
我想这些应该可以解决相当一部分人对于voip技术的神秘感吧。
调用方式:
(1)添加派生类
class CCapSvrDlg : public CDialog,
public CAudioStreamHandler // audio stream play handler
(2)重载纯虚函数
public: // override the CAudioStreamHandler
void AdoStreamData(unsigned char * pBuffer, int nBufferLen) ; 这里的pBuffer与前几篇博客的数据抓取类有所不同,这个pBuffer是需要写入的,毕竟这个类是用来播放流音频数据的嘛。
(3)声明播放对象
CStreamAudio m_strm_ado ;
(4)在OnInitDialog中初始化对象:
// create stream audio play
m_strm_ado.Open(GetSafeHwnd(), this) ; (5)再某个按钮或是什么东西里面开始流数据播放:
m_strm_ado.CtrlStream(TRUE) ;
(6)停止流播放
m_strm_ado.CtrlStream(FALSE) ;
(7)关闭播放对象
m_strm_ado.Close() ;
好了这个样就一切ok了,在它需要周期性读取pcm码流的时候,会自动调用AdoStreamData函数的,在nBufferLen形参里面会指明需要读取多少个字节的pcm码流。直接把数据写入pBuffer即可。
呵呵,只要搞个循环的接收缓冲区就可以了。
原本是OpenGL的铁杆追随者,这段时间看看directx, direct3d,呵呵,到底是微软啊。还是怀念用OpenGL写视频模块的日子。。。
具体的依赖库,查查directx的help吧,懒得写了,整个工程文件太大,浪费偶的博客空间,暂时先不上传了。
CPP源码见后一页。
(陈罡) |