Dimic Posted May 12, 2012 Posted May 12, 2012 (edited) Имеется IP камера видео наблюдения, отдающая поток по rtsp в h.264. Есть ли возможность при записи этого потока на винчестер средствами VLC наложить на картинку дату и время? И если есть, то как? На Wiki VLC не нашел ничего полезного. Точнее нашел, как я думал сначала, субфильтр marq, который способен наложить timestamp при проигрывании и вещании, но при записи в файл наложение не сохраняется. Edited May 12, 2012 by Dimic Вставить ник Quote
Dimic Posted May 12, 2012 Author Posted May 12, 2012 Как выяснилось 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 Вставить ник Quote
alexmern Posted May 12, 2012 Posted May 12, 2012 А почему бы не использовать готовые решения для видеорегистрации, а не изобретать велосипед? Тот же бесплатный zoneminder вполне неплох. Вставить ник Quote
kapa Posted May 12, 2012 Posted May 12, 2012 А почему бы не использовать готовые решения для видеорегистрации, а не изобретать велосипед? Тот же бесплатный zoneminder вполне неплох. Уж не знаю, чего они там за последнее время напридумывали, но пару лет назад он был вполне плох. Вставить ник Quote
alexmern Posted May 12, 2012 Posted May 12, 2012 (edited) Уж не знаю, чего они там за последнее время напридумывали, но пару лет назад он был вполне плох. У меня уже работает давно. Одну камеру пишет без проблем. Все основные функции работают на ура — запись, поиск, перемотка, детектор движения, оповещения, автоматическое удаление старых записей. Таймстамп, так нужный топикстартеру, тоже работает. Интерфейс конечно не очень красивый и с первого взгляда он мне тоже не очень понравился, но стоило пару дней попользоваться и вникнуть — все что нужно было мне лично я нашел и вполне доволен, да ещё и за бесплатно. Edited May 12, 2012 by alexmern Вставить ник Quote
kapa Posted May 12, 2012 Posted May 12, 2012 Уж не знаю, чего они там за последнее время напридумывали, но пару лет назад он был вполне плох. У меня уже работает давно. Одну камеру пишет без проблем. Понятно. Вставить ник Quote
Dimic Posted May 13, 2012 Author Posted May 13, 2012 (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 May 13, 2012 by Dimic Вставить ник Quote
Dimic Posted May 13, 2012 Author Posted May 13, 2012 (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 May 13, 2012 by Dimic Вставить ник Quote
Dimic Posted May 16, 2012 Author Posted May 16, 2012 (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 May 16, 2012 by Dimic Вставить ник Quote
roysbike Posted May 16, 2012 Posted May 16, 2012 Итак, следуя докам получилось следующее: 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? Вставить ник Quote
vlad11 Posted May 16, 2012 Posted May 16, 2012 И тут столкнулся с первым подводным камнем - 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 Вставить ник Quote
naves Posted May 16, 2012 Posted May 16, 2012 (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 May 16, 2012 by naves Вставить ник Quote
vlad11 Posted May 16, 2012 Posted May 16, 2012 rtsp отличиется от раздельного стрима по udp. через ffserver можно налету склеивать два потока. Вставить ник Quote
^rage^ Posted May 20, 2012 Posted May 20, 2012 спасибо за подсказку. А можно ли, писать и сразу stream-ть по rtmp,http?через byte-stream? чтобы стримить по rtmp, вам нужен rtmp-сервер, типа erlyvideo. у gstreamer есть элемент rtmpsink. для стриминга по http надо писать небольшой сервер(perl/python/c), который будет делать accept, отдавать http-заголовки и добавлять сокет в multifdsink. правда, для http неплохо бы определится с контейнером(flv/mp4/ts). если чуть подумать, можно сделать полноценный http-стриминг( в том смысле, что яблочный hls или адобовский hds ). Вставить ник Quote
roysbike Posted May 20, 2012 Posted May 20, 2012 спасибо за подсказку. А можно ли, писать и сразу 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 часа. Затем новый файл Вставить ник Quote
^rage^ Posted May 20, 2012 Posted May 20, 2012 Например писать каждые 24 часа. Затем новый файл multifilesink next-file=max-size max-file-size=size_in_bytes либо next-file=key-unit-event и по таймеру слать это событие. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.