> 技术文档 > 【bug】 jetson上opencv无法录制h264本地视频

【bug】 jetson上opencv无法录制h264本地视频


在Jetson Orin NX上无法使用opencv直接录制h264/h265视频流(h264格式的视频流才能在浏览器播放)

解决:

软件编码:需要源码编译opencv

1.环境准备

pip uninstall opencv-pythonsudo apt install build-essential cmake git python3-dev python3-numpy \\libavcodec-dev libavformat-dev libswscale-dev \\libgstreamer-plugins-base1.0-dev \\libgstreamer1.0-dev libgtk-3-dev \\libpng-dev libjpeg-dev libopenexr-dev libtiff-dev libwebp-dev \\libopencv-dev x264 libx264-dev libssl-dev ffmpeg

2.源码编译(大概需要1h)

python -m pip install --no-binary opencv-python opencv-python
import cv2cap = cv2.VideoCapture(\"/home/ssa/test_video/20250327_105503.mp4\")while True: ret, img= cap.read() if not ret: print(\"无法获取帧\") break local_video_path = f\"xxxxx.mp4\" fourcc = cv2.VideoWriter_fourcc(*\'avc1\') out = cv2.VideoWriter(local_video_path, fourcc, self.fps, (img.shape[1], img.shape[0])) out.write(img)

avc1是唯一能够软件编码h264的opencv的编码器

硬件编码:需要硬件编码器

1.环境安装

sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-devsudo apt install -y libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-basesudo apt install -y gstreamer1.0-plugins-good gstreamer1.0-plugins-bad sudo apt install -y gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-docsudo apt install -y gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsasudo apt install -y gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 sudo apt install -y gstreamer1.0-pulseaudiosudo apt install -y gtk-doc-toolssudo apt install -y libeigen3-dev libfmt-dev v4l-utils

2.代码实现

import cv2# 视频源(摄像头或文件)cap = cv2.VideoCapture(0) # 0表示默认摄像头# 或从RTSP流读取:# cap = cv2.VideoCapture(\"rtsp://xxxxx\")# 获取视频参数fps = cap.get(cv2.CAP_PROP_FPS)width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 自定义视频文件名video_filename = \"output.mp4\" # 可修改为任意名称# 也可以通过用户输入来动态设置文件名# video_filename = input(\"请输入保存的视频文件名:\") + \".mp4\"# GStreamer输出管道(使用NVENC H.264硬件编码)output_pipeline = ( f\"appsrc ! video/x-raw, format=BGR ! \" f\"videoconvert ! video/x-raw, format=I420 ! \" f\"nvvidconv ! \" f\"nvv4l2h264enc insert-sps-pps=1 preset-level=1 bitrate=4000000 ! \" f\"h264parse ! \" f\"qtmux ! \" f\"filesink location={video_filename} sync=0\")# 初始化VideoWriterout = cv2.VideoWriter( output_pipeline, cv2.CAP_GSTREAMER, 0, fps, (width, height))if not out.isOpened(): print(\"Error: 无法打开输出流\") exit()print(f\"视频将保存为: {video_filename}\")# 读取并写入视频帧while cap.isOpened(): ret, frame = cap.read() if not ret: break out.write(frame) cv2.imshow(\'Frame\', frame) if cv2.waitKey(1) & 0xFF == ord(\'q\'): break# 释放资源cap.release()out.release()cv2.destroyAllWindows()print(f\"视频已成功保存为: {video_filename}\")