Jump to content

Recommended Posts

Posted (edited)

Имеется IP камера видео наблюдения, отдающая поток по rtsp в h.264. Есть ли возможность при записи этого потока на винчестер средствами VLC наложить на картинку дату и время? И если есть, то как? На Wiki VLC не нашел ничего полезного.

Точнее нашел, как я думал сначала, субфильтр marq, который способен наложить timestamp при проигрывании и вещании, но при записи в файл наложение не сохраняется.

Edited by Dimic
Posted

Как выяснилось VLC не умеет записывать наложенный на видео текст. Начал копать в сторону ffmpeg и его API libavfilter, который в своем арсенале имеет фильтр drawtext, умеющий накладывать дату и время на видео (и не только, кстати говоря). И тут столкнулся с первым подводным камнем - ffmpeg никак не захотел подхватывать rtsp поток с камеры. Далее в интернетах нашел пример как это сделать при помощи openRTSP. Получилась следующая конструкция:

openRTSP -v -c -w 1280 -h 720 -f 25 -b 1000000 -t rtsp://10.2.14.28:554/live/ch00_0 | ffmpeg -debug 1 -r 5 -s 1280x720 -i - -y -vcodec copy -f mp4 record.mp4

Опять проблема - видео с камеры вещается с размерами кадра 1280x720, но ffmpeg почему-то отрезает от него кусок 352x240. Определение размера кадра явно(выше)ничего не дало, как и увеличение буфера (-b 1000000, по умолчанию 100000). Хотя может так отдает его openRTSP?

Вот что пишет ffmpeg:

Seems stream 0 codec frame rate differs from container frame rate: 10.00 (10/1) -> 5.00 (10/2)

Input #0, h264, from 'pipe:':

Duration: N/A, bitrate: N/A

Stream #0.0, 27, 1/1200000: Video: h264, yuv420p, 352x240, 1/10, 5 fps, 5 tbr, 1200k tbn, 10 tbc

Output #0, mp4, to 'record.mp4':

Metadata:

encoder : Lavf52.64.2

Stream #0.0, 0, 1/10: Video: libx264, yuv420p, 352x240, 1/5, q=2-31, 10 tbn, 5 tbc

Stream mapping:

Stream #0.0 -> #0.0

Копаем дальшее..

Так же смущает ругань ffmpeg:

[h264 @ 0x29507810]Missing reference picture

[h264 @ 0x29507810]decode_slice_header error

Posted

А почему бы не использовать готовые решения для видеорегистрации, а не изобретать велосипед? Тот же бесплатный zoneminder вполне неплох.

Posted

А почему бы не использовать готовые решения для видеорегистрации, а не изобретать велосипед? Тот же бесплатный zoneminder вполне неплох.

Уж не знаю, чего они там за последнее время напридумывали, но пару лет назад он был вполне плох.

Posted (edited)

Уж не знаю, чего они там за последнее время напридумывали, но пару лет назад он был вполне плох.

У меня уже работает давно. Одну камеру пишет без проблем. Все основные функции работают на ура — запись, поиск, перемотка, детектор движения, оповещения, автоматическое удаление старых записей. Таймстамп, так нужный топикстартеру, тоже работает. Интерфейс конечно не очень красивый и с первого взгляда он мне тоже не очень понравился, но стоило пару дней попользоваться и вникнуть — все что нужно было мне лично я нашел и вполне доволен, да ещё и за бесплатно.

Edited by alexmern
Posted

Уж не знаю, чего они там за последнее время напридумывали, но пару лет назад он был вполне плох.

У меня уже работает давно. Одну камеру пишет без проблем.

Понятно.

Posted (edited)

А почему бы не использовать готовые решения для видеорегистрации, а не изобретать велосипед? Тот же бесплатный zoneminder вполне неплох.

ZM ставил, как-то с ним не заладилось, отложил на потом

читайте доки. они - рулез.

Ок. Благодарю за наводку. Видео пишет:

gst-launch-0.10 -e rtspsrc location="rtsp://10.2.14.18:554/live/ch00_0" latency=100 ! rtph264depay byte-stream=false \
! capsfilter caps="video/x-h264,width=1280,height=720,framerate=(fraction)25/1" \
! mp4mux ! filesink location=video1.mp4

Осталось найти, как накладывать дату/время

Edited by Dimic
Posted (edited)

Итак, следуя докам получилось следующее:

gst-launch-0.10 -e rtspsrc location="rtsp://10.4.10.34:554/live/ch00_0" latency=100 ! rtph264depay byte-stream=false \
! ffdec_h264 ! clockoverlay ! x264enc \
! queue ! mp4mux ! filesink location=test100501.mp4

Здесь опишу подробнее. После получения rtp потока, плагин rtph264depay извлекает из rtp пакетов видео x-h264, то есть имеем на входе x-rtp, получаем на выходе x-h264. Опция byte-stream здесь отключена, по скольку мне не требуется передавать видео по сети. Далее плагином ffdec_h264 x-h264 обрабатывается, и на выходе имеем доступный к наложению текста формат x-raw. Плагин clockoverlay накладывает время, x264 обратно преобразует x-raw в x-h264, и в завершении видео помещается в контейнер mp4 и пишется в файл. Вроде как, все логично, но ничего не происходит. Gstreamer ошибок не выдает, размер файла получается мизерным, ничем не открывается.

Где я не прав?

 

UPD: Пардон. Поторопился. Все нормально. Просто машина слабая, нужно было дождаться пока видео перекодируется в x-h264.

Edited by Dimic
Posted (edited)

Появилась возможность попробовать запустить запись на более сильной машине, но теперь уже проблемы возникли с самим gstreamer'ом. Не хочет подключаться плагин ffdec_h264. Выдает такую ошибку:

gst-inspect-0.10 ffdec_h264

(gst-plugin-scanner:32140): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-0.10/libgstffmpeg.so': /usr/local/lib/gstreamer-0.10/libgstffmpeg.so: Undefined symbol "ff_mlp_init_x86"
No such element or plugin 'ffdec_h264'

Не особо желая разбираться, из за чего это происходит, рекурсивно обновил необходимые порты, поправил/почистил зависимости. Ничего не изменилось.

 

дамп библиотеки

objdump -T /usr/local/lib/gstreamer-0.10/libgstffmpeg.so |grep mlp_init

выдал, что символ действительно не определен

00000000      D  *UND*  00000000              ff_mlp_init_x86
002b9390 g    DF .text  00000034  Base        ff_mlp_init
0049dcb0 g    DF .text  000000b6  Base        ff_mlp_init_crc

решил сравнить зависимости библиотеки на этой машине и на предыдущей, на которой все работало

ldd /usr/local/lib/gstreamer-0.10/libgstffmpeg.so

на текущей:

/usr/local/lib/gstreamer-0.10/libgstffmpeg.so:
       libgstaudio-0.10.so.0 => /usr/local/lib/libgstaudio-0.10.so.0 (0x28189000)
       libgstinterfaces-0.10.so.0 => /usr/local/lib/libgstinterfaces-0.10.so.0 (0x281ab000)
       libgstpbutils-0.10.so.0 => /usr/local/lib/libgstpbutils-0.10.so.0 (0x281b9000)
       libgstvideo-0.10.so.0 => /usr/local/lib/libgstvideo-0.10.so.0 (0x281d7000)
       libgstbase-0.10.so.0 => /usr/local/lib/libgstbase-0.10.so.0 (0x28e7b000)
       libgstreamer-0.10.so.0 => /usr/local/lib/libgstreamer-0.10.so.0 (0x28ece000)
       libgobject-2.0.so.0 => /usr/local/lib/libgobject-2.0.so.0 (0x28f9a000)
       libgmodule-2.0.so.0 => /usr/local/lib/libgmodule-2.0.so.0 (0x281e3000)
       libxml2.so.5 => /usr/local/lib/libxml2.so.5 (0x28fde000)
       libgthread-2.0.so.0 => /usr/local/lib/libgthread-2.0.so.0 (0x281e7000)
       libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0 (0x29108000)
       libintl.so.9 => /usr/local/lib/libintl.so.9 (0x281ec000)
       libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x291e0000)
       libpcre.so.1 => /usr/local/lib/libpcre.so.1 (0x292d6000)
       libm.so.5 => /lib/libm.so.5 (0x2932e000)
       libz.so.4 => /lib/libz.so.4 (0x29343000)
       libbz2.so.3 => /usr/lib/libbz2.so.3 (0x29355000)
       libthr.so.3 => /lib/libthr.so.3 (0x29366000)
       libc.so.7 => /lib/libc.so.7 (0x28083000)

на рабочей:

/usr/local/lib/gstreamer-0.10/libgstffmpeg.so:
       libgstaudio-0.10.so.24 => /usr/local/lib/libgstaudio-0.10.so.24 (0x2818a000)
       libgstinterfaces-0.10.so.24 => /usr/local/lib/libgstinterfaces-0.10.so.24 (0x281ac000)
       libgstpbutils-0.10.so.24 => /usr/local/lib/libgstpbutils-0.10.so.24 (0x281ba000)
       libgstvideo-0.10.so.24 => /usr/local/lib/libgstvideo-0.10.so.24 (0x281d8000)
       libgstbase-0.10.so.0 => /usr/local/lib/libgstbase-0.10.so.0 (0x28e7b000)
       libgstreamer-0.10.so.0 => /usr/local/lib/libgstreamer-0.10.so.0 (0x28ece000)
       libgobject-2.0.so.0 => /usr/local/lib/libgobject-2.0.so.0 (0x28f9a000)
       libgmodule-2.0.so.0 => /usr/local/lib/libgmodule-2.0.so.0 (0x281ed000)
       libxml2.so.5 => /usr/local/lib/libxml2.so.5 (0x28fde000)
       libgthread-2.0.so.0 => /usr/local/lib/libgthread-2.0.so.0 (0x281f1000)
       libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0 (0x29108000)
       libintl.so.9 => /usr/local/lib/libintl.so.9 (0x281f6000)
       libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x291e0000)
       libpcre.so.1 => /usr/local/lib/libpcre.so.1 (0x292d6000)
       libm.so.5 => /lib/libm.so.5 (0x2932e000)
       libz.so.4 => /lib/libz.so.4 (0x29344000)
       libbz2.so.3 => /usr/lib/libbz2.so.3 (0x29356000)
       libthr.so.3 => /lib/libthr.so.3 (0x29367000)
       libc.so.7 => /lib/libc.so.7 (0x28083000)

Первые строчки сразу же указывают ссылки на разные версии библиотек:

libgstaudio-0.10.so.24 и libgstaudio-0.10.so.0

libgstinterfaces-0.10.so.24 и libgstpbutils-0.10.so.0

libgstpbutils-0.10.so.24 и libgstpbutils-0.10.so.0

libgstvideo-0.10.so.24 и libgstvideo-0.10.so.0

 

Решил поискать откуда взялись so.24 на рабочей машине и стало совсем все непонятно для меня:

 pkg_info -aL | grep lib/libgstaudio
/usr/local/lib/libgstaudio-0.10.a
/usr/local/lib/libgstaudio-0.10.la
/usr/local/lib/libgstaudio-0.10.so
/usr/local/lib/libgstaudio-0.10.so.0

 ls -la /usr/local/lib | grep libgstaudio
-rw-r--r--   1 root  wheel   619644 Apr 10 02:45 libgstaudio-0.10.a
-rwxr-xr-x   1 root  wheel     1384 Apr 10 02:45 libgstaudio-0.10.la
lrwxr-xr-x   1 root  wheel       22 Apr 10 02:45 libgstaudio-0.10.so -> libgstaudio-0.10.so.24
-rwxr-xr-x   1 root  wheel   403016 Apr 10 02:45 libgstaudio-0.10.so.24

 pkg_which /usr/local/lib/libgstaudio-0.10.so.24
?

pkg_info -W /usr/local/lib/libgstaudio-0.10.so.24

Считаю, что проблема, скорее всего, кроется именно в этом. Есть соображения по этома поводу?

Edited by Dimic
Posted

Итак, следуя докам получилось следующее:

gst-launch-0.10 -e rtspsrc location="rtsp://10.4.10.34:554/live/ch00_0" latency=100 ! rtph264depay byte-stream=false \
! ffdec_h264 ! clockoverlay ! x264enc \
! queue ! mp4mux ! filesink location=test100501.mp4

Здесь опишу подробнее. После получения rtp потока, плагин rtph264depay извлекает из rtp пакетов видео x-h264, то есть имеем на входе x-rtp, получаем на выходе x-h264. Опция byte-stream здесь отключена, по скольку мне не требуется передавать видео по сети. Далее плагином ffdec_h264 x-h264 обрабатывается, и на выходе имеем доступный к наложению текста формат x-raw. Плагин clockoverlay накладывает время, x264 обратно преобразует x-raw в x-h264, и в завершении видео помещается в контейнер mp4 и пишется в файл. Вроде как, все логично, но ничего не происходит. Gstreamer ошибок не выдает, размер файла получается мизерным, ничем не открывается.

Где я не прав?

 

UPD: Пардон. Поторопился. Все нормально. Просто машина слабая, нужно было дождаться пока видео перекодируется в x-h264.

спасибо за подсказку. А можно ли, писать и сразу stream-ть по rtmp,http?через byte-stream?

Posted

И тут столкнулся с первым подводным камнем - ffmpeg никак не захотел подхватывать rtsp поток с камеры. Д

 

У мну ffmpeg прекрасно тянет rtsp

 

programm="ffmpeg"
options="-benchmark -threads 0 -preset fast -profile baseline"
url="rtsp://62.149.26.237:1935/tv/_definst_/inter"
$programm $options -i $url $feed

Posted (edited)

у меня ffmpeg в упор не хочет подхватывать звук из такого файла

stream.sdp

v=0
o=(descr) 96 1 IN IP4 192.168.1.5
s=TANDBERG Streaming
i=A streaming session from TANDBERG codec
c=IN IP4 224.1.1.1/3
m=video 1234 RTP/AVP 31
a=recvonly
a=rtpmap:98 H263-1998/90000
a=fmtp:98 CIF4=2;CIF=1;QCIF=1
m=audio 1238 RTP/AVP 0
a=recvonly

видео берет из UDP-потока, а звук из отдельного потока нет.

для видео udp://224.1.1.1:1234

для аудио udp://224.1.1.1:1238

 

приходится запускать два ffmpeg с двумя разными описаниями данных и потом склеивать записаные файлы

Edited by naves
Posted

спасибо за подсказку. А можно ли, писать и сразу stream-ть по rtmp,http?через byte-stream?

 

чтобы стримить по rtmp, вам нужен rtmp-сервер, типа erlyvideo. у gstreamer есть элемент rtmpsink.

для стриминга по http надо писать небольшой сервер(perl/python/c), который будет делать accept, отдавать http-заголовки и добавлять сокет в multifdsink.

 

правда, для http неплохо бы определится с контейнером(flv/mp4/ts). если чуть подумать, можно сделать полноценный http-стриминг( в том смысле, что яблочный hls или адобовский hds ).

Posted

спасибо за подсказку. А можно ли, писать и сразу stream-ть по rtmp,http?через byte-stream?

 

чтобы стримить по rtmp, вам нужен rtmp-сервер, типа erlyvideo. у gstreamer есть элемент rtmpsink.

для стриминга по http надо писать небольшой сервер(perl/python/c), который будет делать accept, отдавать http-заголовки и добавлять сокет в multifdsink.

 

правда, для http неплохо бы определится с контейнером(flv/mp4/ts). если чуть подумать, можно сделать полноценный http-стриминг( в том смысле, что яблочный hls или адобовский hds ).

я щас и использую erlyvideo. Просто хотелось было добавить запись с камер) Например писать каждые 24 часа. Затем новый файл

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.