当前位置: 首页 > 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.dtcms.com/a/292065.html

相关文章:

  • [Dify] -进阶9- 使用 API 调用方式将 Dify 嵌入自己的网站
  • Typecho三种版权保护方法对比与实战指南
  • 【硬件基础】计算机存储和通信领域名词概念解释,时钟频率,传输速率,总线宽度,存储容量,带宽利用率,数据位宽,数据带宽
  • 牛客:最长无重复子数组
  • 嵌入式开发学习———Linux环境下数据结构学习(一)
  • Web3面试题
  • [特殊字符] 字节内部流出版!19道前端核心面试题解析——速存
  • 网络基础16--VRRP技术
  • ospf技术
  • 中国在远程医疗智能化方面有哪些特色发展模式?
  • js 数字逢三切断、整数最大9位、小数最大2位
  • LeetCode 热题100:42.接雨水
  • 数据交换---JSON格式
  • uniapp在app中关于解决输入框键盘弹出后遮住输入框问题
  • haproxy七层均衡
  • ucharts 搭配uniapp 自定义x轴文字 实现截取显示
  • 基于SpringBoot+Uniapp的非遗文化宣传小程序(AI问答、协同过滤算法、Echarts图形化分析)
  • 代码随想录算法训练营Day35|动态规划Part03|01背包问题 二维、01背包问题 一维、416. 分割等和子集
  • (12)机器学习小白入门YOLOv:YOLOv8-cls 模型微调实操
  • YOLO-实例分割头
  • 解决http下浏览器无法开启麦克风问题
  • 【论文阅读 | TIV 2024 | CDC-YOLOFusion:利用跨尺度动态卷积融合实现可见光-红外目标检测】
  • Python实例之画小猪佩奇
  • 知识库搭建之Meilisearch‘s 搜索引擎 测评-东方仙盟测评师
  • Agent架构与工作原理:理解智能体的核心机制
  • Apache Ignite 中 WHERE 子句中的子查询(Subqueries in WHERE Clause)的执行方式
  • 社交电商推客系统全栈开发指南:SpringCloud+分润算法+Flutter跨端
  • 深入浅出控制反转与依赖注入:从理论到实践
  • 深度学习的一些疑点整理
  • J2EE模式---拦截过滤器模式