Pull to refresh

Comments 20

Раз уж я в этом поучаствовал, то добавлю от себя:
1) Почему-то конкретно с этой камерой просто взять v4l2src прокатывало только локально. Если передавать видео через udpsink (даже на локалхост), на приемнике получался один зеленый кадр — и все.

2) Вопреки написанному в статье про uvch264src:
Панель видоискателя может быть подключена к фейклинку, если она не нужна, но я не думаю, что ее можно отключить. По крайней мере, это впечатление, что я читаю оригинальный пост в блоге KaKaRoTo.

Отключилась она легко, я просто убрал из пайплайна источник src.vfsrc и queue.

Собственно, этот вариант и приведен в конце статьи, он заработал по сети и «видоискатель» не выводит.
Когда я в прошлой ветке давал наводку на камеры с аппаратным кодированием, упоминал о необходимости выделять данные h264. Когда я (давно) этим занимался, везде утверждалось, что аппаратно второй поток никак не отключить, камера насильно выдаёт оба кодека сразу. Кстати, это не совсем видоискатель, это принудительный гибридный режим UVC+SVC. AFAIK сделано это для упрощённой совместимости со старыми версиями ОС и софтом, которые не умеют в SVC (в данном случае h.264) без бубна, зато из коробки тянут UVC(в данном случае — MJPEG)

В идеале конечно хотелось бы переключить кодек внутри камеры только в h.264, заодно трафик по USB снизить и упростить обработку потока от USB самопальным софтом, глядишь, FFMPEG заработает. Может кто-то продвинулся в этом вопросе.
Я про элемент uvch264src узнал буквально вчера вот из этой статьи и просто попробовал убрать второй поток. И он просто пропал, без всяких проблем. Видоискателем я его вслед за этой статьей и называю (ну и пад называется vfsrc — viewfinder, видимо).

Я, конечно, не уверен, что камера его вообще не отсылает при этом (и сходу не знаю даже, как это проверить, перехватывать usb-траффик разве что?), но выводиться он никуда не выводится.
UFO just landed and posted this here

чтобы использовать в ROS
1) установить пакет usb-cam


sudo apt-get install ros-kinetic-usb-cam

2) Создать файл, например usb_cam.launch и положить его в папку вашего пакета


<launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="320" />
    <param name="image_height" value="240" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>
</launch>

где video_device нужно указать адрес вашего видеутроства, например /dev/video0

Это вы пишете, как в ROS взять видео с usb-камеры. Статья про то, как взять прямо с камеры видео, сжатое в h264, и переслать на другой комп по сети. И к ROS'у видео нужно прикручивать уже там, когда оно по сети принялось.

И usb_cam, насколько я знаю, может брать с камеры только сырое видео или mjpeg, а h264 — не умеет. Хотя это даже и не важно, ибо см. выше.
я не обратил внимание на то что стримится по сети, но тем не менее, мой способ работает, просто на клиент пробросьте стрим в /dev/video, в ROS просто так видоеопоток не запихнете

а если хотите транслировать сжатый поток, то машине откуда идет стрим, можно запустить модуль usb_cam, и сделать проброс через image_transport с image_raw в image_compresed, и на клиентской машине уже с легкостью примете поток через ROS.

Если же задача просто перебросить видеопоток, то рос я думаю вам не нужен
это получается из видео потока надо создать виртуальную камеру, такое вообще возможно?
вот например как установить ubuntu на плату Beaglebone Black для вашего робота, а уже в ubuntu легко настроить ROS, хотя конечно система может жрать ресуры


или другой пример: транслировать видео через rstp, а на клиенте принимать через ffmpeg

ffmpeg -i rtsp://admin:admin@192.168.1.142:554/CH001.sdp -f v4l2 -pix_fmt yuv420p /dev/video1
да ROS у меня уже давно стоит в ubuntu на beaglebone.
надо именно h264 както затолкнуть в ROS чтоб он его понял или gstreamer как то отправить в ROS. Вообщем нужно готовое решение.
а для чего именно h264 нужно, по другому данные с камеры не получить?

вот конфиг, который я использовал для работы с камерой на джетсоне, думаю тут надо подставить свою конфигурацию GSCAM_CONFIG, ну и поставить пакет ros-kinetic-gscam

<launch>
  <!-- Command Line Arguments -->
  <arg name="cam_name" default="usb_cam" />                  <!-- The name of the camera (corrsponding to the camera info) -->
  <arg name="frame_id" default="/$(arg cam_name)_link" />    <!-- The TF frame ID. -->
  <arg name="sync_sink" default="true" />                    <!-- Synchronize the app sink. Setting this to false may resolve problems with sub-par framerates. -->
  <arg name="width" default="640" />                        <!-- Image Width -->
  <arg name="height" default="360" />                       <!-- Image Height -->
  <arg name="fps" default="10" />                            <!-- Desired framerate. True framerate may not reach this if set too high. -->

  <!-- Make arguments available to parameter server -->
  <param name="$(arg cam_name)/image_width" type="int" value="$(arg width)" />
  <param name="$(arg cam_name)/image_height" type="int" value="$(arg height)" />
  <param name="$(arg cam_name)/target_fps" type="int" value="$(arg fps)" />

  <!-- Define the GSCAM pipeline -->
  <env name="GSCAM_CONFIG" value="nvcamerasrc ! video/x-raw(memory:NVMM),
    width=(int)$(arg width), height=(int)$(arg height), format=(string)I420, framerate=(fraction)$(arg fps)/1 ! 
    nvvidconv flip-method=0 ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR" />
  
  <!-- Start the GSCAM node -->
  <node pkg="gscam" type="gscam" name="$(arg cam_name)">
    <param name="camera_name" value="$(arg cam_name)" />
    <param name="frame_id" value="$(arg frame_id)" />
    <param name="sync_sink" value="$(arg sync_sink)" />
    <remap from="camera/image_raw" to="$(arg cam_name)/image_raw" />
    <remap from="/set_camera_info" to="$(arg cam_name)/set_camera_info" />
  </node>
  
  
  <node name="republish" type="republish" pkg="image_transport" output="screen" args="in:=/usb_cam/image_raw" />
</launch>
проверил usb_cam не понимает pixel format h264, вобщем гугление дало тот же ответ usb_cam не пооддерживает h264
А есть возможность сделать из малинки точку доступа, к которой цепляться напрямую телефоном и транслировать на него?
А зачем?
Есть смартфоны за 25$, с которых через вайфай или через 3-4Г вы можете организовать и видео трансляцию и аудио и все это будет энергонезависимо и будет с экономией трафика и с шифрованием трафика.
А также делать фото с любой из 2 камер.
+геолокацию получать и отправлять на такие места аудиосообщения.
Мне нужно встраиваемое решение, raspberry zero пока подходит лучше всего и имеет нужные порты. Само устройство должно хоть в глуши работать. + у меня своя камера, телефонные не подойдут.
Тогда вот такой смартфон в исполнении IP67:

К нему можно подключить солнечную батарею и встроить куда угодно.
Камера 2 мпс.
У меня своя камера и она принципиально отличается от тех, что в телефонах.
+ я боюсь там немного другая ось, половина пакетов для трансляции и обработки изображений не заработает…
Пробую то же самое, малинка, c920, cvlc, но пытаюсь стримить на youtube.
http стрим работает без проблем, но когда пытаюсь передать rtmp через ffmpeg, то ничего не происходит.
cvlc -vvv v4l2:///dev/video0:chroma=h264:width=1920:height=1080 --demux h264 --sout '#std{access=rtmp,mux=ffmpeg{mux=flv},dst=rtmp://a.rtmp.youtube.com/live2/xxxxx}'


Не знакомы с такой проблемой?
последние строки в логе кажутся вполне рабочими, до этого тоже никаких ошибок:
[73b00510] core input debug: Buffering 68%
[73b00510] core input debug: Buffering 89%
[73b00510] core input debug: Stream buffering done (336 ms in 268 ms)
[73b00510] core input debug: Decoder wait done in 0 ms
[72b31508] avcodec mux debug: writing header
Sign up to leave a comment.

Articles