@Dima_kras

Как записать поток видео gstreamer в файл?

Добрый день, с gstreamer столкнулся в первый раз, есть поток с камеры, например могу записать его в файл:

gst-launch-1.0 nvarguscamerasrc num-buffers=1200 gainrange="1 1" ispdigitalgainrange="2 2" ! 'video/x-raw(memory:NVMM),width=1280, height=720, framerate=120/1, format=NV12' ! omxh264enc ! qtmux ! filesink location=test.mp4 -e

На выходе будет 10 секундный ролик с частотой 120 кадров в секунду. Все классно, но хочется управлять стартом остановкой записи.

Пробую реализовать это на Python:

def gstreamer():
    return ('nvarguscamerasrc gainrange="1 1" ispdigitalgainrange="2 2" ! '
            'video/x-raw(memory:NVMM), '
            'width=1280, height=720, '
            'format=(string)NV12, framerate=120/1 ! '
            'nvvidconv flip-method=0 ! '
            'video/x-raw, width=1280, height=720, format=(string)BGRx ! '
            'videoconvert ! '
            'video/x-raw, format=(string)BGR ! appsink')

cap = cv2.VideoCapture(gstreamer(), cv2.CAP_GSTREAMER)
fourcc = cv2.VideoWriter_fourcc(*"X264")
writer = cv2.VideoWriter("out/{}".format(name), fourcc, 30, (1280, 720), True)
if cap.isOpened():
    for i in range(1200):
        ret_val, img = cap.read()
        writer.write(img)
writer.release()
cap.release()

Но Python не успевает жать в H264. Я вижу такое решение, взять поток
nvarguscamerasrc num-buffers=1200 gainrange="1 1" ispdigitalgainrange="2 2" ! 'video/x-raw(memory:NVMM),width=1280, height=720, framerate=120/1, format=NV12' ! omxh264enc ! qtmux !

Переадресовать его с помощью appsink также в Python, и когда нужно - писать или не писать.
Вопрос как записать заголовочные файлы, чтобы из потока получился видео файл?
  • Вопрос задан
  • 1282 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Dima_kras Автор вопроса
Разобрался, вдруг кому пригодится:

import gi
import sys
from gi.repository import Gst, GObject

Gst.init(sys.argv)
pipeline = Gst.parse_launch(
    'nvarguscamerasrc gainrange="1 1" ispdigitalgainrange="2 2" ! '
    'video/x-raw(memory:NVMM),width=1280, height=720, framerate=120/1, format=NV12 ! '
    'omxh264enc ! qtmux ! filesink location=out/file1.mp4')
pipeline.set_state(Gst.State.PLAYING)
time.sleep(2)
pipeline.send_event(Gst.Event.new_eos())
pipeline.set_state(Gst.State.NULL)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы