2

DeckLink.net dllを使用して、C# で Blackmagic Design の DeckLink SDK から StreamingPreview サンプルを再作成しようとしています。

以下のコードを実行すると、うまくいくようです: 通知がインストールされ、デバイスの到着イベントも受け取ります (デバイスのプロパティも照会できます) が、AccessViolationExceptionが発生します。これは、streamingDiscovery.InstallDeviceNotifications() 行に接続する必要があり、実際にデバイスを接続して通知を受け取る場合にのみ取得します。

助けていただけませんか?

私のC#コード:

class DeckLink : IBMDStreamingDeviceNotificationCallback
{
    // Native values
    private static int S_OK = 0;
    private static int E_FAIL = 1;

    int result;

    private IBMDStreamingDiscovery streamingDiscovery;

    public DeckLink()
    {
        try
        {
            streamingDiscovery = (IBMDStreamingDiscovery)new StreamingDiscovery();
        }
        catch (Exception)
        {
            Console.WriteLine("This application requires the Blackmagic Streaming drivers installed.\nPlease install the Blackmagic Streaming drivers to use the features of this application.");
            goto bail;
        }
        result = streamingDiscovery.InstallDeviceNotifications(this);
        if (result == E_FAIL)
        {
            Console.WriteLine("Failed to install device notifications for the Blackmagic Streaming devices");
            goto bail;
        }

        Console.WriteLine("Device notifications for the Blackmagic Streaming devices were successfully installed");
        return;

    bail:
        if (streamingDiscovery != null)
        {
            streamingDiscovery = null;
        }
        return;
    }

    public int StreamingDeviceArrived(Blackmagic.DeckLink.IDeckLink device)
    {
        Console.WriteLine("Device arrived");
        return S_OK;
    }

    public int StreamingDeviceModeChanged(Blackmagic.DeckLink.IDeckLink device, Blackmagic.DeckLink.BMDStreamingDeviceMode mode)
    {
        throw new NotImplementedException();
    }

    public int StreamingDeviceRemoved(Blackmagic.DeckLink.IDeckLink device)
    {
        throw new NotImplementedException();
    }
}

これらは SDK の C++ サンプルからのものです。

result = CoCreateInstance(CLSID_CBMDStreamingDiscovery, NULL, CLSCTX_ALL, IID_IBMDStreamingDiscovery, (void**)&m_streamingDiscovery);
if (FAILED(result))
{
    MessageBox(_T("This application requires the Blackmagic Streaming drivers installed.\nPlease install the Blackmagic Streaming drivers to use the features of this application."), _T("Error"));
    goto bail;
}

// Note: at this point you may get device notification messages!
result = m_streamingDiscovery->InstallDeviceNotifications(this);
if (FAILED(result))
{
    MessageBox(_T("Failed to install device notifications for the Blackmagic Streaming devices"), _T("Error"));
    goto bail;
}

C++ クエリ インターフェイス:

if (ppv == NULL)
    return E_POINTER;
*ppv = NULL;

if (iid == IID_IUnknown)
{
    *ppv = static_cast<IUnknown*>(static_cast<IBMDStreamingDeviceNotificationCallback*>(this));
    AddRef();
    result = S_OK;
}
else if (iid == IID_IBMDStreamingDeviceNotificationCallback)
{
    *ppv = static_cast<IBMDStreamingDeviceNotificationCallback*>(this);
    AddRef();
    result = S_OK;
}
else if (iid == IID_IBMDStreamingH264InputCallback)
{
    *ppv = static_cast<IBMDStreamingH264InputCallback*>(this);
    AddRef();
    result = S_OK;
}

return result;  

また、SDK のサンプルと dotNet ライブラリをここにアップロードしました。

4

0 に答える 0