李娜多媒体网络通信技术

2026/4/28 3:20:21

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;}


李娜多媒体网络通信技术.doc 将本文的Word文档下载到电脑
搜索更多关于: 李娜多媒体网络通信技术 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219