张帆的《Windows驱动开发技术详解》 有个虚拟摄像头的实现源码,但他达到的效果就是重复画一个渐变的白到黑的图像。
我想读取磁盘中的视频文件,然后模拟视频输入。文章中的思路就是对视频流的读取函数 VideoReceiveCtrlPacket ,解析 HW_STREAM_REQUEST_BLOCK 类型的指针指向的 commandcase SRB_SET_STREAM_STATE:VideoSetState(pSrb); 设置状态,增加一个定时回调函数,这个函数 VideoTimerRoutine
设置一个 捕获例程 VideoCaptureRoutine ,最终调用 ImageSynth 函数,ImageSynth 做的事情就是填充一段内存,
显示不同的图像。我想在想直接读取视频文件,然后把这些帧也填充到 ImageSynth 指向的内存区域里去。能给点思路吗?

解决方案 »

  1.   

    为什么 对AVI 文件的操作总是失败?
    // TODO: Add your control notification handler code here
    CFileDialog FileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("视频文件(*.avi)|*.avi|"));
    CString avifile;
    if(FileDlg.DoModal()==IDOK)
    {   
    avifile=FileDlg.GetPathName();
    OutputDebugString(avifile);
    //初始化   
    PAVIFILE pfile;
    AVIFILEINFO pfi;
    PAVISTREAM pavi;
    PGETFRAME pgf;

    AVIFileInit();
    long res = AVIFileOpen(&pfile,avifile,OF_READ|OF_SHARE_DENY_NONE,NULL);
    if(res != 0)
    { OutputDebugString("AVIFileOpen error!");
    switch(res)
    {
    case AVIERR_BADFORMAT:
    OutputDebugString("AVIERR_BADFORMAT");
    break;
    case AVIERR_MEMORY:
    OutputDebugString("AVIERR_MEMORY");
    break;
    case AVIERR_FILEREAD:
    OutputDebugString("AVIERR_FILEREAD");
    break;
    case AVIERR_FILEOPEN:
    OutputDebugString("AVIERR_FILEOPEN");
    break;
    case REGDB_E_CLASSNOTREG:
    OutputDebugString("REGDB_E_CLASSNOTREG");
    break;
    default:
    break;
    } return;
    }
    res = AVIFileInfo(pfile,&pfi,sizeof(AVIFILEINFO));
    if(res != 0)
    {
    OutputDebugString("AVIFileInfo error");
    return; }
    res=AVIFileGetStream(pfile,&pavi,streamtypeVIDEO,0);
    if(res != 0)
    {
    return;
    }

    pgf=AVIStreamGetFrameOpen(pavi, NULL); //这一步总是返回NULL
    if(pgf == NULL)
    {
    return;
    } 怎么个操作AVI 文件,读取帧 ?谢谢 
      

  2.   

    只用过OPENCV读取过AVI,其他没用过