powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с видео
6 сообщений из 6, страница 1 из 1
Работа с видео
    #38115647
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже всё перерыл, перепробывал.
Может кто что подскажет.
Суть.
Веб-камера снимает "тузика", нажимаем копку - "чёлк", производится съёмка. Кадр запоминается и кладётся в сторонку.
Вроде всё просто, но ловлю эррор.
Прикрепил две части архива.
...
Рейтинг: 0 / 0
Работа с видео
    #38115648
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вторая часть
...
Рейтинг: 0 / 0
Работа с видео
    #38115669
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавлю от себя, чтобы долго не курить
вот этот код в процедуре SetupGraph
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 /*-----------------*/

            object o;
            Guid g = typeof(IAMStreamConfig).GUID;
            hr = capGraph.FindInterface(ref cat,ref med, capFilter,ref g, out o);
            IAMStreamConfig videoStreamConfig = o as IAMStreamConfig;

            hr = videoStreamConfig.GetFormat(out media);
            /*-------------------------*/
            videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));
            DsBITMAPINFOHEADER bth = videoInfoHeader.BmiHeader;
            bth.Width = 1280;
            bth.Height = 960;
            videoInfoHeader.BmiHeader = bth;
            Marshal.StructureToPtr(videoInfoHeader, media.formatPtr,false);

            hr = videoStreamConfig.SetFormat(media);
            Marshal.FreeCoTaskMem(media.formatPtr); media.formatPtr = IntPtr.Zero;
            media = null;


Переопределяет разрешение камеры.
И вот тут
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
void OnCaptureDone()
	{
		Trace.WriteLine( "!!DLG: OnCaptureDone" );
		try {
			toolBarBtnGrab.Enabled = true;
			int hr;
			if( sampGrabber == null )
				return;
			hr = sampGrabber.SetCallback( null, 0 );

			int w = videoInfoHeader.BmiHeader.Width;
			int h = videoInfoHeader.BmiHeader.Height;
			if( ((w & 0x03) != 0) || (w < 32) || (w > 4096) || (h < 32) || (h > 4096) )
				return;
			int stride = w * 3;

			GCHandle handle = GCHandle.Alloc( savedArray, GCHandleType.Pinned );
			int scan0 = (int) handle.AddrOfPinnedObject();
			scan0 += (h - 1) * stride;
			Bitmap b = new Bitmap( w, h, -stride, PixelFormat.Format24bppRgb, (IntPtr) scan0 );
			handle.Free();
			savedArray = null;
			Image old = pictureBox.Image;
			pictureBox.Image = b;
			if( old != null )
				old.Dispose();
			toolBarBtnSave.Enabled = true;
		}
		catch( Exception ee )
		{
			MessageBox.Show( this, "Could not grab picture\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
		}
	}


считываем что там мы нащёлкали. Но залипает.
Если поменять на это
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
void OnCaptureDone()
	    {
        
		    Trace.WriteLine( "!!DLG: OnCaptureDone" );
		    try {
                lock (obj)
                {
                    //toolBarBtnGrab.Enabled = true;
                    int hr;
                    if (sampGrabber == null)
                        return;
                    hr = sampGrabber.SetCallback(null, 0);

                    int w = videoInfoHeader.BmiHeader.Width;
                    int h = videoInfoHeader.BmiHeader.Height;
                    if (((w & 0x03) != 0) || (w < 32) || (w > 4096) || (h < 32) || (h > 4096))
                        return;
                    int stride = w * 3;
                    videoInfoHeader = null;
                    GCHandle handle = GCHandle.Alloc(savedArray, GCHandleType.Pinned);
                    int scan0 = handle.AddrOfPinnedObject().ToInt32();
                    
                    scan0 += (h - 1) * stride;
                    IntPtr scan = (IntPtr)scan0;
                    using (Bitmap b = new Bitmap(w, h, -stride, PixelFormat.Format24bppRgb, scan))
                    {
                        using (MemoryStream ms = new MemoryStream())
                        {
                            
                            b.Save(ms, ImageFormat.Jpeg);
                            Image image = Image.FromStream(ms);
                            
                            
                        }
                    }
                    handle.Free();
                    savedArray = null;
                    GC.Collect();
                }
		    }
		    catch( Exception ee )
		    {
			    MessageBox.Show( this, "Could not grab picture\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
		    }
	    }


то совсем станет понятно. Т.к. эксепшен там где надо
...
Рейтинг: 0 / 0
Работа с видео
    #38115676
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл добавить, если не переопределять, то всё нормально.
Но мне то хочется задать значение разрешения камеры один раз, а потом им пользоваться.
...
Рейтинг: 0 / 0
Работа с видео
    #38117336
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
Работа с видео
    #38118097
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отвечу сам себе.
Может кому понадобится в будущем.

Нехрена врукопашную лазить кривыми руками и задавать разрешение, которое может даже и подходит.
А надо возвращать указатель из соотв. функции.
А вот и код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
bool SetupGraph()
        {
            int hr;
            try
            {
                hr = capGraph.SetFiltergraph(graphBuilder);
                if (hr < 0)
                    Marshal.ThrowExceptionForHR(hr);

                hr = graphBuilder.AddFilter(capFilter, "Ds.NET Video Capture Device");
                if (hr < 0)
                    Marshal.ThrowExceptionForHR(hr);

                //DsUtils2.ShowCapPinDialog( capGraph, capFilter, this.Handle );

                AMMediaType media = new AMMediaType();
                media.majorType = MediaType.Video;
                media.subType = MediaSubType.RGB24;
                media.formatType = FormatType.VideoInfo;		// ???
                hr = sampGrabber.SetMediaType(media);
                if (hr < 0)
                    Marshal.ThrowExceptionForHR(hr);

                hr = graphBuilder.AddFilter(baseGrabFlt, "Ds.NET Grabber");
                if (hr < 0)
                    Marshal.ThrowExceptionForHR(hr);

                Guid cat = PinCategory.Preview;
                Guid med = MediaType.Video;
                hr = capGraph.RenderStream(cat, med, capFilter, null, null); // baseGrabFlt 
                if (hr < 0)
                    Marshal.ThrowExceptionForHR(hr);

                cat = PinCategory.Capture;
                med = MediaType.Video;
                InitializeResolution(capGraph, capFilter);
                hr = capGraph.RenderStream(cat, med, capFilter, null, baseGrabFlt); // baseGrabFlt 
                if (hr < 0)
                    Marshal.ThrowExceptionForHR(hr);

                media = new AMMediaType();
                hr = sampGrabber.GetConnectedMediaType(media);
                videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));

                if (hr < 0)
                    Marshal.ThrowExceptionForHR(hr);

                if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero))
                    throw new NotSupportedException("Unknown Grabber Media Format");

                Marshal.FreeCoTaskMem(media.formatPtr); media.formatPtr = IntPtr.Zero;
                media = null;
                //// Fix upsidedown video
                IAMVideoControl videoControl = capFilter as IAMVideoControl;
                if (videoControl != null)
                {
                    VideoControlFlags pCapsFlags;

                    IPin pPin = DsFindPin.ByCategory(capFilter, PinCategory.Capture, 0);
                    hr = videoControl.GetCaps(pPin, out pCapsFlags);

                    DsError.ThrowExceptionForHR(hr);

                    if ((pCapsFlags & VideoControlFlags.FlipVertical) > 0)
                    {
                        hr = videoControl.GetMode(pPin, out pCapsFlags);
                        DsError.ThrowExceptionForHR(hr);

                        hr = videoControl.SetMode(pPin, 0);
                    }
                }
                hr = sampGrabber.SetBufferSamples(false);
                if (hr == 0)
                    hr = sampGrabber.SetOneShot(false);
                if (hr == 0)
                    hr = sampGrabber.SetCallback(null, 0);
                if (hr < 0)
                    Marshal.ThrowExceptionForHR(hr);

                return true;
            }
            catch (Exception ee)
            {
                MessageBox.Show(this, "Could not setup graph\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return false;
            }
        }

        void InitializeResolution(ICaptureGraphBuilder2 capGraph, IBaseFilter capFilter)
        {
            object o;
            Guid med = MediaType.Video;
            Guid cat = PinCategory.Capture;
            Guid g = typeof(IAMStreamConfig).GUID;
            int hr=capGraph.FindInterface(cat, med, capFilter, g, out o);

            AMMediaType media = null;
            IAMStreamConfig videoStreamConfig = o as IAMStreamConfig;
            IntPtr ptr;
            int iC = 0, iS = 0;

            videoStreamConfig.GetNumberOfCapabilities(out iC, out iS);
            ptr = Marshal.AllocCoTaskMem(iS);
            int maxWidth = 0;
            int maxHeight = 0;
            int streamID = 0;
            int w = int.Parse(GetDeviceSettingValue(MyParentForm.SelectedDevice, "ResolutionWidth"));
            int h = int.Parse(GetDeviceSettingValue(MyParentForm.SelectedDevice, "ResolutionHeight"));
            int avgrate = int.Parse(GetDeviceSettingValue(MyParentForm.SelectedDevice, "AvgTimePerFrame"));
            for (int i = 0; i < iC; i++)
            {
                videoStreamConfig.GetStreamCaps(i, out media, ptr);
                //VideoInfoHeader v;
                videoInfoHeader = new VideoInfoHeader();
                Marshal.PtrToStructure(media.formatPtr, videoInfoHeader);

                if (videoInfoHeader.BmiHeader.Width <= w
                    && videoInfoHeader.BmiHeader.Height <= h &&
                    videoInfoHeader.AvgTimePerFrame == avgrate && videoInfoHeader.BmiHeader.BitCount==24)
                #region Test
                //if (videoInfoHeader.BmiHeader.Width <= 800 && videoInfoHeader.BmiHeader.Height <= 600 && videoInfoHeader.AvgTimePerFrame==333333 && 
                //videoInfoHeader.BmiHeader.BitCount==24 && videoInfoHeader.BmiHeader.ImageSize==1440000 && videoInfoHeader.BmiHeader.Planes== 1 &&
                //videoInfoHeader.BmiHeader.Size==40 && videoInfoHeader.BitRate==345600000)
                #endregion
                {
                    streamID = i;
                    maxWidth = videoInfoHeader.BmiHeader.Width;
                    maxHeight = videoInfoHeader.BmiHeader.Height;
                }
            }

            videoStreamConfig.GetStreamCaps(streamID, out media, ptr);
            videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));
            hr = videoStreamConfig.SetFormat(media);
            Marshal.FreeCoTaskMem(ptr);
            DsError.ThrowExceptionForHR(hr);
            DsUtils2.FreeAMMediaType(media);
            media = null;
            Marshal.ReleaseComObject(videoStreamConfig);

        }
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с видео
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]