Как представить видеопоток GSTREAMER в элемент WPF (например, изображение) с использованием AppSink?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как представить видеопоток GSTREAMER в элемент WPF (например, изображение) с использованием AppSink?

Сообщение Anonymous »

Я использую C# (.net 7) и GSTREAMER для обработки потока RTSP и привести видео в элемент WPF Image . Я стремлюсь использовать appsink для обработки видео кадров. Ниже приведено определение трубопровода, которое я использую:

Код: Выделить всё

string pipelineDescription = $"rtspsrc location={rtspUrl} ! decodebin ! videoconvert ! video/x-raw,format=RGB ! appsink name=mysink";

Трубовид успешно инициализируется, и когда я перечисляю элементы, используя listpipelineelements , я вижу, что MySink существует. Однако, когда я пытаюсь извлечь элемент Mysink с помощью getChildbyName («mysink») или вручную итерацию по элементам трубопровода с помощью epteratelements , элемент mysink распознается как общий элемент, а не appsink . Это приводит к следующей ошибке во время литья типа:

Код: Выделить всё

System.InvalidCastException: Unable to cast object of type 'Gst.Element' to type 'Gst.App.AppSink'

Я использовал следующий метод для перечисления элементов трубопровода:

Код: Выделить всё

private void ListPipelineElements(Pipeline pipeline)
{
System.Diagnostics.Debug.WriteLine("Pipeline elements:");
foreach (var obj in pipeline.IterateElements())
{
if (obj is Element element)
{
System.Diagnostics.Debug.WriteLine($" - Element Name: {element.Name}, Type: {element.GetType().Name}");
}
else
{
System.Diagnostics.Debug.WriteLine("Unknown element type found.");
}
}
}
< /code>
[b] output: < /strong>
Успешно инициализированная трубопровод. Element < /li>
[*] Имя элемента: decodebin0, type: bin < /li>
 Имя элемента: rtspsrc0, тип: bin
Проверенный элемент: capsfilter0
Проверенный элемент: mysink
element 'mysink' не является приложением, тип: element
clected0 letlement: vide oconte -lement0: vide oconted0 letlement: vide oconted0 letlement: vide oconted0 lement: wide /vide oconted0 lement: wide /vide oconted0 letle: vide /lecture. decodebin0
Checked element: rtspsrc0
Could not find 'mysink' as an AppSink in the pipeline.

Attempts:[/b]
[list]
[*]Retrieving Element from Pipeline:
[/list]
[list]
[*]Used [b]GetChildByName("mysink")[/b], but it was detected as a generic [b]Element[/b].
[/list]
[list]
[*]Listing Pipeline Elements:
[/list]
[list]
[*]Used [b] itatereelements () [/b] для вручную перечислять элементы трубопровода и подтвердить, что [b] mysink [/b] присутствовал, но обнаруживается как [b] element [/b].
[/list]
[list]
[*] Тип:
[/list]
var appSink = (AppSink)sinkElement;< /code>
привел к:
 system.invalidcastexception
< /ul>
[list]
[*] Конвейер: < /li>
< /ul>
var appSink = new AppSink("mysink");
_pipeline.Add(appSink);
< /code>
Хотя это позволило определить элемент, динамическое соединение в трубопроводе не удалось.string pipelineDescription = "videotestsrc ! videoconvert ! video/x-raw,format=RGB ! appsink name=mysink";
Faced the same type casting issue with AppSink.


[*]Rendering Video to WPF Image:
[/list]
  • Attempted to update the Image control with Данные кадров GSTREAMER: < /li>
    < /ul>

    Код: Выделить всё

    private void UpdateBGImage(int width, int height, IntPtr data)
    {
    int size = width * height * 4;
    int stride = ((width * 32 + 31) & ~31) / 8;
    
    this.Dispatcher.Invoke(() =>
    {
    BitmapSource source = BitmapSource.Create(width, height, 96, 96, PixelFormats.Bgra32, null, data, size, stride);
    BGImage.Source = source;
    this.InvalidateVisual();
    });
    }
    
    Однако управление не обновлялось. /> Фадмы процессов с использованием appsink и обновление wpf image контроля.
Что случилось:


  • < /ul>
    • Рабочий пример с формами Windows:
      Следующий трубопровод, обработанный в проекте Windows Forms:

      Код: Выделить всё

      rtspsrc location=rtsp://127.0.0.1:8554/mystream latency=300 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
      However, I need this to work in WPF with .NET 7.
    My Questions:

    How can I retrieve the AppSink element from a GStreamer pipeline in C#? Если да, то какова рекомендуемое связывание GSTREAMER для .NET 7?>

    Подробнее здесь: https://stackoverflow.com/questions/793 ... ing-appsin
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Конвейер GStreamer: декодирование H.264 из Appsrc в Appsink
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Конвейер GStreamer: декодирование H.264 из Appsrc в Appsink
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Внедрить изображение в видеопоток GStreamer с помощью appsrc
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • RTSP -поток на WPF с использованием GSTREAMER
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Видеопоток в приложении React с использованием objectFit: содержит пробелы, но обложка слишком сильно увеличивает масшта
    Anonymous » » в форуме CSS
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»