资讯中心

jetson-inference 相机流与多媒体实战指南:从 CSI/V4L2 到 WebRTC/RTP/RTSP 的统一视频采集与输出

📅 2026/9/25 17:47:53
jetson-inference 相机流与多媒体实战指南:从 CSI/V4L2 到 WebRTC/RTP/RTSP 的统一视频采集与输出
人工智能计算机视觉深度学习微调【免费下载链接】jetson-inferenceHello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.项目地址https://gitcode.com/gh_mirrors/je/jetson-inference点击查看免费下载本文是 jetson-inferenceHello AI World 系列中关于相机流与多媒体Camera Streaming and Multimedia的完整技术指南。文章围绕项目统一的流式资源 URI 体系与videoSource/videoOutputAPI系统讲解 MIPI CSI、V4L2 摄像头、WebRTC、RTP、RTSP、视频文件、图像文件与图像序列的采集、编码、传输与保存方法。读完本文你将能够为imagenet、detectnet、segnet等任一示例程序或自研应用正确构造输入/输出 URI、配置分辨率/帧率/码率/编解码器并把推理结果实时推送到浏览器或远程主机。统一的流资源 URI一套接口覆盖全部输入输出jetson-inference 项目中的每个 C/Python 示例程序例如 examples/imagenet/imagenet.cpp 与 python/examples/imagenet.py、examples/detectnet/detectnet.cpp 与 python/examples/detectnet.py、examples/segnet/segnet.cpp 与 python/examples/segnet.py都使用相同的命令行参数解析框架通过两个位置参数分别指定输入流与输出流的 URI。例如$ imagenet input.jpg output.jpg # 分类 input.jpg保存为 output.jpg流通过资源 URIresource URI标识并经由videoSource与videoOutput两个对象获取。URI 既可以通过命令行参数传入也可以在应用源码中硬编码。下表列出了项目支持的全部输入协议及 URI 格式输入流Input Streams协议资源 URI说明MIPI CSI 相机csi://csi://0CSI 相机 0把0替换为其他相机编号V4L2 相机v4l2://v4l2:///dev/video0V4L2 设备 0把0替换为其他设备号WebRTC 流webrtc://webrtc://:8554/my_input从浏览器摄像头到本机 8554 端口需要 HTTPS/SSLRTP 流rtp://rtp://:1234本机 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、MJPEGfile://、v4l2://、csi://前缀可省略不写作为简写形式。输出流Output Streams协议资源 URI说明WebRTC 流webrtc://webrtc://:8554/my_output发送到浏览器端口 8554流名my_outputRTP 流rtp://rtp://remote-ip:1234将remote-ip替换为远程主机 IP 或主机名RTSP 流rtsp://rtsp://:1234/my_output可在rtsp://jetson-ip:1234/my_output访问视频文件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在屏幕 0 上创建 GUI 窗口支持的编码编解码器H.264、H.265、VP8、VP9、MJPEGfile://前缀可省略默认情况下会创建一个 OpenGL 显示窗口除非指定--headless。命令行参数详解jetson-inference 的所有 C/Python 示例程序共享同一套流参数解析在源码层面这由videoSource::Create(cmdLine, ARG_POSITION(0))之类的调用实现见 examples/imagenet/imagenet.cppPython 侧则通过videoSource.Usage() videoOutput.Usage()将这些参数自动附加到 argparse 帮助信息中见 python/examples/detectnet.py。命令行一般形式为$ imagenet [options] input_URI [output_URI] # 输出 URI 可选默认是 display://0输入选项Input Optionsinput 输入流的资源 URI例如 * /dev/video0 (V4L2 相机 #0) * csi://0 (MIPI CSI 相机 #0) * rtp://:1234 (RTP 流) * rtsp://user:passip:1234 (RTSP 流) * webrtc://:1234/my_stream (WebRTC 流) * file://my_image.jpg (图像文件) * file://my_video.mp4 (视频文件) * file://my_directory/ (图像目录) --input-widthWIDTH 显式请求流的宽度可选 --input-heightHEIGHT 显式请求流的高度可选 --input-rateRATE 显式请求流的帧率可选 --input-saveFILE 用于把输入流保存到磁盘的视频文件路径 --input-codecCODEC RTP 必须设置编解码器可选 * h264, h265 * vp8, vp9 * mpeg2, mpeg4 * mjpeg --input-decoderTYPE 使用的解码引擎可选 * cpu * omx (aarch64/JetPack4 仅限) * v4l2 (aarch64/JetPack5 仅限) --input-flipFLIP 应用到输入的翻转方式 * none默认 * counterclockwise * rotate-180 * clockwise * horizontal * vertical * upper-right-diagonal * upper-left-diagonal --input-loopLOOP 对于基于文件的输入循环播放次数 * -1 永远循环 * 0 不循环默认 * 0 设置循环次数输出选项Output Optionsoutput 输出流的资源 URI例如 * file://my_image.jpg (图像文件) * file://my_video.mp4 (视频文件) * file://my_directory/ (图像目录) * rtp://remote-ip:1234 (RTP 流) * rtsp://:8554/my_stream (RTSP 流) * webrtc://:1234/my_stream (WebRTC 流) * display://0 (OpenGL 窗口) --output-codecCODEC 压缩输出流期望的编解码器 * h264默认, h265 * vp8, vp9 * mpeg2, mpeg4 * mjpeg --output-encoderTYPE 使用的编码引擎可选 * cpu * omx (aarch64/JetPack4 仅限) * v4l2 (aarch64/JetPack5 仅限) --output-saveFILE 用于把压缩流同时保存到磁盘的视频文件路径 在主输出之外额外保存 --bitrateBITRATE 压缩流的目标 VBR 码率单位为比特每秒。 默认是 40000004 Mbps --headless 不创建默认的 OpenGL GUI 窗口以下各节以video-viewer工具为例给出各类流的启动命令因为所有示例程序解析相同的参数你可以把命令中的video-viewer替换为imagenet、detectnet、segnet等任意 jetson-inference 示例如 python/examples/detectnet.py、python/examples/actionnet.py。MIPI CSI 相机MIPI CSI 相机是紧凑型传感器直接由 Jetson 的硬件 CSI/ISP 接口采集。支持的 CSI 相机包括适用于 Jetson Nano 和 Jetson Xavier NX 的 Raspberry Pi Camera Module v2IMX219Jetson TX1/TX2 开发套件的 OV5693 相机模块。启动示例如有多个 CSI 相机把编号 0 替换为对应编号$ 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默认情况下 CSI 相机以 1280x720 分辨率创建。要指定不同分辨率使用--input-width与--input-height选项。注意指定的分辨率必须是相机支持的格式之一。$ video-viewer --input-width1920 --input-height1080 csi://0V4L2 相机USB 网络摄像头通常以 V4L2 设备形式支持例如 Logitech C270、C920$ 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://remote-ip:1234 # 通过 RTP 把输出流广播到 remote-ip注意如果插入了 MIPI CSI 相机它也会以/dev/video0出现此时再插入 USB 摄像头它会显示为/dev/video1所以上面命令中应替换为/dev/video1。本项目不支持通过 V4L2 使用 CSI 相机因为经过 V4L2 时它们是未经 ISP 处理的原始 Bayer 数据应改用上文 MIPI CSI 相机 的方式。V4L2 格式默认情况下V4L2 相机以“最高帧率且最接近目标分辨率默认 1280x720”的相机格式创建。最高帧率的格式可能是编码格式如 H.264 或 MJPEG因为 USB 相机通常以较低帧率传输未压缩的 YUV/RGB。这种情况下会自动检测该编解码器并使用 Jetson 的硬件解码器解码相机流以获得最高帧率。如果你想显式选择 V4L2 相机使用的格式可通过--input-width、--input-height和--input-codec指定。可选的解码器编解码器参数为--input-codech264, h265, vp8, vp9, mpeg2, mpeg4, mjpeg$ video-viewer --input-width1920 --input-height1080 --input-codech264 /dev/video0运行 jetson-inference 程序时V4L2 相机支持的不同格式会打印到终端。也可以用v4l2-ctl命令列出支持格式$ sudo apt-get install v4l-utils $ v4l2-ctl --device/dev/video0 --list-formats-extWebRTC项目内置了一个 WebRTC 服务器可作输入/输出用于与客户端浏览器之间收发视频流。当 Jetson 处于无显示器的 headless 状态时可方便地查看视频流或构建以 Jetson 与边缘 AI 为后端、带交互的 Web 应用。已验证的浏览器包括 Chrome/Chromium、移动端 Android 与移动端 iOSSafari。$ video-viewer /dev/video0 webrtc://:8554/my_output # 把 V4L2 摄像头发送到浏览器 $ video-viewer webrtc://:8554/my_input output.mp4 # 接收浏览器摄像头需要 HTTPS/SSL并保存为 MP4 $ video-viewer webrtc://:8554/my_input webrtc://:8554/my_output # 同时接收发送全双工回环注意接收浏览器摄像头需要启用 HTTPS/SSL。之后在浏览器中访问https://JETSON-IP:8554即可查看流。Hello AI World 教程中有专门章节介绍 WebRTC 的使用与基于各种 Web 应用框架构建应用详见 docs/webrtc-server.md以及 README.md 中的 WebAPP 框架部分。上图为 WebRTC 全双工模式截图笔记本摄像头通过 WebRTC 将画面传到 JetsonJetson 解码后由 detectNet 完成目标检测再重新编码并通过 WebRTC 回传浏览器播放。这套 WebRTC 服务器可通过webrtc://:8554/my_stream之类的流 URL 直接与任何使用videoSource/videoOutput的程序无缝对接docs/webrtc-server.md 中说明了启用 HTTPS/SSL 的具体步骤包括用openssl生成自签名证书并通过SSL_KEY/SSL_CERT环境变量或--ssl-key/--ssl-cert参数启用。RTPRTP 网络流通过 UDP/IP 广播到特定主机或组播组。接收 RTP 流时必须指定编解码器--input-codec因为 RTP 无法动态查询该信息。下面把 RTP 作为输入源使用即网络上另一台主机正在向 Jetson 推流$ video-viewer --input-codech264 rtp://:1234 # 在本机 1234 端口接收 $ video-viewer --input-codech264 rtp://224.0.0.0:1234 # 订阅组播组发送 RTP要发送 RTP 输出流把目标 IP/端口作为output_URI指定。如有需要可以设置码率默认为--bitrate4000000即 4Mbps和/或输出编解码器默认为--output-codech264可选h264, h265, vp8, vp9, mjpeg$ video-viewer --bitrate1000000 csi://0 rtp://remote-ip:1234 # 相机经 RTP 发送H.264 编码 1Mbps $ video-viewer --output-codech265 my_video.mp4 rtp://remote-ip:1234 # 视频文件经 RTP 发送H.265 编码输出 RTP 时必须显式设置远程主机或组播组的 IP 地址/主机名上文以remote-ip表示。远程查看 RTP如果 Jetson 向另一台远程主机如 PC发送 RTP可以使用以下方式查看使用 GStreamer安装后运行以下 pipeline把port1234替换为你使用的端口$ gst-launch-1.0 -v udpsrc port1234 \ 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文件内容如下把1234替换为你使用的端口然后在 VLC 中双击打开该文件cIN IP4 127.0.0.1 mvideo 1234 RTP/AVP 96 artpmap:96 H264/90000如果远程主机是另一台 Jetson使用与上文 RTP 相同的video-viewer命令把1234替换为你使用的端口$ video-viewer --input-codech264 rtp://:1234RTSPRTSP 网络流通过 UDP/IP 从远程主机订阅。与 RTP 不同RTSP 可以动态查询流属性如分辨率、编解码器因此无需显式提供这些选项。RTSP 输入连接 RTSP 源时提供提供该源的 RTSP 服务器的 IP 地址与 URL$ video-viewer rtsp://remote-ip:1234 my_video.mp4 # 订阅 remote-ip 端口 1234 的 RTSP 源并保存到文件 $ video-viewer rtsp://username:passwordremote-ip:1234 # 带认证把 username/password 替换为凭据如果 RTSP 服务器开启了认证可能需要在 URL 中提供用户名/密码凭据。RTSP 输出jetson-utils 内置了基于 GStreamer 的 RTSP 服务器用于向多个客户端发送压缩 RTSP 流$ video-viewer /dev/video0 rtsp://:1234/my_output # 把 V4L2 摄像头经 RTSP 推流 $ video-viewer rtsp://remote-ip:1234/input rtsp://:1234/output # 订阅一路 RTSP 源并中继回环注意RTSP 输出可以通过与 WebRTC 相同的方式启用 SSL 加密见 docs/webrtc-server.md。之后即可用 RTSP 客户端如 VLC Player在rtsp://jetson-ip:1234/my_output打开并查看该流。视频文件可以播放与录制 MP4、MKV、AVI、FLV 格式的压缩视频文件此外还支持无容器封装的 H264/H265# 播放 $ 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-codech265 input.mp4 output.mp4 # 把视频转码为 H.265支持的编解码器解码h264, h265, vp8, vp9, mpeg2, mpeg4, mjpeg编码h264, h265, vp8, vp9, mjpeg调整输入分辨率加载视频文件时分辨率会自动检测。如果想把输入视频重新缩放到不同分辨率可指定--input-width与--input-height$ video-viewer --input-width640 --input-height480 my_video.mp4 # 把视频缩放到 640x480循环输入默认情况下视频在到达流末尾EOS后终止。通过--loop选项可设置循环次数-1 永远循环0 不循环默认0 设置循环次数$ video-viewer --loop10 my_video.mp4 # 循环播放视频 10 次 $ video-viewer --loop-1 my_video.mp4 # 永远循环播放视频直到用户退出次要目的地Secondary Destination有时除了主输出流外还希望把未经处理的相机画面或处理后视频保存到磁盘对于已经压缩的输入例如 H.264 编码的相机或网络流--input-saveFILE可以在解码处理之前把编码视频直接转储到磁盘。支持 MP4、MKV、AVI、FLV 以及原始 H264/H265。对于将被压缩的输出流如 WebRTC/RTP/RTSP 等网络流--output-saveFILE会在主输出之外把处理后的视频记录到磁盘。$ detectnet --input-codech264 --input-savecamera_dump.mp4 /dev/video0 # 保存未处理的输入视频 $ detectnet --output-savepost_dump.mp4 /dev/video0 rtsp://:1234/my_stream # 保存处理后的输出视频注意--input-save与--output-save只能与已经压缩/编码的流一起使用。第一条命令转储原始相机视频第二条命令在处理后转储例如包含边界框等叠加结果。图像文件支持加载/保存以下图像格式加载JPG、PNG、TGA、BMP、GIF、PSD、HDR、PIC 和 PNMPPM/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这类文件名。Source Code在自研应用中使用 videoSource / videoOutput流通过videoSource与videoOutput对象访问它们通过统一 API 处理上文所有类型的流。图像可支持以下数据格式采集与输出格式字符串imageFormat枚举数据类型位深rgb8IMAGE_RGB8uchar324rgba8IMAGE_RGBA8uchar432rgb32fIMAGE_RGB32Ffloat396rgba32fIMAGE_RGBA32Ffloat4128数据类型与imageFormat枚举是 C 类型Python 中可将格式字符串传给videoSource.Capture()以请求特定格式默认是rgb8C 中videoSource::Capture()模板会根据输出指针的数据类型推断格式。图像格式的相互转换参见 docs/aux-image.mdImage Manipulation with CUDA。以下为video-viewer的 Python 与 C 源码略作精简以提升可读性。这两个文件虽来自 jetson-utils 库但同样的 API 模式在仓库的 python/examples/detectnet.py、python/examples/actionnet.py 等文件中均有实际使用可作为接入自己应用的标准范式。Python 示例import sys import argparse from jetson_utils import videoSource, videoOutput # 解析命令行 parser argparse.ArgumentParser() parser.add_argument(input, typestr, helpURI of the input stream) parser.add_argument(output, typestr, default, nargs?, helpURI of the output stream) args parser.parse_known_args()[0] # 创建视频源与输出 input videoSource(args.input, argvsys.argv) # 默认: options{width: 1280, height: 720, framerate: 30} output videoOutput(args.output, argvsys.argv) # 默认: options{codec: h264, bitrate: 4000000} # 循环采集直到流末尾或用户退出 while True: # format 可选: rgb8, rgba8, rgb32f, rgba32frgb8 是默认值 # timeout 可选: -1 无限等待阻塞0 立即返回0 毫秒默认是 1000ms image input.Capture(formatrgb8, timeout1000) if image is None: # 发生超时 continue output.Render(image) # 在输入/输出 EOS 时退出 if not input.IsStreaming() or not output.IsStreaming(): break要在 Python 中硬编码视频配置可以给 videoSource/videoOutput 初始化器传一个可选的options字典它大致对应 C 中的videoOptions结构input videoSource(/dev/video0, options{width: 1280, height: 720, framerate: 30, flipMethod: rotate-180}) output videoOutput(my_video.mp4, options{codec: h264, bitrate: 4000000})输入设置会使用最接近的分辨率/帧率但建议先检查相机的支持格式。C 示例#include jetson-utils/videoSource.h #include jetson-utils/videoOutput.h int main( int argc, char** argv ) { // 创建输入/输出流 videoSource* input videoSource::Create(argc, argv, ARG_POSITION(0)); videoOutput* output videoOutput::Create(argc, argv, ARG_POSITION(1)); if( !input ) return 0; // 采集/显示循环 while( true ) { uchar3* image NULL; // 可以是 uchar3, uchar4, float3, float4 int status 0; // 参见 videoSource::Status (OK, TIMEOUT, EOS, ERROR) if( !input-Capture(image, 1000, status) ) // 1000ms 超时默认 { if( status videoSource::TIMEOUT ) continue; break; // EOS } if( output ! NULL ) { output-Render(image, input-GetWidth(), input-GetHeight()); if( !output-IsStreaming() ) // 检查用户是否退出 break; } } // 销毁资源 SAFE_DELETE(input); SAFE_DELETE(output); }要通过编程方式从代码设置创建接口也可以像下面这样填充videoOptions结构videoOptions options; options.width 1280; options.height 720; options.frameRate 30; options.flipMethod videoOptions::FLIP_ROTATE_180; videoSource* input videoSource::Create(/dev/video0, options);输入设置会使用最接近的分辨率/帧率但建议先检查相机的支持格式。在仓库示例中的实际调用链理解上述 API 后可以看到仓库内每个示例都遵循“解析 URI → 创建流 → 循环 Capture/Render”这一标准结构C 侧examples/imagenet/imagenet.cpp 通过commandLine cmdLine(argc, argv)解析参数后调用videoSource::Create(cmdLine, ARG_POSITION(0))创建输入流videoOutput::Create(cmdLine, ARG_POSITION(1))创建输出流随后在循环中Capture()图像交给imageNet.Classify()处理再Render()输出帮助信息中直接拼接videoSource::Usage()与videoOutput::Usage()同文件第 57-60 行这就是上节所有命令行参数的来源。Python 侧python/examples/detectnet.py 在 argparse 的epilog中附加videoSource.Usage() videoOutput.Usage() Log.Usage()并以videoSource(args.input, argvsys.argv)、videoOutput(args.output, argvsys.argv)创建流对象主循环执行input.Capture()、net.Detect()、output.Render()通过input.IsStreaming()/output.IsStreaming()判断 EOS 退出。python/examples/actionnet.py、python/examples/segnet.py 等均采用相同模式。Web 应用侧python/www/flask/stream.py 同样用videoSource(args.input, argvsys.argv)与videoOutput(args.output, argvsys.argv)接入流支撑了 WebRTC 相关的前后端 Web 演示对应 docs/webrtc-server.md、docs/webrtc-flask.md 等文档。因此无论你要采集 CSI/V4L2 摄像头、接收 WebRTC/RTP/RTSP 网络流还是播放视频、批量处理图像序列只要记住两条规则即可输入输出统一用 URI 描述采集/渲染统一走videoSource/videoOutput的Capture/Render循环。这套机制让同一个推理程序无需改动一行代码就能在所有上述流媒体场景之间自由切换。赞分享人工智能计算机视觉深度学习微调【免费下载链接】jetson-inferenceHello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.项目地址https://gitcode.com/gh_mirrors/je/jetson-inference点击查看免费下载相关推荐WebRTC流媒体终极指南从零开始构建实时视频传输系统WebRTC流媒体终极指南从零开始构建实时视频传输系统 想要快速搭建低延迟的实时视频传输系统WebRTC Streamer正是您需要的解决方案。作为一款开源后端音视频视频jetson-inference WebRTC Server 实战在 Jetson 与浏览器之间搭建低延迟视频流与边缘 AI 应用jetson inference WebRTC Server 实战在 Jetson 与浏览器之间搭建低延迟视频流与边缘 AI 应用 导读 本文聚焦 jetso人工智能计算机视觉深度学习微调jetson-inference WebRTC 网页应用实战基于 HTML/JavaScript 的 DNN 推理流媒体前端jetson inference WebRTC 网页应用实战基于 HTML/JavaScript 的 DNN 推理流媒体前端 本文是 jetson infer人工智能计算机视觉深度学习微调上一篇Wagtail 1.3.1 发布说明深度解读wagtailimages 迁移在 Django 1.8.8/1.9.1 Postgres 下的修复下一篇Zoom Phone 集成架构与生命周期指南从 Smart Embed 到 REST API 的完整落地路径创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

看完文章,想为自己的企业也做一次专业网站诊断?

尧图顾问免费为您评估现有网站,并给出建站/改版建议与报价方案。

免费获取方案