我想做一个播放视频的activex控件,就如同Active Movie一样,请赐教。

解决方案 »

  1.   

    在你的控件中嵌入MediaPlayer或者RealPlayer控件。添加对二者的引用即可。如果你想从解压到支持网络协议,I don't think it is  a piece of cake!
      

  2.   

    简单的你可以如 microran2000 复杂的你可以用 DShow 
    主要看你要完成什么功能
      

  3.   

    用已经成型的控件最好了,如果是RM那只能用REAL公司的了,他又不公开源代码所以只有在安装的机器上注册他的控件了
      

  4.   

    谢谢以上各位的解答,我想使该控件具备网络接收能力。
    我现在已经用DShow做了一个程序,能够接受服务器端组播过来的视频流并播放之。
    现在的问题是我想把它转为一个ActiveX控件,以便嵌套在web中,
    请各位大虾指点迷津。若能提供样例源码更好。
    我准备了300分。
      

  5.   

    各位大侠,我要做一个对话框的activex控件,在上面放置media player控件。
    问题如下:
      做一个对话框的activex控件,如果在上面放置普通控件如edit等,没有问题。
    但如果“insert activex control”,插入media player控件。则测试时报错“debug assertion failed”。对话框无法显示。
    不知何故。
      

  6.   

    如果你使用 DShow 的方法进行播放,你可以在控件中 Create 动态创建一个窗口,用SetWindowPos 把窗口设置为和控件一样大小(当然这个窗口就是你所用来支持DShow的东东)
    剩下的工作量是移植你的代码,内容并不太多
      

  7.   

    qrlvls(忍者神牛) ,我按照你的方法成功的创建了一个视频播放窗口,谢谢了!
    或许是小弟愚鲁,创建成功的视频播放窗口却不能接收到视频流,望不吝赐教。1.创建窗口函数
    HRESULT CShowTool::StartShow(HWND hWnd,CRect rc)
    {
        MSG msg={0};
        HRESULT hr;
        WNDCLASS wc;
        HINSTANCE hIns;
        // Initialize COM
        if( FAILED( CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
        {
            Msg(TEXT("CoInitialize Failed!\r\n"));   
            exit(1);
        } 

     //注册网络传输组件dsnet.ax
    LPTSTR ComName=_T("dsnet.ax");
    BOOL bRet=RegisterCom(ComName);
        if(!bRet)
    {
        Msg(TEXT("注册网络传输组件失败!\r\n"));   
            exit(1);
    }
    hIns=::AfxGetInstanceHandle();
        // Register the window class
        ZeroMemory(&wc, sizeof wc);
        wc.lpfnWndProc   = WndMainProc;
        wc.hInstance     = hIns;
        wc.lpszClassName = CLASSNAME;
        wc.lpszMenuName  = NULL;
        wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hIcon         = LoadIcon(hIns, MAKEINTRESOURCE(IDI_VIDPREVIEW));
        if(!RegisterClass(&wc))
        {
            Msg(TEXT("RegisterClass Failed! Error=0x%x\r\n"), GetLastError());
            CoUninitialize();
            return E_FAIL;
        }
         
        // Create the main window.  The WS_CLIPCHILDREN style is required.
        ghApp = CreateWindow(CLASSNAME, APPLICATIONNAME,
                             WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_CLIPCHILDREN,
                             CW_USEDEFAULT, CW_USEDEFAULT,
                             DEFAULT_VIDEO_WIDTH, DEFAULT_VIDEO_HEIGHT,
                             0, 0, hIns, 0);    if(ghApp)
        {        // Create DirectShow graph and start capturing video
            hr = CaptureVideo();
            if (FAILED (hr))
            {
                CloseInterfaces();
                ::DestroyWindow(ghApp);
            }
            else
            {
                // Don't display the main window until the DirectShow
                // preview graph has been created.  Once video data is
                // being received and processed, the window will appear
                // and immediately have useful video data to display.
                // Otherwise, it will be black until video data arrives.
              ::SetWindowPos(hWnd,HWND_BOTTOM,rc.left,rc.top,rc.Width(),rc.Height     (),SWP_DRAWFRAME);
                ::ShowWindow(ghApp, TRUE);
            }   while(GetMessage(&msg,NULL,0,0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    }
    return hr;
    }2.回调函数
    LRESULT CALLBACK WndMainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        CShowTool sst;
        switch (message)
        {
            case WM_GRAPHNOTIFY:
       sst.HandleGraphEvent();
                break;        case WM_SIZE:
                sst.ResizeVideoWindow();
                break;        case WM_WINDOWPOSCHANGED:
                sst.ChangePreviewState(! (::IsIconic(hwnd)));
                break;        case WM_CLOSE:            
                // Hide the main window while the graph is destroyed
                ::ShowWindow(sst.ghApp, SW_HIDE);
                sst.CloseInterfaces();  // Stop capturing and release interfaces
                break;        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }    // Pass this message to the video window for notification of system changes
        if (sst.g_pVW)
            sst.g_pVW->NotifyOwnerMessage((long) hwnd, message, wParam, lParam);    return ::DefWindowProc (hwnd , message, wParam, lParam);
    }
      

  8.   

    神牛,我是把原来的应用程序的接收和显示视频的功能封装成一个类,就是CShowTool。我的原意是当该activex组件一起动就开始接收并显示视频流。组件的行为方式并没有改变。请指点迷津。
      

  9.   

    ltprogram(流水) ,我的问题和他一样,请高手继续顶啊! 我在这里谢谢了!
      

  10.   

    ltprogram(流水),为什么我在控件工程中一LINK strmbase.lib,运行就出错?
      

  11.   

    ActiveX本身就是CWnd,和一般的窗口一样创建就行了,至于如果你外部想要你的控件干什么,就暴露出某个方法就行了啊,只需要在适当的时机调用该方法就行啊;既然你内部逻辑已经做好了,封装到你的ActiveX中,就可以了吧!不知道你还有什么其他要求啊?