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

Python读取视频-硬解和软解

1、软解码(Software Decoding)

软解(软件解码)指通过CPU的计算能力解码视频流,不依赖特定硬件加速模块。Python中常用OpenCV、FFmpeg等库实现,兼容性强但CPU占用较高。

2、硬解码(Hardware Decoding)

硬解(硬件解码)利用GPU或专用芯片(如NVIDIA NVENC、Intel Quick Sync)进行解码,显著降低CPU负载。需硬件支持,通常通过NVDEC、VAAPI等接口实现。

3、Python里怎么选?

OpenCV 的 cv2.VideoCapture 默认就是软解,最简单,但吃 CPU。

opencv-python 不管用 FFMPEG 还是 GStreamer,默认都是“软解”——除非你在打开 VideoCapture 时显式地给后端传递硬解参数,否则 CPU 还是会吭哧吭哧算每一帧。

4、为什么看起来有 FFMPEG / GStreamer 还是软解?

VideoCapture 只是一个“壳”。

真正干活的是后端:

  1. FFMPEG:默认用 libavcodec 的纯软件解码器(h264, hevc 等)。
  2. GStreamer:如果不加 vaapi, nvdec, qsv 之类 element,也只是 CPU 软解。

OpenCV 的 FFMPEG / GStreamer 后端只是“通道”,默认走软解;想硬解就在打开 VideoCapture 时把对应参数或 pipeline 写进去,不然 CPU 还是逃不掉。但是惨痛的事实是,OpenCV预装版都是不支持这些后端的硬解码,什么连GStreamer都不支持 OpenCV的cv2.VideoCapture如何加GStreamer后端-CSDN博客),想要支持,需要自己重新编译OpenCV。

5、我有英伟达显卡,有其他的硬解方案吗

是的,常用的硬解方案包括三种:FFmpeg+NVDEC(cuvid)、GStreamer+NVDEC(nvdec/nvdec_h264)、NVIDIA Video Processing Framework(PyNvCodec/VPF)

只大概介绍前两种,FFmpeg和GStreamer都是比较优秀的工具,需要下载他们的exe程序,然后用对应的python包,去调用他们的工具。

下面的程序仅供测试,实际还会有问题,因为这些工具往往也没有支持英伟达解码器,需要自己编译。。。。这是我踏过最长的坑,搞了很多天,但即便CPU解码,效率也比OpenCV 的 cv2.VideoCapture要快,常规推荐这些方案。

  1. 示例 1 FFmpeg-Python(PyAV)+ CUDA 硬解
  2. 示例 2 GStreamer-Python + CUDA 硬解
# pip install av==11.0.0  (PyAV 是 FFmpeg 的 Python 绑定)import av
import numpy as npdef rtsp_cuda_pyav(rtsp_url: str):# 关键:把 FFmpeg 的硬件加速参数通过 options 传进去container = av.open(rtsp_url,options={"rtsp_transport": "tcp",      # 避免 UDP 丢包"hwaccel":        "cuda","hwaccel_device": "0",        # 第 0 张卡"c:v":            "h264_cuvid",  # NVDEC 解码器"fflags":         "nobuffer",  # 低延迟"analyzeduration": "100000",})stream = container.streams.video[0]stream.thread_type = "AUTO"          # 多线程解码for frame in container.decode(stream):# 把 GPU 解码后的 CUDA frame 转成 numpy BGRimg = frame.to_ndarray(format='bgr24')yield img                         # 生成器,逐帧给主程序if __name__ == "__main__":url = "rtsp://user:password@ip:port/Streaming/Channels/101"for bgr in rtsp_cuda_pyav(url):# 这里随便你用 cv2.imshow / AI 推理cv2.imshow("PyAV-CUDA", bgr)if cv2.waitKey(1) == 27:break
# apt install python3-gi python3-gi-cairo gir1.2-gstreamer-1.0
# 或者 pip install PyGObjectimport cv2
import gi
gi.require_version("Gst", "1.0")
from gi.repository import Gst, GLibGst.init(None)def rtsp_cuda_gst(rtsp_url: str):# pipeline:RTSP → NVDEC → BGR → appsinkpipe = (f"rtspsrc location={rtsp_url} latency=0 ! ""rtph264depay ! h264parse ! ""nvh264dec ! "                # ← CUDA 硬解"videoconvert ! ""video/x-raw,format=BGR ! ""appsink max-buffers=1 drop=true")cap = cv2.VideoCapture(pipe, cv2.CAP_GSTREAMER)if not cap.isOpened():raise RuntimeError("无法打开 GStreamer 管道")while True:ok, frame = cap.read()if not ok:breakyield framecap.release()if __name__ == "__main__":url = "rtsp://user:password@ip:port/Streaming/Channels/101"for bgr in rtsp_cuda_gst(url):cv2.imshow("GST-CUDA", bgr)if cv2.waitKey(1) == 27:break

    文章转载自:

    http://zGwvqspx.ffwrq.cn
    http://H6wAJx8z.ffwrq.cn
    http://JRQWh8hg.ffwrq.cn
    http://4OZUXk2B.ffwrq.cn
    http://7Bgx0mBJ.ffwrq.cn
    http://nkoSdsPi.ffwrq.cn
    http://RI2TBtuS.ffwrq.cn
    http://bR17c6sO.ffwrq.cn
    http://Q2UVPM73.ffwrq.cn
    http://qQJaLBDV.ffwrq.cn
    http://yj0T5MtO.ffwrq.cn
    http://lO4GQAKP.ffwrq.cn
    http://aSZNRCNe.ffwrq.cn
    http://N5cHOygx.ffwrq.cn
    http://ZcpjENUi.ffwrq.cn
    http://e9Ytbabm.ffwrq.cn
    http://TpyaS419.ffwrq.cn
    http://OlcSt198.ffwrq.cn
    http://MKCOH5jj.ffwrq.cn
    http://tVc7y5pc.ffwrq.cn
    http://4VmEHoVT.ffwrq.cn
    http://oMtCLB5R.ffwrq.cn
    http://xMn9ATdE.ffwrq.cn
    http://MAk5piu2.ffwrq.cn
    http://abigxoYV.ffwrq.cn
    http://zTEfthDP.ffwrq.cn
    http://VNfUvNbi.ffwrq.cn
    http://zXrw9R93.ffwrq.cn
    http://pFr3eLZm.ffwrq.cn
    http://9IzXNM7D.ffwrq.cn
    http://www.dtcms.com/a/380905.html

    相关文章:

  1. FFmpeg vs 去水印软件:哪种方式更适合你?
  2. Java垃圾回收机制理论算法及使用
  3. 【Vue2 ✨】Vue2 入门之旅 · 进阶篇(六):keep-alive 与缓存机制
  4. IDA pro 生成idapro.hexlic
  5. 【CE】CE教程Tutorial:进阶篇(第8关:多级指针)(Pointer Scan工具)
  6. Java 更改 Word 文档中文本颜色
  7. Cesium 无人机航线规划(环点航线)
  8. 一般软件加载显示图片的流程
  9. 第十四届蓝桥杯青少组C++选拔赛[2023.1.15]第二部分编程题(3、寻找花坛)
  10. Spring Boot中Filter与Interceptor的区别
  11. 生产常见问题
  12. Linux copy_from_user
  13. 数据库:mysqld服务器启动参数大全
  14. STM32之RTC
  15. 正式工作一年半了 小记一下
  16. HDFS与Yarn深入剖析
  17. 空间信息与数字技术和传统GIS专业有何不同?
  18. 企业内训|智能驾驶案例及实践——某央企汽车集团
  19. 告别繁琐配置!Retrofit-Spring-Boot-Starter让HTTP调用更优雅
  20. 星座SAR动目标检测(GMTI)
  21. Python异常处理自定义:从基础到高级的完整指南
  22. R语言水文、水环境模型优化:从最速上升法、岭分析到贝叶斯优化与异方差处理,涵盖采样设计、代理模型与快速率定等
  23. PHP启动报错:liboing.so.5:cannot op如何处理?
  24. 双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的应用
  25. 半导体常见分析设备之EDX分析
  26. 金蝶云星空 × 飞书审批全场景对接案例分享
  27. 网易伏羲亮相Arm Unlocked 2025,携手Arm探索中国人工智能创新之路
  28. [code-review] docs | GitHub Actions运行器 | workflows/cr.yml
  29. 推箱子(Num014)
  30. GitHub热榜项目 - 日榜之应用场景与未来发展趋势