前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV保存H264视频的问题

OpenCV保存H264视频的问题

作者头像
AI算法与图像处理
发布2021-09-06 10:52:47
5.8K0
发布2021-09-06 10:52:47
举报
文章被收录于专栏:AI算法与图像处理

环境

  • windows 10 64bit
  • opencv 4.5.3

前言

看到有小伙伴在聊,如何将目标检测的结果保存成视频的相关问题?本篇我们就来看看。

opencv保存视频

在绝大多数的目标检测项目中,都是使用opencv这个开源的计算机视觉库来进行图片、视频或者摄像头的读写。

关于视频保存,来看下面的代码示例

代码语言:javascript
复制
import cv2

cap = cv2.VideoCapture('test.mp4')

width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = int(cv2.VideoWriter_fourcc(*'MJPG'))

out = cv2.VideoWriter('output.avi', fourcc, fps, (width,  height))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    out.write(frame)
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

主要是VideoWriter对象,这里需要几个重要参数,输出文件名、宽width、高height、帧率fpsfourcc。除了fourcc,其它几项都很好理解。

FourCC是一个4字节码,用来表示视频编码器,网站 fourcc.org 列出了所有可用的编码器。在VideoWriter中既可以写成*'MJPG',也可以写成'M', 'J', 'P', 'G'。但是并不是说,所有的编码器都可以使用。

使用H264编码器

在上面代码的基础上我们修改一下,使用h264编码器

代码语言:javascript
复制
import cv2

cap = cv2.VideoCapture('test.mp4')

width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = int(cv2.VideoWriter_fourcc(*'H264'))

out = cv2.VideoWriter('output.mp4', fourcc, fps, (width,  height))

# 后面代码省略了

执行代码后,报错了

代码语言:javascript
复制
OpenCV: FFMPEG: tag 0x34363248/'H264' is not supported with codec id 27 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1'

Failed to load OpenH264 library: openh264-1.8.0-win64.dll
        Please check environment and/or download library: https://github.com/cisco/openh264/releases

[libopenh264 @ 000001fe3bfcb240] Incorrect library version loaded
[ERROR:0] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (2774) open Could not open codec libopenh264, error: Unspecified error
[ERROR:0] global /build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp (2791) open VIDEOIO/FFMPEG: Failed to initialize VideoWriter

从错误信息中可以看到,H264字节码并不被支持,自动帮你替换成了avc1opencv默认使用ffmpeg框架来处理视频,但是ffmpeg并没有h264解码器。报错之外,还提供了一个解决方案,那就是去使用cisco开源的openh264

接下来去站点 https://github.com/cisco/openh264/releases 下载1.8.0版本的dll文件,并和源码文件放在同一级目录,然后将fourcc也改为avc1,执行代码

opencv videowriter h264

看到,报错信息不见了,针对生成的mp4文件,使用ffmpeg命令查看其信息

代码语言:javascript
复制
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1440x1080, 538 kb/s, 29.92 fps, 29.92 tbr, 29917 tbn, 59834 tbc (default)

可以看到,视频编码确实是h264

为什么不内置h264

这主要是许可证的问题,libx264是基于GPL的,而ffmpeg要使用libx264的话,必须--enable-gpl,而opencv则用的是MIT许可。具体的,可以看看这个链接 https://github.com/opencv/opencv-python/issues/299

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI算法与图像处理 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境
  • 前言
  • opencv保存视频
  • 使用H264编码器
  • 为什么不内置h264
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档