1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/duping812-jetson-inference

Клонировать/Скачать
aux-streaming.md 31 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 02.06.2025 15:38 5e07e18

Назад | Вперед | Содержание
Приложение

Струминг с камер и мультимедиа

Этот проект поддерживает передачу видеопотоков и изображений через различные интерфейсы и протоколы, включая:

Потоки идентифицируются по URI ресурса и доступны через API videoSource и videoOutput. Таблицы ниже показывают поддерживаемые протоколы ввода/вывода и примеры URI для каждого типа потока:

Входные потоки| | Протокол | URI ресурса | Примечания |

|------------------|--------------|---------------------------|--------------------------------------------------------------| | Камера MIPI CSI | csi:// | csi://0 | Камера CSI 0 (замените номер камеры на 0) | | Камера V4L2 | v4l2:// | v4l2:///dev/video0 | Устройство V4L2 0 (замените номер камеры на 0) | | Поток RTP | rtp:// | rtp://@:1234 | localhost, порт 1234 (требуется дополнительная конфигурация) | | Поток RTSP | rtsp:// | rtsp://<remote-ip>:1234 | Замените <remote-ip> на IP-адрес или имя хоста удаленного сервера | | Файл видео | file:// | file://my_video.mp4 | Поддерживает загрузку MP4, MKV, AVI, FLV (см. кодеки ниже) | | Файл изображения | file:// | file://my_image.jpg | Поддерживает загрузку JPG, PNG, TGA, BMP, GIF и т.д. | | Последовательность изображений | file:// | file://my_directory/ | Ищет изображения в алфавитном порядке |* Поддерживаемые декодерные кодеки: H.264, H.265, VP8, VP9, MPEG-2, MPEG-4, MJPEG

  • Протокольные префиксы file://, v4l2:// и csi:// могут быть опущены из URI как сокращение

Потоки вывода

Протокол URI ресурса Примечания
Поток RTP rtp:// rtp://<remote-ip>:1234 Замените <remote-ip> на IP-адрес или имя хоста удаленного сервера
Видеофайл file:// file://my_video.mp4 Поддерживает сохранение в форматах MP4, MKV, AVI, FLV (см. кодеки ниже)
Изображение file:// file://my_image.jpg Поддерживает сохранение в форматах JPG, PNG, TGA, BMP
Последовательность изображений file:// file://image_%i.jpg %i заменяется номером изображения в последовательности
Окно OpenGL display:// display://0 Создает окно GUI на экране 0
  • Поддерживаемые кодеки: H.264, H.265, VP8, VP9, MJPEG
  • Префиксы протоколов file:// могут быть опущены из URI как сокращение
  • По умолчанию создается окно отображения OpenGL, если не указан флаг --headless

Аргументы командной строкиКаждый пример программы на C++ и Python из jetson-inference принимает одинаковый набор аргументов командной строки для указания URI потоков и дополнительных опций. Такие опции можно использовать в любом из примеров (например, imagenet/imagenet.py, detectnet/detectnet.py, segnet/segnet.py, video-viewer/video-viewer.py, и т. д.). Эти аргументы командной строки обычно имеют следующий формат:```bash

$ imagenet [options] input_URI [output_URI] # URI вывода является необязательным


где URI входных и выходных данных указываются двумя позиционными аргументами. Например:

```bash
$ imagenet input.jpg output.jpg              # классифицировать input.jpg, сохранить как output.jpg

Как упоминалось выше, любой из примеров из jetson-inference может быть использован здесь, так как они используют одинаковую обработку командной строки. Ниже приведены дополнительные опции потока, которые можно указать при запуске каждого из программ:

Опции ввода```

input_URI            ресурс URI входного потока (см. таблицу выше)

--input-width=ШИРИНА явное указание разрешения входного потока --input-height=ВЫСОТА (разрешение не обязательно, кроме случаев с RTP) --input-codec=КОДИРОВЩИК для RTP требуется указание кодировщика, один из следующих: * h264, h265 * vp8, vp9 * mpeg2, mpeg4 * mjpeg --input-flip=ПОДКЛОНЯЕМЫЙ метод переворота для входного потока (исключает V4L2): * none (по умолчанию) * против часовой стрелки * поворот на 180 градусов * по часовой стрелке * горизонтальный * вертикальный * диагональный верхний правый * диагональный верхний левый --input-loop=ЦИКЛ для файловых входных данных, количество циклов для выполнения: * -1 = цикл бесконечно * 0 = не цикл (по умолчанию) * >0 = задать количество циклов --input-rtsp-latency=2000 Количество миллисекунд буферизации входного потока RTSP. Установка значения в ноль может дать очень низкую задержку, но может привести к дрожанию в зависимости от производительности сети.

output_URI           ресурс URI выходного потока (см. таблицу выше)

--output-codec=КОДИРОВЩИК желаемый кодировщик для сжатого выходного потока: * h264 (по умолчанию), h265 * vp8, vp9 * mpeg2, mpeg4 * mjpeg --bitrate=БИТНАЯ_СКОРОСТЬ желаемая целевая VBR битовая скорость для сжатого потока, в битах в секунду. По умолчанию 4000000 (4 Мбит/с) --headless не создавать стандартное окно графического интерфейса OpenGL


Ниже приведены примеры команд для запуска инструмента `video-viewer` на различных типах потоков. Вы можете заменить другие программы на `video-viewer` в этих командах, так как они используют одинаковые аргументы. В разделе [Исходный код](#source-code) этой страницы вы можете ознакомиться с содержимым исходного кода инструмента `video-viewer`, чтобы узнать, как использовать API `videoSource` и `videoOutput` в своих собственных приложениях.

## Камеры MIPI CSI

Камеры MIPI CSI являются компактными сенсорами, которые подключаются напрямую к интерфейсу CSI/ISP процессора Jetson. Поддерживаемые камеры MIPI CSI включают:

* [Raspberry Pi Camera Module v2](https://www.raspberrypi.org/products/camera-module-v2/) (IMX219) для Jetson Nano и Jetson Xavier NX
* Модуль камеры OV5693 из набора разработчика Jetson TX1/TX2.
* См. страницу [Jetson Partner Supported Cameras](https://developer.nvidia.com/embedded/jetson-partner-supported-cameras) для получения информации о других поддерживаемых сенсорах.Вот несколько примеров запуска с использованием камеры MIPI CSI. Если у вас подключено несколько камер MIPI CSI, замените номер камеры на 0:

```bash
$ video-viewer csi://0                        # Камера MIPI CSI 0 (замените номер камеры на другие значения)
$ video-viewer csi://0 output.mp4             # Сохранение выходного потока в файл MP4 (по умолчанию используется H.264)
$ video-viewer csi://0 rtp://<remote-ip>:1234 # Передача выходного потока через RTP на <remote-ip>

По умолчанию камеры MIPI CSI создаются с разрешением 1280x720. Чтобы указать другое разрешение, используйте опции --input-width и --input-height. Обратите внимание, что указанное разрешение должно совпадать с одним из поддерживаемых форматов камеры.

$ video-viewer --input-width=1920 --input-height=1080 csi://0

Камеры V4L2

USB-веб-камеры обычно поддерживаются как устройства V4L2, например, Logitech C270 или C920.```bash $ video-viewer v4l2:///dev/video0 # /dev/video0 можно заменить на /dev/video1 и т.д. $ video-viewer /dev/video0 # Удаление префикса протокола v4l2:// допустимо $ video-viewer /dev/video0 output.mp4 # Сохранение выходного потока в файл MP4 (по умолчанию используется H.264) $ video-viewer /dev/video0 rtp://:1234 # Передача выходного потока через RTP на

> **Примечание:** если у вас подключена камера MIPI CSI, она также будет отображаться как `/dev/video0`. Если вы подключите USB-веб-камеру, она будет отображаться как `/dev/video1`, поэтому вы захотите заменить `/dev/video1` в командных строках выше. Использование CSI-камер через V4L2 не поддерживается в этом проекте, так как через V4L2 они используют сырой Bayer без ISP (вместо этого используйте CSI-камеры, как показано [выше](#mipi-csi-камеры)).#### Форматы V4L2

По умолчанию, камеры V4L2 создаются с использованием формата камеры с максимальной частотой кадров, который наиболее точно соответствует желаемому разрешению (по умолчанию, это разрешение составляет 1280x720). Формат с максимальной частотой кадров может быть зашифрован (например, с использованием H.264 или MJPEG), так как USB-камеры обычно передают несжатые YUV/RGB при более низкой частоте кадров. В этом случае кодек будет обнаружен, и поток камеры будет автоматически декодирован с использованием аппаратного декодера Jetson для достижения максимальной частоты кадров.

Если вы явно хотите выбрать формат, используемый V4L2-камерой, вы можете сделать это с помощью опций `--input-width`, `--input-height` и `--input-codec`. Возможные опции декодера кодека включают `--input-codec=h264, h265, vp8, vp9, mpeg2, mpeg4, mjpeg`.

```bash
$ video-viewer --input-width=1920 --input-height=1080 --input-codec=h264 /dev/video0

Когда вы запускаете одно из приложений jetson-inference на V4L2-источнике, различные поддерживаемые форматы V4L2-камеры будут записаны в терминал. Однако вы также можете перечислить эти поддерживаемые форматы с помощью команды v4l2-ctl:

$ sudo apt-get install v4l-utils
$ v4l2-ctl --device=/dev/video0 --list-formats-ext

RTPСетевые потоки RTP передаются определенному хосту или группе мультикаста по протоколу UDP/IP. При получении RTP-потока необходимо указать кодек (--input-codec), так как RTP не имеет возможности динамически запрашивать его. В этом случае RTP используется как источник ввода с другого устройства:```bash

$ video-viewer --input-codec=h264 rtp://@:1234 # получение на локальном хосте порт 1234 $ video-viewer --input-codec=h264 rtp://224.0.0.0:1234 # подписка на группу мультикаста


Команды выше указывают RTP как источник ввода, где другой удаленный хост на сети передает поток на Jetson. Однако вы также можете передать RTP-поток с вашего Jetson на другой удаленный хост на сети.#### Передача RTP

Чтобы передать выходной поток RTP, укажите целевой IP/порт как `output_URI`. Если необходимо, вы можете указать скорость передачи данных (по умолчанию `--bitrate=4000000` или 4 Мбит/с) и/или выходной кодек (по умолчанию `--output-codec=h264`), который может быть `h264, h265, vp8, vp9, mjpeg`

```bash
$ video-viewer --bitrate=1000000 csi://0 rtp://<remote-ip>:1234         # передача камеры через RTP, закодированной как H.264 @ 1 Мбит/с 
$ video-viewer --output-codec=h265 my_video.mp4 rtp://<remote-ip>:1234  # передача видео-файла через RTP, закодированного как H.265

При передаче RTP вам нужно явно указать IP-адрес или имя хоста удаленного хоста (или мультикаст-группы), на который отправляется поток (показано выше как <remote-ip>). См. ниже для некоторых подсказок по просмотру потока RTP с ПК.

Просмотр RTP удаленно

Если ваш Jetson передает RTP на другой удаленный хост (например, на ПК), вот несколько примеров команд, которые вы можете использовать для просмотра потока:

	* [Установите GStreamer](https://gstreamer.freedesktop.org/documentation/installing/index.html) и запустите этот пайплайн (замените `port=1234` на порт, который вы используете)
	
	```bash
	$ gst-launch-1.0 -v udpsrc port=1234 \
	caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! \
	rtph264depay ! decodebin ! videoconvert ! autovideosink
	```
	
* Используя VLC Player:
	* Создайте файл SDP (.sdp) с следующим содержимым (замените `1234` на порт, который вы используете)
	
	```
	c=IN IP4 127.0.0.1
	m=video 1234 RTP/AVP 96
	a=rtpmap:96 H264/90000
	```
	
	* Откройте поток в VLC, дважды щелкнув файл SDP
	* Вы можете захотеть уменьшить настройки `File caching` и `Network caching` в VLC, как [показано здесь](https://www.howtogeek.com/howto/windows/fix-for-vlc-skipping-and-lagging-playing-high-def-video-files/)
	
* Если ваш удаленный хост — это другой Jetson:
	* Используйте ту же команду `video-viewer`, как [выше](#rtp) (замените `1234` на порт, который вы используете)
	
	```bash
	$ video-viewer --input-codec=h264 rtp://@:1234
	```## RTSP

Сетевые потоки RTSP подписываются удаленным хостом через UDP/IP. В отличие от RTP, RTSP может динамически запрашивать свойства потока (например, разрешение и кодек), поэтому эти опции не требуют явного указания.

```bash
$ video-viewer rtsp://<remote-ip>:1234 my_video.mp4      # подписка на RTSP поток с <remote-ip>, порт 1234 (и сохранение в файл)
$ video-viewer rtsp://username:password@<remote-ip>:1234 # с аутентификацией (замените username/password на соответствующие учетные данные)

Примечание: RTSP поддерживается только в качестве входного потока. Выход RTSP требует дополнительной поддержки в GStreamer для RTSP сервера.

Видеофайлы

Вы можете воспроизводить и записывать видеофайлы в форматах MP4, MKV, AVI и FLV.

# воспроизведение
$ video-viewer my_video.mp4                              # отображение видеофайла
$ video-viewer my_video.mp4 rtp://<remote-ip>:1234       # передача видео по RTP

# запись
$ video-viewer csi://0 my_video.mp4                      # запись видео с CSI камеры в файл
$ video-viewer /dev/video0 my_video.mp4                  # запись видео с V4L2 камеры в файл

Кодеки

При загрузке видеофайлов кодек и разрешение автоматически определяются, поэтому их не нужно устанавливать. При сохранении видеофайлов по умолчанию используется кодек H.264, но его можно изменить с помощью опции --output-codec.

$ video-viewer --output-codec=h265 input.mp4 output.mp4  # транскодирование видео в H.265

Поддерживаются следующие кодеки:* Декодирование - H.264, H.265, VP8, VP9, MPEG-2, MPEG-4, MJPEG

  • Энкодирование - H.264, H.265, VP8, VP9, MJPEG

Изменение разрешения входных данных

При загрузке видеофайлов разрешение автоматически определяется. Однако, если вы хотите, чтобы входное видео было изменено на другое разрешение, вы можете указать опции --input-width и --input-height:

$ video-viewer --input-width=640 --input-height=480 my_video.mp4  # изменение размера видео на 640x480

Циклическое воспроизведение входных данных

По умолчанию видео завершается, когда достигается конец потока (EOS). Однако, указав опцию --loop, вы можете установить количество циклов, которое вы хотите, чтобы видео воспроизводилось. Возможные значения для --loop:

  • -1 = циклическое воспроизведение до бесконечности
  • 0 = не циклическое воспроизведение (по умолчанию)
  • >0 = установка количества циклов
$ video-viewer --loop=10 my_video.mp4    # циклическое воспроизведение видео 10 раз
$ video-viewer --loop=-1 my_video.mp4    # циклическое воспроизведение видео до бесконечности (пока пользователь не завершит)

Изображения

Вы можете загружать/сохранять изображения в следующих форматах:

  • Загрузка: JPG, PNG, TGA, BMP, GIF, PSD, HDR, PIC и PNM (PPM/PGM двоичный)
  • Сохранение: JPG, PNG, TGA, BMP
$ video-viewer input.jpg output.jpg	# загрузить/сохранить изображение

Вы также можете создавать циклы изображений и последовательности изображений — см. раздел Циклы входных данных выше.#### Последовательности

Если путь является директорией или содержит маски, все изображения будут загружены/сохранены последовательно (в алфавитно-цифровом порядке).

$ video-viewer input_dir/ output_dir/   # загрузить все изображения из input_dir и сохранить их в output_dir
$ video-viewer "*.jpg" output_%i.jpg    # загрузить все jpg изображения и сохранить их как output_0.jpg, output_1.jpg и т.д.

примечание: при использовании масок всегда заключайте её в кавычки ("*.jpg"). В противном случае, ОС автоматически расширит последовательность и изменит порядок аргументов на командной строке, что может привести к перезаписи одного из входных изображений выходным.

При сохранении последовательности изображений, если путь указывает только на директорию (output_dir), то изображения будут автоматически сохранены в формате JPG с форматом output_dir/%i.jpg, используя номер изображения в качестве имени файла (output_dir/0.jpg, output_dir/1.jpg и т.д.).

Если вы хотите указать формат имени файла, сделайте это с помощью стиля printf %i в пути (output_dir/image_%i.png). Вы можете применить дополнительные модификаторы printf, такие как %04i, чтобы создать имена файлов вида output_dir/image_0001.jpg.

Исходный кодПотоки доступны с помощью объектов videoSource и videoOutput. Эти объекты имеют возможность обрабатывать каждый из типов потоков выше через унифицированный набор API. Изображения могут быть захвачены и выведены в следующих форматах данных:| Строка формата | imageFormat enum | Тип данных | Глубина битов |

|---------------|------------------|-----------|-----------| | rgb8 | IMAGE_RGB8 | uchar3 | 24 | | rgba8 | IMAGE_RGBA8 | uchar4 | 32 | | rgb32f | IMAGE_RGB32F | float3 | 96 | | rgba32f | IMAGE_RGBA32F | float4 | 128 |* тип данных и перечисление imageFormat являются типами C++

  • в Python строка формата может быть передана в videoSource.Capture() для запроса определенного формата (по умолчанию используется rgb8)
  • в C++ шаблон videoSource::Capture() определяет формат на основе типа данных указателя на выход

Для конвертации изображений в различные форматы смотрите страницу Изменение изображений с использованием CUDA для дополнительной информации.

Ниже приведен исходный код для video-viewer.py и video-viewer.cpp, немного сокращенный для улучшения читаемости:

Python

import jetson.utils
import argparse
import sys

# Парсинг командной строки
parser = argparse.ArgumentParser()
parser.add_argument("input_URI", type=str, help="URI входного потока")
parser.add_argument("output_URI", type=str, default="", nargs='?', help="URI выходного потока")
opt = parser.parse_known_args()[0]

# Создание источников и выходов видео
input = jetson.utils.videoSource(opt.input_URI, argv=sys.argv)
output = jetson.utils.videoOutput(opt.output_URI, argv=sys.argv)
```# Захват кадров до тех пор, пока пользователь не выйдет
while output.IsStreaming():
	image = input.Capture(format='rgb8')  # также может быть format='rgba8', 'rgb32f', 'rgba32f'
	output.Render(image)
	output.SetStatus("Видеопросмотр | {:d}x{:d} | {:.1f} FPS".format(image.width, image.height, output.GetFrameRate()))
```### C++
```c++
#include "videoSource.h"
#include "videoOutput.h"

int main( int argc, char** argv )
{
	// создание входного/выходного потока
	videoSource* inputStream = videoSource::Create(argc, argv, ARG_POSITION(0));
	videoOutput* outputStream = videoOutput::Create(argc, argv, ARG_POSITION(1));
	
	if( !inputStream )
		return 0;

	// цикл захвата/отображения
	while( true )
	{
		uchar3* nextFrame = NULL;  // также может быть uchar3, uchar4, float3, float4

		if( !inputStream->Capture(&nextFrame, 1000) )
			continue;

		if( outputStream != NULL )
		{
			outputStream->Render(nextFrame, inputStream->GetWidth(), inputStream->GetHeight());

			// обновление строки состояния
			char str[256];
			sprintf(str, "Видеопросмотр (%ux%u) | %.1f FPS", inputStream->GetWidth(), inputStream->GetHeight(), outputStream->GetFrameRate());
			outputStream->SetStatus(str);
		}
		
		// проверка, завершил ли пользователь
		if( !outputStream->IsStreaming() )
			break;
		
		if( !inputStream->IsStreaming() )
			break;
	}

	// освобождение ресурсов
	SAFE_DELETE(inputStream);
	SAFE_DELETE(outputStream);
}

Далее | Манипуляции с изображениями с помощью CUDA

© 2016-2020 NVIDIA | Содержание

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/duping812-jetson-inference.git
git@api.gitlife.ru:oschina-mirror/duping812-jetson-inference.git
oschina-mirror
duping812-jetson-inference
duping812-jetson-inference
master