GStreamer XOverlay потерян после установки состояния воспроизведения в NULL или READY - PullRequest
2 голосов
/ 28 ноября 2011

Я занимаюсь разработкой приложения C # WPF с использованием OSSBuild и gstreamersharp. Я использую XOverlayAdapter для отображения видео на размещенном элементе управления WindowsForms, к которому у меня есть дескриптор Windows. Все работает хорошо, за исключением ситуации, когда я устанавливаю состояние playbin2 в NULL или READY. Это именно то, что я делаю (я снял все проверки, если элементы были созданы правильно):

  1. Создать playbin

    Gst.BasePlugins.PlayBin2 playBin = new Gst.BasePlugins.PlayBin2();
    playBin.PlayFlags &= ~((Gst.BasePlugins.PlayBin2.PlayFlagsType)(1 << 2));
    playBin.Bus.AddSignalWatch();
    playBin.Bus.EnableSyncMessageEmission();
    playBin.Bus.Message += new Gst.MessageHandler(OnPlayBinMessage);
    
  2. Создание видеотяги

    Gst.Video.VideoSink videoSink = 
        Gst.ElementFactory.Make("dshowvideosink") as Gst.Video.VideoSink;
    videoSink["force-aspect-ratio"] = true;
    
  3. Свяжите видеомагнитофон с элементом управления WindowsForms (экраном) для отображения видео в прямоугольной области в моем окне WPF.

    Gst.Interfaces.XOverlayAdapter overlayAdapter =
        new Gst.Interfaces.XOverlayAdapter(videoSink.Handle);
    overlayAdapter.XwindowId = (ulong)screen.Handle;
    
  4. Прикрепите видеомагнитофон к плейбину

    playBin.VideoSink = videoSink;
    
  5. Установить URI playbin для некоторого видео файла на моем жестком диске

    playBin.SetState(Gst.State.Ready);
    playBin.Uri = @"file:///" + fileName.Replace('\\', '/');
    playBin.SetState(Gst.State.Paused);
    
  6. Теперь я могу воспроизводить и приостанавливать видео, изменяя состояние воспроизведения

    playBin.SetState(Gst.State.Playing);
    playBin.SetState(Gst.State.Paused);
    

    Пока все хорошо, все работает гладко, я могу воспроизводить, приостанавливать, искать видео, отображаемое в прямоугольной области в моем окне. Проблемы начинаются, когда я пытаюсь воспроизвести другой видеофайл. В соответствии со всеми руководствами, найденными в сети, я должен установить состояние конвейера в NULL или READY перед изменением URI:

  7. Открыть другой видеофайл

    playBin.SetState(Gst.State.Ready);
    playBin.Uri = @"file:///" + newFileName.Replace('\\', '/');
    playBin.SetState(Gst.State.Playing);
    

К сожалению, это приводит к тому, что прямоугольная область в моем окне становится черной, а отдельное окно создается GStreamer. Это не имеет ничего общего с изменением URI, это установка состояния воспроизведения на NULL или READY, который отключает видеовыход от наложения. Что я делаю не так?

1 Ответ

0 голосов
/ 29 ноября 2011

Решение состоит в том, чтобы предотвратить изменение состояния видеосигнала. Благодарим Стефана Зауэра из списка рассылки gstreamer-devel.

playBin.VideoSink.SetLockedState(true);
playBin.SetState(Gst.State.Ready);
playBin.Uri = @"file:///" + newFileName.Replace('\\', '/');
playBin.SetState(Gst.State.Paused);
playBin.VideoSink.SetLockedState(false);
...