微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么嵌入式笔记本电脑网络摄像头无法使用AForge或DirectShow触发NewFrameEvent

如何解决为什么嵌入式笔记本电脑网络摄像头无法使用AForge或DirectShow触发NewFrameEvent

我的笔记本电脑上有嵌入式网络摄像头。我还有另一个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 举报,一经查实,本站将立刻删除。