1.为axvlc.dll添加接口 1.1 修改cygwin文件的环境配置。在cygwin的etc文件夹下的profile文件中添加如下语句, export PATH=$PATH:"/cygdrive/c/Program Files/Microsoft Visual Studio/COMMON/MSDev98/Bin":"/cygdrive/c/Program Files/Microsoft Visual Studio/VC98/Bin" export INCLUDE='C:\Program Files\Microsoft Visual Studio\VC98\Include' export MIDL="midl" 只是为了添加midl命令 添加完成后,重新启动cygwin,运行midl命令,如果出现: Microsoft (R) MIDL Compiler Version 5.01.0164 Copyright (c) Microsoft Corp 1991-1997. All rights reserved. midl : command line error MIDL1000 : missing source-file name 则表示修改cygwin成功。 2.2 现在你只要找个paly接口,搜索下看要在那些地方加一般是在axvlc.idl和axvlc_idl.h文件里面把接口加上就好了. 3.3 加好执行下midl axvlc.idl 2.使用axvlc.dll控件: 2.1首先你得把你编译出来的控件注册下,在把其添加到vc工程里面去,然后就可以通过m_VLCPlayerCtrl.playlistClear(); m_VLCPlayerCtrl.stop(); VARIANT va; VariantInit(&va); m_VLCPlayerCtrl.addTarget("G:\\BraveHeart1.avi",va,0x0002+0x0004,-666); m_VLCPlayerCtrl.play(); 来调用他了。 3.我对vlc代码的一些修改,写的很杂乱. 3.1.修改vlc背景颜色:在文件module/video_output/Dirextx/events.c中是创建视频显示窗体的地方,找到DirectXCreateWindow函数, 在找到wc.hbrBackground = GetStockObject(LTGRAY_BRUSH/*yanjb BLACK_BRUSH*/); 3.2.如何让父窗体响应右键消息:响应不了是因为在在文件module/video_output/Dirextx/events.c创建的窗体已经捕获了WM_RBUTTONUP消息,我们要在 在视频窗体上把该消息在转发一次, { POINT pt; pt.x = GET_X_LPARAM(msg.lParam); pt.y = GET_Y_LPARAM(msg.lParam); ClientToScreen(msg.hwnd, &pt);//把子窗体鼠标坐标转换为屏幕坐标 ScreenToClient(p_event->p_vout->p_sys->hparent, &pt);//在把屏幕坐标转换为父窗体鼠标坐标 PostMessage(p_event->p_vout->p_sys->hparent, WM_RBUTTONUP, msg.wParam, MAKELPARAM(pt.x, pt.y));//给父窗体发送该消息,并附带鼠标坐标值 } 3.3.对于axvlc.dll如何添加一个新窗体,这样可以实现轮训效果: 3.3.1主要涉及文件是activex/pulgin.cpp (创建接口类对象和activex窗体),activex/pulgin.h ,activex/vlccontrol.cpp(提供接口类) ,activex/vlccontrol.h 3.3.2 先添加一个新窗体HWND _videownd;和一个新libvlc对象:libvlc_instance_t* _p_libvlc2. 3.3.3 在创建getvlc函数中增加一段: _p_libvlc2 = libvlc_new(ppsz_argc, ppsz_argv, NULL); 并在最后返回该对象。 3.3.4 在创建窗体时: _videownd2 = CreateWindow(_p_class->getVideoWndClassName(), TEXT("VLC Plugin Video Window2"), WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE, posRect.left+10, posRect.top+10, posRect.right-posRect.left+10, posRect.bottom-posRect.top+10, _inplacewnd, 0, _p_class->getHInstance(), NULL ); 并添加这段 libvlc_video_set_parent(_p_libvlc2,reinterpret_cast<libvlc_drawable_t>(_videownd2), NULL); 这是一个窗体绑定的函数。 3.3.5 加好了后,还要在刷新事件onPositionChange中加上 SetWindowPos(_videownd2, NULL, posRect.left, posRect.top, posRect.right-posRect.left, posRect.bottom-posRect.top, SWP_NOACTIVATE| SWP_NOCOPYBITS| SWP_NOZORDER| SWP_NOOWNERZORDER ); 这段是当我们拖动改变窗体大小改变时,该用该函数改变其窗体大小。 3.3.6 要实现轮训我们还要更改vlccontrol.cpp提供的play()接口,并新增加一个open()接口,两接口代码如下: STDMETHODIMP VLCControl::open(BSTR uri) { VARIANT v_name; VariantInit(&v_name); addTarget(uri, v_name, VLCPlayListInsert, 1); //play int i_vlc; HRESULT result = _p_instance->getVLCObject(&i_vlc); if( SUCCEEDED(result) ) { VLC_Play(i_vlc); _p_instance->fireOnPlayEvent(); } if(_p_instance->b_show) //b_show是加了专门用来判断是否第一次访问的. { _p_instance->b_show = false; }else { ShowWindow(_p_instance->_videownd, _p_instance->b_libvlc ? SW_HIDE :SW_SHOW); ShowWindow(_p_instance->_videownd2, _p_instance->b_libvlc ?SW_SHOW :SW_HIDE); } return NOERROR; }; STDMETHODIMP VLCControl::play(void) { ShowWindow(_p_instance->_videownd, _p_instance->b_libvlc ? SW_SHOW : SW_HIDE); ShowWindow(_p_instance->_videownd2, _p_instance->b_libvlc ?SW_HIDE : SW_SHOW); /* int i_vlc; HRESULT result = _p_instance->getVLCObject(&i_vlc); if( SUCCEEDED(result) ) { VLC_Play(i_vlc); _p_instance->fireOnPlayEvent(); } return result; */ //yanjb { if( _p_instance->b_libvlc) { _p_instance->b_libvlc = false; }else{ _p_instance->b_libvlc = TRUE; } } stop(); playlistClear(); return NOERROR; }; 4.播放长时间黑屏问题: 文件:modules\codec\ffmpeg\Video.c picture_t *E_(DecodeVideo)( decoder_t *p_dec, block_t **pp_block ) { p_dec->b_pace_control = VLC_TRUE;//这个是让超过时间的图片丢弃,但是这样以来图片质量变的很差。 文件:src\video_output\video_output.c static void RunThread( vout_thread_t *p_vout) b_drop_late = val.b_bool; b_drop_late = VLC_FALSE; //强制为FALSE不执行下面那段 5.几个重要的命令行参数: ppsz_argv[ppsz_argc++] = "--rtsp-caching=100"; //rtsp缓冲时间 ppsz_argv[ppsz_argc++] = "--file-caching=100"; //文件流缓冲时间,这些时间不是越大越好,设置越大实时流延迟越高。 ppsz_argv[ppsz_argc++] = "--no-overlay"; //重叠视频输出默认关闭,这个一定要否则当窗口无效时,它不会刷新窗口,导致无法显示视频. |