Отправка конвейера EOS gstreamer

У меня есть пример конвейера gstreamer: gst-launch-1.0 v4l2src device=/dev/video2 ! image/jpeg,width=1280, height=800, framerate=30/1 ! v4l2jpegdec ! queue ! v4l2h264enc extra-controls = "controls, h264_profile=4, video_bitrate=620000" ! 'video/x-h264, profile=high, level=(string)4' ! h264parse ! matroskamux ! filesink location=output2.mkv

Что я запускаю его из командной строки. Вместо того, чтобы нажимать ctrl+c для завершения процесса, я хочу отправить ему событие EOS.

Это возможно? И если да, то кто-нибудь делал или какое решение?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из --help вывода gst-launch-1.0:

  -e, --eos-on-shutdown             Force EOS on sources before shutting the pipeline down

Конечно, но одного аргумента в начале достаточно? Я думаю, что это вступает в силу, когда я говорю ему остановить процесс.

José Vicente R 08.02.2023 19:18

Я отправлял «kill pid» вместо «kill -SIGINT pid», теперь это работает для меня, спасибо.

José Vicente R 09.02.2023 00:17
Ответ принят как подходящий

Вы можете сделать приложение, которое заботится о событиях EOS.

Вы можете попробовать этот пример, написанный на Python.

Депс.

sudo apt install python3-gst-1.0

Пример Python3:

import threading
import time

import gi
gi.require_version('Gst', '1.0')
gi.require_version('GLib', '2.0')
from gi.repository import Gst
from gi.repository import GLib


class Something(RuntimeError):
    pass


class GStreamer():
    def __init__(self):
        Gst.init(None)

        self.desc = "videotestsrc is-live=true ! appsink"
        self.pipe_obj = None

        self.sleep = 20

    def create_pipeline(self):
        try:
            self.pipe_obj = Gst.parse_launch(self.desc)
        except:
            raise Something("Unable to create pipe object")
    def play_pipeline(self):
        ret = self.pipe_obj.set_state(Gst.State.PLAYING)
        if ret == Gst.StateChangeReturn.FAILURE:
            raise Something("Unable to play pipeline")

    def signal_handler(self):
        appsink = self.pipe_obj.get_by_name("appsink0")
        appsink.connect("eos", self.signal_handler_callback, appsink)

    def signal_handler_callback(self):
        threading.Thread(target=self._counter_thread).start()
        time.sleep(self.sleep)

    def _counter_thread(self):
        for i in range(1, self.sleep + 1):
            time.sleep(1)
            print (i)

gstreamer_instance = GStreamer()
gstreamer_instance.create_pipeline()
gstreamer_instance.play_pipeline()

print ("Started signal handler with timed out EOS to ", gstreamer_instance.sleep)
gstreamer_instance.signal_handler()
gstreamer_instance.signal_handler_callback()

Gst.init(None)

Где appsink поддерживает события EOS Signal, вы можете проверить это с помощью gst-inspect-1.0 appsink. Вы можете обновить описание конвейера, чтобы оно соответствовало вашему, и выполнить некоторые манипуляции для записи в выходной файл, возможно, используя элемент AppSrc в новом экземпляре конвейера, чтобы он извлекал и сохранял буферы.

# Your first instance would be:
gst-launch-1.0 v4l2src device=/dev/video2 ! image/jpeg,width=1280, height=800, framerate=30/1 ! v4l2jpegdec ! queue ! v4l2h264enc extra-controls = "controls, h264_profile=4, video_bitrate=620000" ! 'video/x-h264, profile=high, level=(string)4' ! h264parse ! matroskamux ! appsink emit-signals=true

# Your receiver instance would be something similar to:
appsrc ! filesink location=output2.mkv

Надеюсь, вы получили представление о том, как управлять событиями в процессе конвейера GSt, используя сигналы элементов и этот пример.


РЕДАКТИРОВАТЬ

Подходит только для терминала.

Использование только консоли возможно путем отправки правильного сигнала в процесс.

Здесь у вас есть конвейерный процесс, например:

gst-launch-1.0 -e  videotestsrc ! fakesink

Затем с другого терминала вы захотите отправить прерывание от стандартного сигнала клавиатуры, то есть: SIGINT (эквивалент вашего текущего Ctrl + C) для вашего gst-launch-1.0 процесса.

kill -s SIGINT $(pidof gst-launch-1.0)

Это сделает работу. Попробуйте!

Но я не могу использовать python, только через командную консоль.

José Vicente R 08.02.2023 19:02

Взгляните на отредактированное решение, где вы можете узнать, как отправить EOS в конвейер GStreamer с помощью командной строки.

Daniel Chaves 08.02.2023 22:16

Да, вы правы, на моей стороне я убивал без сигнала прерывания, поэтому у меня это не сработало, спасибо.

José Vicente R 09.02.2023 00:15

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