问题描述
我的笔记本电脑上有嵌入式网络摄像头。我还有另一个USB网络摄像头。此USB网络摄像头可与C#中的AForge和C ++中的DirectShow一起很好地工作。我想使用这两个框架编写应用程序。
问题是我的嵌入式网络摄像头无法在AForge上触发NewFrameEvent。使用DirectShow可以创建仅带有标题的空AVI文件。
这是DirectShow的代码:
#include <iostream>
#include <windows.h>
#include <initguid.h>
#include <dshow.h>
int main()
{
HRESULT hr = CoInitialize(NULL);
//Initialise device enumerator
IEnumMoniker *device_enumerator;
ICreateDevEnum *dev_enum;
hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&dev_enum));
hr = dev_enum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&device_enumerator,0);
dev_enum->Release();
//Bind moniker to device
IMoniker *moniker = NULL;
while (device_enumerator->Next(1,&moniker,NULL) == S_OK)
{
}
//Build a graph and add a capture filter to it
IGraphBuilder *graph = NULL;
ICaptureGraphBuilder2 *build = NULL;
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,IID_ICaptureGraphBuilder2,(void**)&build);
hr = CoCreateInstance(CLSID_Filtergraph,IID_IGraphBuilder,(void**)&graph);
build->SetFiltergraph(graph);
IBaseFilter *cap = NULL;
hr = moniker->BindToObject(0,IID_IBaseFilter,(void**)&cap);
hr = graph->AddFilter(cap,L"Capture Filter");
//Set output file (connect cap filter to avi mux)
IBaseFilter *mux;
hr = build->SetoutputFileName(&MEDIASUBTYPE_Avi,L"C:\\users\\user\\documents\\webcamtest\\video.avi",&mux,NULL);
hr = build->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,cap,mux);
mux->Release();
//Start recording
IMediaControl *control;
hr = graph->QueryInterface(IID_IMediaControl,(void**)&control);
hr = control->Run();
std::cin.get();
hr = control->Stop();
CoUninitialize();
return 0;
}
我使用g++ c:\users\user\documents\webcamtest\directshow.cpp -lole32 -loleaut32 -oc:\users\user\documents\webcamtest\directshow.exe
C#和AForge的代码:
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
using AForge.Video;
using AForge.Video.DirectShow;
namespace Webcam
{
public partial class MainWindow : Window
{
VideoCaptureDevice device = null;
FilterInfoCollection VideoCaptureDevices;
public MainWindow()
{
InitializeComponent();
}
private void Start_Click(object sender,RoutedEventArgs e)
{
VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
device = new VideoCaptureDevice(VideoCaptureDevices[0].MonikerString);
device.NewFrame += NewFrame;
device.Start();
}
private void NewFrame(object sender,NewFrameEventArgs e)
{
Debug.WriteLine("Hello");
Bitmap bmp = e.Frame;
var handle = bmp.GetHbitmap();
BitmapSource image = Imaging.CreateBitmapSourceFromHBitmap(handle,IntPtr.Zero,Int32Rect.Empty,BitmapSizeOptions.FromEmptyOptions());
image.Freeze();
Video.dispatcher.Invoke(new Action(() => Video.source = image));
}
private void Stop_Click(object sender,RoutedEventArgs e)
{
device.SignalToStop();
}
}
}
MainWindow.xaml
<Window x:Class="Webcam.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Webcam"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDeFinitions>
<ColumnDeFinition Width="5*"/>
<ColumnDeFinition Width="20*"/>
<ColumnDeFinition Width="5*"/>
</Grid.ColumnDeFinitions>
<Button Name="Start" Grid.Column="0" Click="Start_Click"/>
<Image Name="Video" Grid.Column="1"/>
<Button Name="Stop" Grid.Column="2" Click="Stop_Click"/>
</Grid>
</Window>
嵌入式笔记本电脑网络摄像头似乎启动了,因为上面有一个指示灯,然后它打开了。在AForge中,它不会触发NewFrameEvent,而在DirectShow中,它将创建一个空的AVI文件。此网络摄像头可与Windows摄像头应用程序一起使用。
您认为我的代码/网络摄像头有什么问题?
是否可以与嵌入式笔记本电脑网络摄像头配合使用?
我觉得这些事件相关,并且相机与DirectShow不兼容。由于AForge是DirectShow的包装,如果无法使用,则可能是相关的。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)