Linux 36.3 + JetPack v6.0@jetson-inference之视频操作

2024-06-01 09:28

本文主要是介绍Linux 36.3 + JetPack v6.0@jetson-inference之视频操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Linux 36.3 + JetPack v6.0@jetson-inference之视频操作

  • 1. 源由
  • 2. 输入输出源
    • 2.1 输入
    • 2.2 输出
  • 3. 示例
    • 3.1 MIPI CSI 摄像头
    • 3.2 V4L2 摄像头
    • 3.3 WebRTC
    • 3.4 RTP
    • 3.5 RTSP
    • 3.6 Video 文件
    • 3.7 Image 文件
  • 4. 代码分析
    • 4.1 Python
    • 4.2 C++
  • 5. 参考资料

1. 源由

对jetson-inference示例代码完成编译之后,首先确保视频、图像方面的操作没有问题。

因为是所有示例基本上都是针对视频或者图像进行深度机器学习操作的。

2. 输入输出源

2.1 输入

InputProtocolResource URINotes
MIPI CSI cameracsi://csi://0CSI camera 0 (substitute other camera numbers for 0)
V4L2 camerav4l2://v4l2:///dev/video0V4L2 device 0 (substitute other camera numbers for 0)
WebRTC streamwebrtc://webrtc://@:8554/my_inputFrom browser webcam to localhost, port 8554 (requires HTTPS/SSL)
RTP streamrtp://rtp://@:1234localhost, port 1234 (requires additional configuration)
RTSP streamrtsp://rtsp://:1234Replace with remote host’s IP or hostname
Video filefile://file://my_video.mp4Supports loading MP4, MKV, AVI, FLV (see codecs below)
Image filefile://file://my_image.jpgSupports loading JPG, PNG, TGA, BMP, GIF, etc.
Image sequencefile://file://my_directory/Searches for images in alphanumeric order
    input                resource URI of the input stream, for example:* /dev/video0               (V4L2 camera #0)* csi://0                   (MIPI CSI camera #0)* rtp://@:1234              (RTP stream)* rtsp://user:pass@ip:1234  (RTSP stream)* webrtc://@:1234/my_stream (WebRTC stream)* file://my_image.jpg       (image file)* file://my_video.mp4       (video file)* file://my_directory/      (directory of images)--input-width=WIDTH    explicitly request a width of the stream (optional)--input-height=HEIGHT  explicitly request a height of the stream (optional)--input-rate=RATE      explicitly request a framerate of the stream (optional)--input-save=FILE      path to video file for saving the input stream to disk--input-codec=CODEC    RTP requires the codec to be set, one of these:* h264, h265* vp8, vp9* mpeg2, mpeg4* mjpeg--input-decoder=TYPE   the decoder engine to use, one of these:* cpu* omx  (aarch64/JetPack4 only)* v4l2 (aarch64/JetPack5 only)--input-flip=FLIP      flip method to apply to input:* none (default)* counterclockwise* rotate-180* clockwise* horizontal* vertical* upper-right-diagonal* upper-left-diagonal--input-loop=LOOP      for file-based inputs, the number of loops to run:* -1 = loop forever*  0 = don't loop (default)* >0 = set number of loops

2.2 输出

OutputProtocolResource URINotes
WebRTC streamwebrtc://webrtc://@:8554/my_outputSend to browser, port 8554, stream name “my_output”
RTP streamrtp://rtp://:1234Replace with remote host’s IP or hostname
RTSP streamrtsp://rtsp://@:1234/my_outputReachable at rtsp://:1234/my_output
Video filefile://file://my_video.mp4Supports saving MP4, MKV, AVI, FLV (see codecs below)
Image filefile://file://my_image.jpgSupports saving JPG, PNG, TGA, BMP
Image sequencefile://file://image_%i.jpg%i is replaced by the image number in the sequence
OpenGL windowdisplay://display://0Creates GUI window on screen 0
    output               resource URI of the output stream, for example:* file://my_image.jpg       (image file)* file://my_video.mp4       (video file)* file://my_directory/      (directory of images)* rtp://<remote-ip>:1234    (RTP stream)* rtsp://@:8554/my_stream   (RTSP stream)* webrtc://@:1234/my_stream (WebRTC stream)* display://0               (OpenGL window)--output-codec=CODEC   desired codec for compressed output streams:* h264 (default), h265* vp8, vp9* mpeg2, mpeg4* mjpeg--output-encoder=TYPE  the encoder engine to use, one of these:* cpu* omx  (aarch64/JetPack4 only)* v4l2 (aarch64/JetPack5 only)--output-save=FILE     path to a video file for saving the compressed streamto disk, in addition to the primary output above--bitrate=BITRATE      desired target VBR bitrate for compressed streams,in bits per second. The default is 4000000 (4 Mbps)--headless             don't create a default OpenGL GUI window

3. 示例

3.1 MIPI CSI 摄像头

$ video-viewer csi://0                        # MIPI CSI camera 0 (substitue other camera numbers)
$ video-viewer csi://0 output.mp4             # save output stream to MP4 file (H.264 by default)
$ video-viewer csi://0 rtp://<remote-ip>:1234 # broadcast output stream over RTP to <remote-ip>

3.2 V4L2 摄像头

$ video-viewer v4l2:///dev/video0                 # /dev/video0 can be replaced with /dev/video1, ect.
$ video-viewer /dev/video0                        # dropping the v4l2:// protocol prefix is fine
$ video-viewer /dev/video0 output.mp4             # save output stream to MP4 file (H.264 by default)
$ video-viewer /dev/video0 rtp://<remote-ip>:1234 # broadcast output stream over RTP to <remote-ip>

3.3 WebRTC

$ video-viewer /dev/video0 webrtc://@:8554/my_output               # send V4L2 webcam to browser
$ video-viewer webrtc://@:8554/my_input output.mp4                 # receive browser webcam (requires HTTPS/SSL) and save to MP4
$ video-viewer webrtc://@:8554/my_input webrtc://@:8554/my_output  # receieve + send (full-duplex loopback)

3.4 RTP

$ video-viewer --input-codec=h264 rtp://@:1234         # recieve on localhost port 1234
$ video-viewer --input-codec=h264 rtp://224.0.0.0:1234 # subscribe to multicast group
$ video-viewer --bitrate=1000000 csi://0 rtp://<remote-ip>:1234         # transmit camera over RTP, encoded as H.264 @ 1Mbps 
$ video-viewer --output-codec=h265 my_video.mp4 rtp://<remote-ip>:1234  # transmit a video file over RTP, encoded as H.265

3.5 RTSP

$ video-viewer rtsp://<remote-ip>:1234 my_video.mp4      # subscribe to RTSP feed from <remote-ip>, port 1234 (and save it to file)
$ video-viewer rtsp://username:password@<remote-ip>:1234 # with authentication (replace username/password with credentials)
$ video-viewer /dev/video0 rtsp://@:1234/my_output                 # stream a V4L2 camera out over RTSP 
$ video-viewer rtsp://<remote-ip>:1234/input rtsp://@:1234/output  # subscribe to an RTSP feed, and relay it (loopback)

3.6 Video 文件

# playback
$ video-viewer my_video.mp4                              # display the video file
$ video-viewer my_video.mp4 rtp://<remote-ip>:1234       # transmit the video over RTP# recording
$ video-viewer csi://0 my_video.mp4                      # record CSI camera to video file
$ video-viewer /dev/video0 my_video.mp4                  # record V4L2 camera to video file

3.7 Image 文件

$ video-viewer input.jpg output.jpg	# load/save an image
$ video-viewer input_dir/ output_dir/   # load all images from input_dir and save them to output_dir
$ video-viewer "*.jpg" output_%i.jpg    # load all jpg images and save them to output_0.jpg, output_1.jpg, ect

4. 代码分析

4.1 Python

代码:video-viewer.py

Root
├── Imports
│   ├── import sys
│   ├── import argparse
│   └── from jetson_utils import videoSource, videoOutput, Log
├── Command-line Argument Parsing
│   ├── Create Argument Parser
│   │   ├── Description: "View various types of video streams"
│   │   ├── Formatter Class: argparse.RawTextHelpFormatter
│   │   └── Epilog: videoSource.Usage() + videoOutput.Usage() + Log.Usage()
│   ├── Add Arguments
│   │   ├── input (URI of the input stream)
│   │   └── output (URI of the output stream, optional)
│   └── Parse Arguments
│       ├── args = parser.parse_known_args()[0]
│       └── Handle Parsing Exceptions
│           ├── Print Help
│           └── Exit
├── Create Video Sources & Outputs
│   ├── input = videoSource(args.input, argv=sys.argv)
│   └── output = videoOutput(args.output, argv=sys.argv)
├── Capture Frames Loop├── Initialize Frame Counter│   └── numFrames = 0├── while True Loop├── Capture Image│   └── img = input.Capture()├── Handle Timeout│   └── if img is None: continue├── Log Verbose Information│   └── if numFrames % 25 == 0 or numFrames < 15:│       └── Log.Verbose(...)├── Increment Frame Counter│   └── numFrames += 1├── Render Image│   └── output.Render(img)├── Update Title Bar│   └── output.SetStatus(...)└── Exit on EOS├── if not input.IsStreaming() or not output.IsStreaming():└── break

4.2 C++

代码:video-viewer.cpp

#include statements
├── "videoSource.h"
├── "videoOutput.h"
├── "logging.h"
├── "commandLine.h"
└── <signal.h>Global variables
└── bool signal_recieved = false;Function definitions
├── void sig_handler(int signo)
│   └── if (signo == SIGINT)
│       ├── LogInfo("received SIGINT\n");
│       └── signal_recieved = true;
└── int usage()├── printf("usage: video-viewer [--help] input_URI [output_URI]\n\n");├── printf("View/output a video or image stream.\n");├── printf("See below for additional arguments that may not be shown above.\n\n");├── printf("positional arguments:\n");├── printf("    input_URI       resource URI of input stream  (see videoSource below)\n");├── printf("    output_URI      resource URI of output stream (see videoOutput below)\n\n");├── printf("%s", videoSource::Usage());├── printf("%s", videoOutput::Usage());└── printf("%s", Log::Usage());main function
├── Parse command line
│   ├── commandLine cmdLine(argc, argv);
│   └── if (cmdLine.GetFlag("help"))
│       └── return usage();
├── Attach signal handler
│   └── if (signal(SIGINT, sig_handler) == SIG_ERR)
│       └── LogError("can't catch SIGINT\n");
├── Create input video stream
│   ├── videoSource* input = videoSource::Create(cmdLine, ARG_POSITION(0));
│   └── if (!input)
│       ├── LogError("video-viewer:  failed to create input stream\n");
│       └── return 0;
├── Create output video stream
│   ├── videoOutput* output = videoOutput::Create(cmdLine, ARG_POSITION(1));
│   └── if (!output)
│       ├── LogError("video-viewer:  failed to create output stream\n");
│       └── return 0;
├── Capture/display loop
│   ├── uint32_t numFrames = 0;
│   └── while (!signal_recieved)
│       ├── uchar3* image = NULL;
│       ├── int status = 0;
│       ├── if (!input->Capture(&image, &status))
│       │   └── if (status == videoSource::TIMEOUT)
│       │       └── continue;
│       │   └── break; // EOS
│       ├── if (numFrames % 25 == 0 || numFrames < 15)
│       │   └── LogVerbose("video-viewer:  captured %u frames (%ux%u)\n", numFrames, input->GetWidth(), input->GetHeight());
│       ├── numFrames++;
│       └── if (output != NULL)
│           ├── output->Render(image, input->GetWidth(), input->GetHeight());
│           ├── char str[256];
│           ├── sprintf(str, "Video Viewer (%ux%u) | %.1f FPS", input->GetWidth(), input->GetHeight(), output->GetFrameRate());
│           ├── output->SetStatus(str);
│           └── if (!output->IsStreaming())
│               └── break;
├── Destroy resources
│   ├── printf("video-viewer:  shutting down...\n");
│   ├── SAFE_DELETE(input);
│   └── SAFE_DELETE(output);
└── printf("video-viewer:  shutdown complete\n");

5. 参考资料

【1】jetson-inference - Camera Streaming and Multimedia

这篇关于Linux 36.3 + JetPack v6.0@jetson-inference之视频操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020611

相关文章

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

使用Python在PDF中绘制多种图形的操作示例

《使用Python在PDF中绘制多种图形的操作示例》在进行PDF自动化处理时,人们往往首先想到的是文本生成、图片嵌入或表格绘制等常规需求,然而在许多实际业务场景中,能够在PDF中灵活绘制图形同样至关重... 目录1. 环境准备2. 创建 PDF 文档与页面3. 在 PDF 中绘制不同类型的图形python

Java 操作 MinIO详细步骤

《Java操作MinIO详细步骤》本文详细介绍了如何使用Java操作MinIO,涵盖了从环境准备、核心API详解到实战场景的全过程,文章从基础的桶和对象操作开始,到大文件分片上传、预签名URL生成... 目录Java 操作 MinIO 全指南:从 API 详解到实战场景引言:为什么选择 MinIO?一、环境

Linux下屏幕亮度的调节方式

《Linux下屏幕亮度的调节方式》文章介绍了Linux下屏幕亮度调节的几种方法,包括图形界面、手动调节(使用ACPI内核模块)和外接显示屏调节,以及自动调节软件(CaliseRedshift和Reds... 目录1 概述2 手动调节http://www.chinasem.cn2.1 手动屏幕调节2.2 外接显