如何在没有 AVISaveOptions 对话框的情况下获得 AVICOMPRESSOPTIONS?

Posted

技术标签:

【中文标题】如何在没有 AVISaveOptions 对话框的情况下获得 AVICOMPRESSOPTIONS?【英文标题】:How to get AVICOMPRESSOPTIONS without AVISaveOptions Dialog? 【发布时间】:2014-01-14 01:52:54 【问题描述】:

我正在尝试使用我在网上某处找到的示例(不记得确切的来源)以编程方式从位图生成 AVI 文件。

这是我获取选项的代码

    unsafe private void SetOptions() 

        AVICOMPRESSOPTIONS opts = new AVICOMPRESSOPTIONS();
        opts.fccType           = 0; //fccType_;
        opts.fccHandler        = 541215044;//0;//fccHandler_;
        opts.dwKeyFrameEvery   = 0;
        opts.dwQuality         = 0;  // 0 .. 10000
        opts.dwFlags           = 8;//0;  // AVICOMRPESSF_KEYFRAMES = 4
        opts.dwBytesPerSecond  = 0;
        opts.lpFormat          = (System.IntPtr)0; //new IntPtr(0);
        opts.cbFormat          = 0;
        opts.lpParms           = (System.IntPtr)0; //new IntPtr(0);
        opts.cbParms           = 3232;//0;
        opts.dwInterleaveEvery = 0;


        AVICOMPRESSOPTIONS* p = &opts;
        AVICOMPRESSOPTIONS** pp = &p;

        IntPtr x       = ps_;
        IntPtr* ptr_ps = &x;

        AVISaveOptions(0,0,1,ptr_ps,pp);

        // TODO: AVISaveOptionsFree(...)

        int hr = AVIMakeCompressedStream(out psCompressed_, ps_, ref opts, 0);
        if (hr != 0) 
            throw new AviException("AVIMakeCompressedStream");
        

        BITMAPINFOHEADER bi    = new BITMAPINFOHEADER();
        bi.biSize         = 40;
        bi.biWidth        = (Int32) width_;
        bi.biHeight       = (Int32) height_;
        bi.biPlanes       = 1;
        bi.biBitCount     = 24;
        bi.biCompression  = 0;  // 0 = BI_RGB
        bi.biSizeImage    = stride_*height_;
        bi.biXPelsPerMeter= 0;
        bi.biYPelsPerMeter= 0;
        bi.biClrUsed      = 0;
        bi.biClrImportant = 0;

        hr = AVIStreamSetFormat(psCompressed_, 0, ref bi, 40);
        if (hr != 0) 
            throw new AviException("AVIStreamSetFormat",hr);
        
    

但是我不想显示 AVISaveOptions 对话框,并且更愿意在后端完成所有操作,我已经搜索了几个小时,但到目前为止除了这个之外没有任何帮助:https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.mmedia/jH0d3H2orOo

所以我的问题是,我将如何在不显示对话框的情况下执行此操作,和/或如何以编程方式填充压缩选项?

【问题讨论】:

我也刚刚遇到this article。如果我创建一个类似的函数,将数据序列化到一个文件中,然后将该文件包含在程序集中,它会起作用吗? 您拥有所有的 API,例如Locating and Opening Compressors and Decompressors. 【参考方案1】:

最终通过注册表获取所有已安装编解码器的列表,然后创建一个 FourCC 并使用它来设置 fccType 和 fccHandler。

【讨论】:

@Emest Mallett:你能给出一些你是如何解决这个问题的代码吗?因为我也面临同样的问题 @Emest Mallett:您如何设置值 AVICOMPRESSION 对象,即。 fccType、fccHandler 等?

以上是关于如何在没有 AVISaveOptions 对话框的情况下获得 AVICOMPRESSOPTIONS?的主要内容,如果未能解决你的问题,请参考以下文章

jquery UI 对话框:如何在没有标题栏的情况下进行初始化?

如何在 PyQt 中单独显示一个对话框(没有父小部件)?

如何在没有 dralogfragment 实例的情况下从适配器显示对话框片段?

如何在没有系统确认对话框的情况下删除 Android 11 (API 30) 上的文件?

如何使用 FlutterDriver 关闭对话框

如果没有按下会做其他事情,你如何制作一个警报对话框[重复]