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

相关文章

Java Stream流与使用操作指南

《JavaStream流与使用操作指南》Stream不是数据结构,而是一种高级的数据处理工具,允许你以声明式的方式处理数据集合,类似于SQL语句操作数据库,本文给大家介绍JavaStream流与使用... 目录一、什么是stream流二、创建stream流1.单列集合创建stream流2.双列集合创建str

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境