Всем привет!
Я использую старую веб камеру, чтобы сделать видеонаблюдение за входной дверью. Камера с микрофоном подключена к Raspberry Pi по USB, на котором пишеться видео со звуком с помощью следующего pipeline Gstreamer:
gst-launch-1.0 -e v4l2src do-timestamp=true \
! video/x-raw,format=YV12,width=640,height=480,framerate=5/1 \
! videoconvert ! queue ! videorate ! videoflip method=clockwise \
! clockoverlay halignment=left valignment=bottom time-format="%Y/%m/%d %H:%M:%S" font-desc="Sans 24" \
! omxh264enc target-bitrate=400000 control-rate=variable \
! video/x-h264,stream-format=byte-stream,framerate=5/1 ! h264parse \
! queue ! mux. alsasrc device=plughw:0,0 do-timestamp=true \
! lamemp3enc target=0 bitrate=128 mono=true \
! queue leaky=2 max-size-buffers=0 max-size-time=0 max-size-bytes=0 \
! mux. matroskamux name=mux ! queue \
! filesink location=camera`date -Iseconds`.mkv >> recorder.log 2>&1
Использую Gstreamer из-за аппаратного кодирования (omxh264enc), чтобы не перегружать процессор малины. В Gstreamer только начал разбираться, советы по pipeline-у приветствуются. Pipeline запущен в бесконечном цикле, по крону перезапускаю его раз в час, чтобы начать новый файл. Всё работает, но есть следующие проблемы, по которым и хочу спросить совета.
Проблемы с контейнерами. Я так и не смог выбрать подходящий контейнер для видео. Сейчас видео сохраняется в
mkv, проблема в том, что первый кадр всегда зелёный, и зелень продолжается первые 10 секунд видео, ЧЯДНТ? Также видео довольно туго проигрывается, при перемотке на середину файла сначала включается звук, а потом видео "догоняет" через несколько секунд. Как это исправить? Наверное, это как-то связно с ключевыми кадрами, но я в этом плохо разбираюсь.
Пробовал писать в
mp4, но в этом контейнере индекс в конце файла, то есть при аварийном завершении записи получаем поврежденный файл, который не проигрывается.
Ещё пробовал писать в
avi, но опять же есть проблема с первым кадром (изображение как бы смещено на половину вверх) и присутствует сильная рассинхронизация аудио и видео, после окончания часового видео, остаётся секунд 20 звука, который воспроизводиться на застывшем последнем кадре. Я не придумал как это исправить.
Периодическое шипение вместо звука. На записях периодически есть шипение перекрывающее звук, которое само пропадает через случайные промежутки времени, и нормальный звук возвращается. Как это исправить? Это из-за leaky queue?
Странные ошибки в dmesg. Появляются в разных комбинациях при записи, очень много повторяются
cannot get freq at ep 0x86. Не смог понять из-за чего они, и связаны ли они с вышеуказанными проблемами.
usb 1-1.5: 1:1: cannot get freq at ep 0x5
usb 1-1.5: 1:1: cannot set freq 48000 to ep 0x5
usb 1-1.5: 2:1: cannot get freq at ep 0x86
usb 1-1.5: 2:1: cannot set freq 48000 to ep 0x86
uvcvideo: Failed to resubmit video URB (-1).
PS: GStreamer 1.4.4 из репозиториев, Raspbian Jessie.
PPS: пытался использовать motion и писать только при обнаружении движения, но на Raspberry Pi приемлемый фреймрейт получается только при низком разрешении, и в добавок Raspberry Pi перегревается при длительных периодах с движением.