织梦CMS - 轻松建站从此开始!

罗索

vlc代码的使用

jackyhwei 发布于 2011-12-20 10:52 点击:次 
1.为axvlc.dll添加接口;2.使用axvlc.dll控件;3.对vlc代码的一些修改;4.播放长时间黑屏问题;
TAG:

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"; //重叠视频输出默认关闭,这个一定要否则当窗口无效时,它不会刷新窗口,导致无法显示视频.

(yanjinbin)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201112/15514.html]
本文出处:百度博客 作者:yanjinbin 原文
顶一下
(0)
0%
踩一下
(4)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容