c# 中的 blackmagic SDK

2023-11-25

我正在尝试在 windows7 64x 上使用最新的 SDK(2011 年 6 月)和 C# + VS 2010 Express 从一张 blackmagic 强度专业卡捕获 720p。

我已经成功编译并运行了一个以 YUV 捕获帧的程序,但是,捕获在 56 帧后停止(回调函数停止被调用)。我想知道我是否在这里遗漏了一些简单的东西?特别是考虑到我已经快到了 - 我得到的框架具有正确的内容、正确的尺寸等,但只是短暂的。

还有一些其他可能相关的信息:

  • 如果我拔掉相机的插头,拍摄不会停止
  • 我也在 1080i 和 PAL 下尝试过,同样的情况发生
  • 即使 VideoInputFrameArrived 函数为空(即其中只有一个帧计数器),也会发生同样的事情

这是代码:


public partial class MainWindow : Window , IDeckLinkInputCallback
{
    private IDeckLinkIterator   _deckLinkIterator;
    private List<IDeckLink>     _deckLinkList = new List<IDeckLink>();
    private IDeckLink           _currentDevice=null;
    private IDeckLinkInput      _deckLinkInput = null;

    private int _width=1280;
    private int _height=720;

    private WriteableBitmap _writeableBitmap =null;

    IntPtr _tempRGBData;
    byte[] _tempRGBDataBytes;

    DispatcherTimer _timer = new DispatcherTimer();

    public MainWindow()
    {
        InitializeComponent();
    }

    Random _random = new Random();

    void _timer_Tick(object sender, EventArgs e)
    {
        _random.NextBytes(_tempRGBDataBytes);

        _writeableBitmap.WritePixels(new Int32Rect(0, 0, _width, _height),_tempRGBData, _height * _width * 3, _width * 3);
    }


    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        _writeableBitmap = new WriteableBitmap(_width, _height, 72, 27, PixelFormats.Bgr24, null);
        _captureImage.Source = _writeableBitmap;

        _tempRGBData = Marshal.AllocHGlobal(3 * _width * _height * Marshal.SizeOf(typeof(byte)));
        _tempRGBDataBytes = new byte[3 * _width * _height];
        _deckLinkIterator = new CDeckLinkIterator();


        IDeckLink dl=null;
        while(true)
        {
            _deckLinkIterator.Next(out dl);

            if(dl==null)
            {
                break;
            }
            else
            {
                _deckLinkList.Add(dl);
            }
        }

        foreach (IDeckLink device in _deckLinkList)
        {
            String name;
            device.GetModelName(out name);
            Console.WriteLine("" + name);
        }

        _currentDevice = _deckLinkList[1];
        _deckLinkInput = (IDeckLinkInput)_currentDevice;

        uint frameCount=0;
        _deckLinkInput.GetAvailableVideoFrameCount(out frameCount);

        Console.WriteLine("available frame count: " + frameCount);

        IDeckLinkDisplayModeIterator displayIterator=null;
        _deckLinkInput.GetDisplayModeIterator(out displayIterator);


        _BMDDisplayModeSupport displayModeSupport;
        IDeckLinkDisplayMode displayMode=null;

        _BMDDisplayMode setDisplayMode      = _BMDDisplayMode.bmdModeHD720p50;
        _BMDPixelFormat setPixelFormat      = _BMDPixelFormat.bmdFormat8BitYUV;
        _BMDVideoInputFlags setInputFlag    = _BMDVideoInputFlags.bmdVideoInputFlagDefault;

        _deckLinkInput.DoesSupportVideoMode(setDisplayMode, setPixelFormat, setInputFlag, out displayModeSupport, out displayMode);


        try
        {
            //_deckLinkInput.DisableAudioInput();
            _deckLinkInput.EnableVideoInput(setDisplayMode, setPixelFormat, setInputFlag);

        }
        catch (Exception em)
        {
            Console.WriteLine("deck link init failed: " + em.Message);
        }

        _deckLinkInput.SetCallback(this);


        Console.WriteLine("done!");

        _timer.Interval = TimeSpan.FromSeconds(1f / 30f);
        _timer.Tick += new EventHandler(_timer_Tick);
        _timer.Start();
    }


    int frameCount = 0;

    public void VideoInputFrameArrived(IDeckLinkVideoInputFrame video, IDeckLinkAudioInputPacket audio)
    {

        //get image data
        IntPtr pData;
        video.GetBytes(out pData);



        //keeping it simple so just counting frames - this gets called 56 times then stops
        Console.WriteLine("video frame arrived!! " + frameCount);
        frameCount++;

    }

    public void  VideoInputFormatChanged(_BMDVideoInputFormatChangedEvents events, IDeckLinkDisplayMode displayMode, _BMDDetectedVideoInputFormatFlags flags)
    {
        Console.WriteLine("video format changed!!");
    }

    //start stream
    private void button1_Click(object sender, RoutedEventArgs e)
    {
        _deckLinkInput.StartStreams();

    }

    //stop stream
    private void button2_Click(object sender, RoutedEventArgs e)
    {
        _deckLinkInput.StopStreams();

    }

    private void button4_Click(object sender, RoutedEventArgs e)
    {
        _deckLinkInput.PauseStreams();
    }

    private void button3_Click(object sender, RoutedEventArgs e)
    {
        _deckLinkInput.FlushStreams();
    }
 }

我已经在blackmagic技术支持的帮助下成功解决了这个问题

解决方案是在回调函数的末尾插入这一行:

System.Runtime.InteropServices.Marshal.ReleaseComObject(video);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c# 中的 blackmagic SDK 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 如何使用 Eloquent 对分组结果进行排序?

    我已经尝试解决这个问题有一段时间了 但似乎无法使其发挥作用 我有一张与此类似的桌子 表 问题 id yearly issue year stock created at updated at magazine id 1 10 2000 1
  • 如何使用 HTML 验证日期范围?

    或者 是否可以使用 HTML 验证另一个字段的值 一个常见的示例是选择一个日期范围 其中 起始 日期应小于或等于 截止 日期 如果您可以在语法中使用元素引用 则以下内容将描述值之间所需的关系
  • 更改 Velocity.Log 文件的位置

    看起来很简单 文档位于http velocity apache org engine devel developer guide html Configuring Logging说要设置runtime log属性 这是我所有财产的所得 ve
  • 获取android中用户的语言

    http web archiveorange com archive v fwvde0wN3xcViMtADw6x 似乎 navigator language 属性在 android 上的 webview 中始终为 en 那么 获取用户语言
  • 确定硬币组合的算法

    最近 我遇到了一个关于编程算法的提示 但我不知道该怎么做 我以前从未真正编写过算法 所以我在这方面还是个新手 该问题要求编写一个程序来确定收银员根据硬币价值和硬币数量找零的所有可能的硬币组合 例如 一种货币可能有 4 个硬币 2 分 6 分
  • 有没有办法获取当前函数的函数名?

    defun foo send to debug log Error Function terminated get current function name 我目前这样做 defun foo send to debug log Error
  • 当购物车达到一定数量时添加促销产品

    我正在 WooCommerce 中寻找正确的钩子 因为当达到一定的购物车数量 例如 100 个常规单位 时 我需要将促销产品添加到购物车 我也用过钩子 init 但我认为这是不对的 这是我的代码 function add free prod
  • OpenCV for Android:无法加载级联分类器错误

    这是我第一次使用 openCV 库 我想用它来检测眼睛 我已经用过FdActivity本教程中提供的代码 http romanhosek cz android eye detection updated for opencv 2 4 6 本
  • 使用 Perl 匹配两个重叠模式

    我希望我的问题还没有被其他人提出 因为我试图查看网站上的几乎所有地方 但我无法找到答案 我的问题是 我正在制作一个 PERL 脚本 它必须检测每一次出现 of one or字符串中的另一个模式 例如 string betaalphabeta
  • 从 C# 类生成 UML 图

    我有 nHibernate 生成的类 用作持久保存到 SQL 数据库的 MVC 项目的 BO 我想将现有代码呈现为 UML 图表 以便我可以开始使用代码生成实用程序 与所问的类似here仅适用于 SQL nhibernate SO 建议从
  • 如何在 javascript 中对 url 进行编码并在 C# 中对其进行解码

    我有一个带有查询字符串的网址 通过它传递一些数据 我想在服务器端检索数据 这个问题的解决办法是什么 您可以使用 javascript 的转义函数对 URL 进行编码 Example escape It s me result It 27s
  • 我应该如何理解&**self in Box

    boxed rs 中的代码 stable feature rust1 since 1 0 0 rustc const unstable feature const box issue 92521 impl
  • 全新的rails应用程序,无法生成脚手架

    虽然我不是专家 但我已经在内部开发了一些 Rails 应用程序 用于一些相对小型 中型的项目 并且之前没有遇到过与此类似的问题 我只是想创建一个新的应用程序 然后创建一个脚手架 但我收到了有关 sqlite3 gem 的错误 看看这个 我的
  • ExpandableListView 显示没有子项的组的指示器

    我正在创建一个ExpandableListView与数据库中的数据 为此 我正在使用CursorTreeAdapter我用一个填充它Cursor包含我从数据库检索的数据的对象 我认为 默认情况下Android会考虑没有孩子的组 不可扩展 但
  • 为什么从 v6 升级到 IdentityModel v7 后出现 IDX20803 错误?

    升级后Microsoft IdentityModel Tokens and System IdentityModel Tokens Jwt to 7 0 0 我收到此错误 IDX20803 无法从 https example com rea
  • 修改本地存储?

    我正在使用 simplecartjs 为在线商店提供支持 它将数据存储在本地存储中 如下所示 SCI 1 quantity 1 id SCI 1 price 20 name Mattamusta teippi size Tyhj SCI 3
  • Android:如何将预览帧保存为jpeg图像?

    我想将预览帧保存为 jpeg 图像 我尝试编写以下代码 public void onPreviewFrame byte data Camera camera if settings isRecording Camera Parameters
  • 使用 TypeScript 和 React 输入 redux 表单 v7

    我有一个简单的由react redux驱动的表单 我希望有一个 form container tsx 和一个 form component tsx 其中 form container tsx 保存所有到 redux 状态的连接减去 Fiel
  • Xcode 界面生成器未检测到 Admob 框架类

    我一直在尝试在我的 iOS 应用程序中实现原生 Google adMob 广告 并遵循 admob 官方教程 https developers google com admob ios native advanced 无论我是手动添加所需的
  • c# 中的 blackmagic SDK

    我正在尝试在 windows7 64x 上使用最新的 SDK 2011 年 6 月 和 C VS 2010 Express 从一张 blackmagic 强度专业卡捕获 720p 我已经成功编译并运行了一个以 YUV 捕获帧的程序 但是 捕