Gstreamer зависает при генерации таймлапса из JPEG на Raspberry Pi

Ситуация:

Я хочу создать таймлапс на моем Raspberry Pi 512 МБ, используя встроенный кодировщик H.264.

Вход: +300 файлов JPEG (2592 x 1944 пикселей), пример: http://i.imgur.com/czohiki.jpg

Выход: видеофайл h264 (2592 x 1944 пикселей)

GStreamer 1.0.8 + omxencoder (http://pastebin.com/u8T7mE18)

Версия Raspberry Pi: 17 июня 2013 г. 20:45:38 версия d380dde43fe729f043befb5cf775f99e54586cde (чистая) (выпуск)

Память: gpu_mem_512 = 400

Конвейер Gstreamer:

sudo gst-launch-1.0 -v multifilesrc location = GOPR% 04d.JPG start-index = 4711 stop-index = 4750 caps = "image / jpeg, framerate = (дробь) 25/1" do-timestamp = true! omxmjpegdec! видеорейт! видео / x-raw, частота кадров = 1/5! видеоконвертировать! omxh264enc! "video / x-h264, profile = high"! h264parse! max-size-bytes очереди = 10000000! матроскамукс! расположение файловой ссылки = test.mkv --gst-debug = 4

Проблема: Gstreamer зависает, и вывод не выводится.

--gst-debug = 4:

0: 00: 01.027331700 2422 0x17824f0 INFO GST_EVENT gstevent.c: 709: gst_event_new_segment: создание сегмента события time segment start = 0: 00: 00.000000000, stop = 99: 99: 99.999999999, rate = 1.000000, apply_rate = 1.000000, flags = 0x00 время = 0: 00: 00.000000000, база = 0: 00: 00.000000000, позиция 0: 00: 00.000000000, продолжительность 99: 99: 99.999999999

0: 00: 29.346875982 2422 0x17824f0 INFO baserc gstbasesrc.c: 2619: gst_base_src_loop: пауза после gst_base_src_get_range () = eos

--gst-debug = 5:

0: 01: 16.089222125 2232 0x1fa8f0 ОТЛАДКА baserc gstbasesrc.c: 2773: gst_base_src_loop: приостановка задачи, причина eos

0: 01: 16.095962979 2232 0x1fa8f0 ОТЛАДКА GST_PADS gstpad.c: 5251: gst_pad_pause_task: приостановить задачу

0: 01: 16.107724723 2232 0x1fa8f0 Задача DEBUG gsttask.c: 662: gst_task_set_state: Изменение задачи 0x2180a8 на состояние 2

0: 01: 16.435800597 2232 0x1fa8f0 ОТЛАДКА GST_EVENT gstevent.c: 300: gst_event_new_custom: создание нового события 0x129f80 eos 28174

0: 01: 16.436191588 2232 0x1fa8f0 ОТЛАДКА GST_PADS gstpad.c: 4628: gst_pad_push_event: событие eos обновлено

0: 01: 16.436414584 2232 0x1fa8f0 ОТЛАДКА GST_PADS gstpad.c: 3333: check_sticky: отправка всех прикрепленных событий

0: 01: 16.436620579 2232 0x1fa8f0 ОТЛАДКА GST_PADS gstpad.c: 3282: push_sticky: начало потока событий уже получено

0: 01: 16.436816575 2232 0x1fa8f0 ОТЛАДКА GST_PADS gstpad.c: 3282: push_sticky: заголовки событий уже получены

0: 01: 16.437001571 2232 0x1fa8f0 ОТЛАДКА GST_PADS gstpad.c: 3282: push_sticky: сегмент события уже получен

0: 01: 16.440457495 2232 0x1fa8f0 ОТЛАДКА GST_EVENT gstpad.c: 4771: gst_pad_send_event_unchecked: иметь тип события eos event в момент времени 99: 99: 99.999999999: (NULL)

0: 01: 16.449986289 2232 0x1fa8f0 Видеодекодер DEBUG gstvideodecoder.c: 1144: gst_video_decoder_sink_event: получено событие 28174, eos

0: 01: 16.462165024 2232 0x1fa8f0 ОТЛАДКА omxvideodec gstomxvideodec.c: 2489: gst_omx_video_dec_drain: Сливной компонент

0: 01: 16.463930986 2232 0x1fa8f0 ОТЛАДКА omx gstomx.c: 1223: gst_omx_port_acquire_buffer: получение буфера video_decode из порта 130

0: 01: 16.465537951 2232 0x1fa8f0 ОТЛАДКА omx gstomx.c: 1334: gst_omx_port_acquire_buffer: video_decode порт 130 имеет ожидающие буферы

0: 01: 16.466576928 2232 0x1fa8f0 ОТЛАДКА omx gstomx.c: 1353: gst_omx_port_acquire_buffer: Полученный буфер 0x21f938 (0xb2068550) из порта video_decode 130: 0

0: 01: 16.468237892 2232 0x1fa8f0 ОТЛАДКА omx gstomx.c: 1375: gst_omx_port_release_buffer: Освобождение буфера 0x21f938 (0xb2068550) для порта video_decode 130

0: 01: 16.470360846 2232 0x1fa8f0 ОТЛАДКА omx gstomx.c: 1420: gst_omx_port_release_buffer: освобожденный буфер 0x21f938 для порта video_decode 130: Нет (0x00000000)

0: 01: 16.472046809 2232 0x1fa8f0 ОТЛАДКА omxvideodec gstomxvideodec.c: 2544: gst_omx_video_dec_drain: Ожидание слива компонента

Полный дамп консоли: https://mega.co.nz/#!eI1ASBSY!R4mnuGqRH7M8dT4q6j03mBKsQ1A-7oCXU4stu50LnOw

Вопрос:

  1. Что я делаю неправильно?

  2. Есть ли другой или более эффективный способ создания таймлапсов с высоким разрешением из JPEG на Raspberry Pi?


person MeProtozoan    schedule 14.08.2013    source источник


Ответы (2)


Извините за некро, но я думаю, что это попытка использовать кодировщик Raspberry Pi HW H264 с более высоким разрешением, чем он способен. Он может обрабатывать чуть более 1080p30 и имеет максимальную длину строки 2048 пикселей, поэтому ваши исходные изображения слишком велики.

Вы можете попробовать MJPEG, у которого нет такого же ограничения.

person James Hughes    schedule 23.09.2015

У меня сейчас нет Pi для тестирования, но я подозреваю, что одна из возможных проблем заключается в том, что у вас есть два элемента OMX в одном процессе. GStreamer просто обертывает OMX и IIRC, OMX API на самом деле не хочет, чтобы вы запускали две вещи одновременно, особенно в одном процессе ...

Я бы попробовал это с помощью jpegdec вместо omxmjpegdec, с конвейером, более похожим на эти строки:

gst-launch-1.0 multifilesrc location = "GOPR% 04d.JPG" start-index = 4711 stop-index = 4750! изображение / JPEG, частота кадров = 1/5! jpegdec! видеоконвертировать! omxh264enc! h264parse! матроскамукс! расположение файловой ссылки = test.mkv

Я не думаю, что есть смысл использовать элементы очереди на Pi.

person mpr    schedule 21.10.2014