OpenCV保存H264视频的问题

这篇具有很好参考价值的文章主要介绍了OpenCV保存H264视频的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境

  • windows 10 64bit

  • opencv 4.5.3

前言

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

opencv保存视频

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

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

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编码器

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))

# 后面代码省略了

执行代码后,报错了

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保存H264视频的问题

opencv videowriter h264

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

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文章来源地址https://www.toymoban.com/news/detail-406840.html

到了这里,关于OpenCV保存H264视频的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频——视频流H264编码格式

    我们了解了什么是宏快,宏快作为压缩视频的最小的一部分,需要被组织,然后在网络之间做相互传输。 H264更深层次 —》宏块 太浅了 ​ 如果单纯的用 宏快 来发送数据是 杂乱无章 的,就好像在没有 集装箱 出现之前,货物总是随意被堆放到船上。 上货(编码),下货是非

    2024年02月15日
    浏览(56)
  • 【FFmpeg学习】H264 视频码流分析

    NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。 VCL层:(Video Coding L

    2024年02月02日
    浏览(42)
  • FFmpeg解码H264视频裸流(直接可用)

    1、写在前面 此文章主要包含解码H264视频流数据,主要有以下几点: 1、H264视频帧为Annex B格式,若使用AVCC格式可自行研究; 2、H264视频裸流,非解码视频文件(若有需要我后期可添加这部分代码); 3、支持输出RGB24或YUV420格式,其他可自行修改; 4、FFmpeg官网代码迭代及接口变

    2024年04月25日
    浏览(41)
  • 【解决】萤石云接入视频报错视频编码类型非H264

    说在前面 项目视频监控设备接入了萤石云,部分视频无法正常加载,报错页面如下: 原因分析 视频监控视频编码目前有H265和H264两种,萤石云仅支持H264的编码格式,所以对于接入的视频流才会出现这种错误。 解决方案 方案一:如果你能接触到项目部网络,可以参考萤石云

    2024年02月14日
    浏览(61)
  • 音视频处理 ffmpeg中级开发 H264编码

    libavcodec/avcodec.h 常用的数据结构 AVCodec 编码器结构体 AVCodecContext 编码器上下文 AVFrame 解码后的帧 结构体内存的分配和释放 av_frame_alloc 申请 av_frame_free() 释放 avcodec_alloc_context3() 创建编码器上下文 avcodec_free_context() 释放编码器上下文 解码步骤 avcodec_find_decoder 查找解码器 avcod

    2024年02月01日
    浏览(82)
  • 视频编码流程 YUV数据编码为H264数据

    视频编码时,设置编码器上下文参数有:码率,宽,高,格式,帧率等 frame设置:宽,高,格式 然后计算一帧的数据:宽 * 高 * 格式占用字节数 通常使用av_image_get_buffer_size来计算 av_opt_set就是用来设置参数的 preset preset参数是一个权衡编码速度和压缩率的参数,编码速度越慢,压缩率越高 参数

    2024年02月13日
    浏览(42)
  • golang基于FFmpeg实现视频H264编解码

    FFmpeg 是领先的多媒体框架,能够解码、编码、转码、混合、解密、流媒体、过滤和播放人类和机器创造的几乎所有东西。它支持最晦涩的古老格式,直到最尖端的格式。无论它们是由某个标准委员会、社区还是公司设计的。它还具有高度的便携性。 FFmpeg 可以在 Linux、Mac OS

    2024年02月11日
    浏览(45)
  • ffmpeg学习日记604-指令-将视频格式转为H264格式

    ffmpeg学习日记604-指令-将视频格式转为H264格式 在第四篇中,想要解码视频,缺没有弄清楚怎样的一个数据流,现在又明晰了一点,所谓的h264编解码,并不是直接将视频格式,通过h264编解码为视频原始数据流,这种说法是错误的,而是应该将视频格式转换为h264的数据流,然后

    2024年02月11日
    浏览(48)
  • FFmpeg+SDL实时解码和渲染H264视频流

    之前实现了Android手机摄像头数据的TCP实时传输,今天接着聊聊,如何在PC端把接收到的H264视频流实时解码并渲染出来。这次使用的语言是C++,框架有FFmpeg和SDL2。 解码部分使用FFmpeg,首先,需要初始化H264解码器: 然后,使用创建TCP连接到我们的Android端,读取数据包: 再把每

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包