首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

WinForm摄像头 录像 格式化有关问题

2013-03-27 
WinForm摄像头 录像 格式化问题用的是 avicap32.dll 我也是用的网上的方法,录像已经可以了。关键是我要设置

WinForm摄像头 录像 格式化问题
用的是 avicap32.dll 
我也是用的网上的方法,录像已经可以了。关键是我要设置分辨率。
别给我链接地址OK?


//=====================================================CAPSTATUS结构========================================================================
        //CAPSTATUS定义了捕获窗口的当前状态,如图像的宽、高等;
        [StructLayout(LayoutKind.Sequential)]
        public struct CAPSTATUS
        {
            public int uiImageWidth;                         //图像宽度
            public int uiImageHeight;                       //图像高度
            public bool fLiveWindow;                       //活动窗口标记,如果窗口正以预览的方式展示图像,那么该值为真
            public bool fOverlayWindow;                   //叠加窗口标志位,如果正在使用硬件叠加,则该位是真。
            public bool fScale;                          //输入所放标志位,如果窗口是正在缩放视频到客户区,那么该位是真。当使用硬件叠加时,改位无效。
            public Point ptScroll;                      //被展示在窗口客户区左上角的那个象素的x、y坐标偏移量。
            public bool fUsingDefaultPalette;          //默认调色板标志位,如果捕获窗口正在使用当前默认调色板,该值为真
            public bool fAudioHardware;               // 音频硬件标志位,如果系统已经安装了音频硬件,该值为真。
            public bool fCapFileExists;              //捕获文件标志位,如果一个捕获文件已经被创建,该值为真
            public int dwCurrentVideoFrame;         // 当前或最近流捕获过程中,所处理的桢的数目。包括丢弃的桢。
            public int dwCurrentVideoFramesDropped;//当前流捕获过程中丢弃的桢的数目。
            public int dwCurrentWaveSamples;      // # of wave samples cap'td
            public int dwCurrentTimeElapsedMS;   // 从当前流捕获开始计算,程序所用的时间,以毫秒为单位。
            public IntPtr hPalCurrent;          // 当前剪切板的句柄。
            public bool fCapturingNow;         // 捕获标志位,当捕获是正在进行时,改位是真
            public int dwReturn;              // 错误返回值,当你的应用程序不支持错误回调函数时可以应用改位


            public int wNumVideoAllocated;   // 被分配的视频缓存的数目。
            public int wNumAudioAllocated;  // 被分配的音频缓存的数目。
        }



网上只有读取方法,我现在要设置uiImageWidth和uiImageHeight,如何通过SendMessage来实现?
我不要弹出式的设置(AviCapture.SendMessage(this.lwndC, AviCapture.WM_CAP_DLG_VIDEOFORMAT, 0, 0);) 我不可能去叫人家操作者每运行一次都去设置一次的。


其实主要目的是压缩,5M/s 这种大小正常人都无法接受的,网上给出的方法:AviCapture.SendMessage(this.lwndC, AviCapture.WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0); 同样是弹出式的,所以不合我的要求。



请各位高手解答。53分,全部家当了。。。。
[解决办法]
实在帮不上,辛苦,帮顶~~
[解决办法]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace 解决分辨率
{
    public partial class Form1 : Form
    {
        //保存当前屏幕分辨率
        int i = Screen.PrimaryScreen.Bounds.Width;
        int j = Screen.PrimaryScreen.Bounds.Height;
        public Form1()
        {
            InitializeComponent();
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct DEVMODE
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string dmDeviceName;
            public short dmSpecVersion;
            public short dmDriverVersion;
            public short dmSize;
            public short dmDriverExtra;
            public int dmFields;
            public short dmOrientation;
            public short dmPaperSize;
            public short dmPaperLength;
            public short dmPaperWidth;
            public short dmScale;
            public short dmCopies;
            public short dmDefaultSource;


            public short dmPrintQuality;
            public short dmColor;
            public short dmDuplex;
            public short dmYResolution;
            public short dmTTOption;
            public short dmCollate;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string dmFormName;
            public short dmLogPixels;
            public int dmBitsPerPel;
            public int dmPelsWidth;
            public int dmPelsHeight;
            public int dmDisplayFlags;
            public int dmDisplayFrequency;
        }
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern int ChangeDisplaySettings([In] ref DEVMODE lpDevMode, int dwFlags);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool EnumDisplaySettings(string lpszDeviceName, Int32 iModeNum, ref DEVMODE lpDevMode);
        void ChangeRes()
        {

            DEVMODE DevM = new DEVMODE();
            DevM.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
            bool mybool;
            mybool = EnumDisplaySettings(null, 0, ref DevM);
            DevM.dmPelsWidth = 1024;//宽
            DevM.dmPelsHeight = 768;//高
            DevM.dmDisplayFrequency = 60;//刷新频率
            DevM.dmBitsPerPel = 32;//颜色象素
            long result = ChangeDisplaySettings(ref DevM, 0);
        }
        void FuYuan()
        {
            DEVMODE DevM = new DEVMODE();
            DevM.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
            bool mybool;


            mybool = EnumDisplaySettings(null, 0, ref DevM);
            DevM.dmPelsWidth = i;//恢复宽
            DevM.dmPelsHeight =j;//恢复高
            DevM.dmDisplayFrequency = 60;//刷新频率
            DevM.dmBitsPerPel = 32;//颜色象素
            long result = ChangeDisplaySettings(ref DevM, 0);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            ChangeRes();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FuYuan();
            this.Close();
           
        } 


[解决办法]
这个...有点难度,顶下!望高手出现...

热点排行