当前位置: 首页 > news >正文

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

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

解决:

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

1.环境准备

pip uninstall opencv-python
sudo 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 cv2
cap = cv2.VideoCapture("/home/ssa/test_video/20250327_105503.mp4")
while True:ret, img= cap.read()if not ret:print("无法获取帧")breaklocal_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-dev
sudo apt install -y libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base
sudo apt install -y gstreamer1.0-plugins-good gstreamer1.0-plugins-bad 
sudo apt install -y gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc
sudo apt install -y gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa
sudo apt install -y gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 
sudo apt install -y gstreamer1.0-pulseaudio
sudo apt install -y gtk-doc-tools
sudo 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"
)# 初始化VideoWriter
out = 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:breakout.write(frame)cv2.imshow('Frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
print(f"视频已成功保存为: {video_filename}")    
http://www.xdnf.cn/news/1165753.html

相关文章:

  • Python编程进阶知识之第三课处理数据(numpy)
  • 学习pwn需要的基本汇编语言知识
  • MCP vs 传统集成方案:REST API、GraphQL、gRPC的终极对比
  • nodejs:告别全局安装,npx 命令详解及其与 npm 的区别
  • npm全局安装后,依然不是内部或外部命令,也不是可运行的程序或批处理文件
  • Go语言切片(Slice)与数组(Array)深度解析:避坑指南与最佳实践
  • rocky9-zabbix简单部署
  • Vue底层换成啥了?如何更新DOM的?
  • 基于单片机智能消毒柜设计
  • 【IDEA】如何在IDEA中通过git创建项目?
  • 原型链污染
  • uniapp请求封装上传
  • uniapp app打包流程
  • 【Python办公】Excel工作表拆分工具(按照sheet进行拆分-calamine-极速版)
  • NIO技术原理以及应用(AI)
  • Kotlin介绍
  • 重构创作边界:川翔云电脑 - UE5云端超算引擎​
  • Kafka——揭开神秘的“位移主题”面纱
  • Springboot+vue个人健康管理系统的设计与实现
  • 【电影剖析】千钧一发
  • ISPDiffuser文章翻译理解
  • 深入解析MIPI C-PHY (二)C-PHY三线魔术:如何用6种“符号舞步”榨干每一滴带宽?
  • uni-api交互反馈组件(showToast)的用法
  • SmartETL循环流程的设计与应用
  • 《Linux 环境下 Nginx 多站点综合实践:域名解析、访问控制与 HTTPS 加密部署》​
  • 【金仓数据库产品体验官】_KingbaseES(SQLServer兼容版)保姆级安装教程
  • AC身份认证实验之AAA服务器
  • Linux中ELF区域与文件偏移量的关系
  • 【牛客算法】小美的排列询问
  • DL00691-基于深度学习的轴承表面缺陷目标检测含源码python