Я занимаюсь разработкой приложения C # WPF с использованием OSSBuild и gstreamersharp. Я использую XOverlayAdapter для отображения видео на размещенном элементе управления WindowsForms, к которому у меня есть дескриптор Windows. Все работает хорошо, за исключением ситуации, когда я устанавливаю состояние playbin2 в NULL или READY. Это именно то, что я делаю (я снял все проверки, если элементы были созданы правильно):
Создать 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);
Создание видеотяги
Gst.Video.VideoSink videoSink =
Gst.ElementFactory.Make("dshowvideosink") as Gst.Video.VideoSink;
videoSink["force-aspect-ratio"] = true;
Свяжите видеомагнитофон с элементом управления WindowsForms (экраном) для отображения видео в прямоугольной области в моем окне WPF.
Gst.Interfaces.XOverlayAdapter overlayAdapter =
new Gst.Interfaces.XOverlayAdapter(videoSink.Handle);
overlayAdapter.XwindowId = (ulong)screen.Handle;
Прикрепите видеомагнитофон к плейбину
playBin.VideoSink = videoSink;
Установить URI playbin для некоторого видео файла на моем жестком диске
playBin.SetState(Gst.State.Ready);
playBin.Uri = @"file:///" + fileName.Replace('\\', '/');
playBin.SetState(Gst.State.Paused);
Теперь я могу воспроизводить и приостанавливать видео, изменяя состояние воспроизведения
playBin.SetState(Gst.State.Playing);
playBin.SetState(Gst.State.Paused);
Пока все хорошо, все работает гладко, я могу воспроизводить, приостанавливать, искать видео, отображаемое в прямоугольной области в моем окне. Проблемы начинаются, когда я пытаюсь воспроизвести другой видеофайл. В соответствии со всеми руководствами, найденными в сети, я должен установить состояние конвейера в NULL или READY перед изменением URI:
Открыть другой видеофайл
playBin.SetState(Gst.State.Ready);
playBin.Uri = @"file:///" + newFileName.Replace('\\', '/');
playBin.SetState(Gst.State.Playing);
К сожалению, это приводит к тому, что прямоугольная область в моем окне становится черной, а отдельное окно создается GStreamer. Это не имеет ничего общего с изменением URI, это установка состояния воспроизведения на NULL или READY, который отключает видеовыход от наложения. Что я делаю не так?