当前位置:首页 > 李娜多媒体网络通信技术
return ret; }
//终止一个捕获任务
BOOL VideoCapture::StopCapture() {
capCaptureStop(m_capwnd); capCaptureAbort(m_capwnd); Sleep(500); return TRUE; }
3.3音视频处理(编解码)
音视频编码处理就是对音视频进行压缩。MPEG-4编码算法的完整源代码如下: class CVideoEncoderX264 :{ public:
CVideoEncoderX264(void); ~CVideoEncoderX264(void);
virtual bool Connect(CVideoEnDecodeNotify* pNotify, const CVideoEnDecodeItem& Item);
virtual void Release(void);
virtual void Encode(BYTE* pInData, int nLen, BYTE* pOutBuf, int& nOutLen, int& nKeyFrame); private:
x264_picture_t m_Pic; x264_t *h;
x264_param_t param; void Flush(void); };
文件:VideoEncoderX264.cpp
bool CVideoEncoderX264::Connect(CVideoEnDecodeNotify* pNotify, const CVideoEnDecodeItem& Item){ CBase::Connect(pNotify, Item); ParseSize(Item.m_stSize); x264_param_default( ¶m ); param.i_threads = 1; param.i_frame_total = 0; param.i_width = m_nWidth; param.i_height = m_nHeight;
param.i_keyint_min = Item.m_nKeyInterval; param.i_keyint_max = Item.m_nKeyInterval * 10; param.i_fps_num = Item.m_nFps;*/ param.i_log_level = X264_LOG_NONE;
if( ( h = x264_encoder_open( ¶m ) ) == NULL ) { return false; } /* Create a new pic */
x264_picture_alloc( &m_Pic, X264_CSP_I420, param.i_width, param.i_height ); return true;}
void CVideoEncoderX264::Release(void){ Flush();
x264_picture_clean( &m_Pic ); x264_encoder_close( h ); CBase::Release();}
void CVideoEncoderX264::Encode(BYTE* pInData, int nLen, BYTE* pOutBuf, int& nOutLen, int& nKeyFrame){
if(nLen != param.i_width * param.i_height * 3) return;
param.i_frame_total ++;
memcpy(m_Pic.img.plane[0], pInData, param.i_width * param.i_height); memcpy(m_Pic.img.plane[1], pInData + param.i_width * param.i_height, param.i_width * param.i_height / 4);
memcpy(m_Pic.img.plane[2], pInData + param.i_width * param.i_height * 5 / 4, param.i_width * param.i_height / 4);
m_Pic.i_pts = (int64_t)param.i_frame_total * param.i_fps_den; static x264_picture_t pic_out; x264_nal_t *nal = NULL; int i_nal, i; if( &m_Pic ){
m_Pic.i_type = X264_TYPE_AUTO; m_Pic.i_qpplus1 = 0;}
//TraceTime(\
if( x264_encoder_encode( h, &nal, &i_nal, &m_Pic, &pic_out ) < 0 ) { return;}
//TraceTime(\int nOutCanUse = nOutLen; nOutLen = 0;
for( i = 0; i < i_nal; i++ ){ int i_size = 0;
if( ( i_size = x264_nal_encode( pOutBuf + nOutLen, &nOutCanUse, 1, &nal[i] ) ) > 0 ){ nOutLen += i_size; nOutCanUse -= i_size;}}
nKeyFrame = pic_out.i_type==X264_TYPE_IDR;// || (pic_out.i_type==X264_TYPE_I && coCfg->x264_max_ref_frames==1)} void CVideoEncoderX264::Flush(void){ x264_picture_t pic_out; x264_nal_t *nal;
int i_nal, i; int i_file = 0;
if( x264_encoder_encode( h, &nal, &i_nal, NULL, &pic_out ) < 0 ){} }
解码代码不做详细分析。
3.4.语音处理
3.4.1语音录制
在音频的录制和播放时,采用的用户界面线程来处理,是CWinThread对象,根据前面线程的介绍,一步一步的来实现。录音用的一个CWinThread对象CAudioRec来实现,部分实现代码:
LRESULT CAudioRec::OnStartRecording(WPARAM wp, LPARAM lp) {
if(recording) return FALSE; //打开录音设备
MMRESULT mmReturn = ::waveInOpen( &m_hRecord, WAVE_MAPPER &m_WaveFormatEx, ::GetCurrentThreadId(), 0, CALLBACK_THREAD); if(mmReturn!=MMSYSERR_NOERROR ) return FALSE; if(mmReturn==MMSYSERR_NOERROR ){ for(int i=0; i < MAXRECBUFFER ; i++){ //为录音设备准备缓存
mmReturn = ::waveInPrepareHeader(m_hRecord, rechead[i], sizeof(WAVEHDR)); //给输入设备增加一个缓存
mmReturn = ::waveInAddBuffer(m_hRecord, rechead[i], sizeof(WAVEHDR));}
mmReturn = ::waveInStart(m_hRecord); //开始录音 if(mmReturn==MMSYSERR_NOERROR ) return TRUE; }
recording=TRUE;}
共分享92篇相关文档