API Lync - CaptureVideoWindow и RenderVideoWindow имеют значение Null

Я загрузил SDK для Lync 2013 и у меня возникла проблема с примером кода, найденным в AudioVideoConversation.csproj, Этот проект должен продемонстрировать использование аудио / видео разговоров через Lync API. У меня проблемы с получением части видео для работы в примере приложения. Проблема в этом методе:

    /// <summary>
    /// Called when the video state changes.
    /// 
    /// Will show Incoming/Outgoing video based on the channel state.
    /// </summary>
    void videoChannel_StateChanged(object sender, ChannelStateChangedEventArgs e)
    {
        //posts the execution into the UI thread
        this.BeginInvoke(new MethodInvoker(delegate()
        {
            //updates the status bar with the video channel state
            toolStripStatusLabelVideoChannel.Text = e.NewState.ToString();


            //*****************************************************************************************
            //                              Video Content
            //
            // The video content is only available when the Lync client is running in UISuppressionMode.
            //
            // The video content is not directly accessible as a stream. It's rather available through
            // a video window that can de drawn in any panel or window.
            //
            // The outgoing video is accessible from videoChannel.CaptureVideoWindow
            // The window will be available when the video channel state is either Send or SendReceive.
            // 
            // The incoming video is accessible from videoChannel.RenderVideoWindow
            // The window will be available when the video channel state is either Receive or SendReceive.
            //
            //*****************************************************************************************

            //if the outgoing video is now active, show the video (which is only available in UI Suppression Mode)
            if ((e.NewState == ChannelState.Send 
                || e.NewState == ChannelState.SendReceive) && videoChannel.CaptureVideoWindow != null)
            {
                //presents the video in the panel
                ShowVideo(panelOutgoingVideo, videoChannel.CaptureVideoWindow);
            }

            //if the incoming video is now active, show the video (which is only available in UI Suppression Mode)
            if ((e.NewState == ChannelState.Receive 
                || e.NewState == ChannelState.SendReceive) && videoChannel.RenderVideoWindow != null)
            {
                //presents the video in the panel
                ShowVideo(panelIncomingVideo, videoChannel.RenderVideoWindow);
            }

        }));
    }

Переменные videoChannel.CaptureVideoWindow а также videoChannel.RenderVideoWindow всегда нулевые (обратите внимание, что, в отличие от этого вопроса, videoChannel переменная НЕ является нулевой).

Некоторые вещи, которые вы должны знать:

  1. Я запускаю Lync в режиме подавления пользовательского интерфейса (достигается путем добавления раздела реестра UISuppressionMode [DWORD] как 1 в расположении HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Lync)
  2. Аудио часть семпла работает отлично
  3. Пример фактически отправляет мой видеопоток удаленной стороне
  4. Когда разговор закончен, настройка, e.NewState == ChannelState.SendReceive оценивает true
  5. Я работаю в Visual Studio 2012 и Microsoft Lync 2013

1 ответ

Решение

Я запустил старую демонстрацию (временные рамки января 2014 года), которую я собрал, и все работало нормально. Затем я установил последнюю версию SDK и запустил образец, и, конечно же, у меня возникла та же проблема.

Проблема связана с исключением, когда вы пытаетесь установить владельца Microsoft.Lync.Model.Conversation.AudioVideo.VideoWindow.

Оказывается, произошли изменения в том, как обрабатываются разрешения для захвата этого окна. "Исправление" на данный момент заключается в том, чтобы поместить приложение в папку пользователя учетной записи, на которой запущена программа. Я попробовал это, и это действительно работает.

Вот оскорбление из ConversationWindow.cs: строка 1128...

//sets the properties required for the native video window to draw itself
videoWindow.Owner = videoPanel.Handle.ToInt32();

Вот ошибка:

Первое исключение типа "System.UnauthorizedAccessException" возникло в Microsoft.Lync.Model.dll System.UnauthorizedAccessException: доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)) в Microsoft.Office.Uc.VideoWindowClass.set_Owner(владелец Int32) в Microsoft.Lync.Model.Conversation.AudioVideo.VideoWindow.set_Owner(значение Int32) в панели AudioVideoConvers.ShowConideoConverse.Converse.Converse (окно AudioVideoConvers.Converse.Converse.Converse.Converse.Converse.Converse.Converse.Converse.Converse.Converse.Converse.Converse.Converse.Converse.Converse.Converse). videoPanel, VideoWindow videoWindow) в c:\Program Files (x86)\Microsoft Office 2013\LyncSDK\samples\AudioVideoConversation\Conversation\ConversationWindow.cs: строка 1128

Ссылки: UISuppression Видео Проблемы

Разъяснение от команды разработчиков Lync API: Исключение неавторизованного доступа (или COM), которое вы можете получить при назначении дескриптора владельца для VideoWindow, разрешается путем копирования примера проекта из папки \Program Files(x86)... в папка пользователя. Скомпилируйте и запустите проект в папке пользователя, и вы не получите исключение.

Другие вопросы по тегам