c#中的blackmagic SDK

| 我试图使用Windows7 64x上的最新SDK(2011年6月)和C#+ VS 2010 Express,从一张Blackmagic Intensity Pro卡中捕获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);
    

要回复问题请先登录注册