opencv录制视频python_Python-OpenCV录制H264编码的
MP4视频
前⾔
因最近项⽬需求涉及计算机视觉相关内容,需要实现在Python录制视频,并且录制完成后可在浏览器前端中进⾏视频回放的功能;特写下此篇⽂章以记录整体实现过程。
2019-08-02 更新
之前⼀直在忙别的事,没有继续深⼊探究,这篇⽂章也暂时搁置了;但是最近发现之前的实现⽅式(录制avi视频后由Java调⽤FFmpeg转换为mp4)会影响到系统的性能,原因为调⽤FFmpeg转换视频时CPU占⽤较⾼QAQ,于是在此前的基础上继续寻解决⽅式。
c语言必背18个程序降低FFmpeg的CPU占⽤
既然FFmpeg的CPU占⽤较⾼,那么我们⾸先尝试如何降低对CPU的占⽤,搜索发现可以在FFmpeg命令中添加-threads参数来指定CPU 的使⽤
FFmpeg转换测试python入门教程视屏
纯个人博客
此次测试均使⽤相同avi视频⽂件,⼤⼩为113
1. 原始转换命令
ffmpeg -i test.avi -vcodec libx264 -f mp4 test.mp4
# 转换⽤时 30s~31s
# CPU占⽤ 950%~1000%
复制代码
2. 添加-threads 6参数
ffmpeg -i test.avi -threads 6 -vcodec libx264 -f mp4 test.mp4
# 转换⽤时 45s~46s
# CPU 占⽤490%~550%
复制代码
3. 添加-threads 2参数
ffmpeg -i test.avi -threads 2 -vcodec libx264 -f mp4 test.mp4
# 转换⽤时 87s~88s
# CPU占⽤ 205%~230%
复制代码
可以看出,添加-threads参数后CPU的占⽤确实少了,但相应的视频转换耗时也增加了,显然这不是我们想要的效果;所以还是逃避不了录制H264视频的问题
编译安装OpenCV录制视频
之前⼀直⽆法录制H264编码的MP4视频是因为使⽤的为pip安装的opencv-python,这个库中⾃带FFmpeg,所以不论我们如何折腾系统的FFmpeg都不会有任何作⽤;如果我们想要调⽤系统的FFmpeg则需要⼿动编译安装OpenCV。具体原因可以参考下图:
pragmatics复制代码
初始化VideoWriter
⼊参参考:官⽅⽂档
out = cv2.VideoWriter( './test.mp4', encode, 10, (width, height), True)复制代码
获取图像帧并写⼊视频⽂件
循环从摄像头/视频中获取单帧图像
新开⼀个窗⼝展⽰图像帧,每隔25毫秒播放下⼀帧,键⼊“q”跳出循环
将图像帧写⼊视频⽂件
while True:
if cv2.waitKey(25) & 0xFF == ord('q'):
break
ret, frame = ad()
cv2.imshow('test', frame)
out.write(frame)
复制代码
释放资源
释放VideoWriter
释放摄像头
关闭窗⼝
新闻网站设计lease()
cv2.destroyAllWindows()
复制代码
完整代码
此处代码为演⽰demo,仅供参考
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
# 调⽤摄像头
cap = cv2.VideoCapture(0)
# 获取摄像头宽⾼
width = (cv2.CAP_PROP_FRAME_WIDTH))jupyter notebook手机版
height = (cv2.CAP_PROP_FRAME_HEIGHT))
# 获取摄像头帧率
#fps = (cv2.CAP_PROP_FPS)
# 指定fourcc编解码
encode = cv2.VideoWriter_fourcc(*'mp4v')
# 初始化VideoWriter
out = cv2.VideoWriter('./test.mp4', encode, 10, (width, height), True)
while True:
# 每隔25毫秒播放下⼀帧,若键⼊“q”跳出循环
if cv2.waitKey(25) & 0xFF == ord('q'):
break
# 从摄像头获取下⼀帧
ret, frame = ad()
# 新开窗⼝展⽰图像
cv2.imshow('test', frame)
# 将当前帧写⼊视频⽂件
out.write(frame)
# 释放VideoWriter
# 释放摄像头
# 关闭窗⼝
cv2.destroyAllWindows()
复制代码
浏览器中播放视频
环境
macOS Mojave 10.14.3
Ubuntu 16.04
vue 2.9.6
nginx 1.15.5
前端为vue项⽬,打包后部署在nginx,配置server块/location块提供图⽚/视频等静态资源访问h5中video⽆法播放视频问题
问题排查
代码错误
python录制视频是否成功
前端中video的src是否正确⽹络请求
浏览器控制台是否报错nginx服务是否启动
请求路径是否正确
是否跨域问题
浏览器⽀持
格式
IE
Firefox
Opera
Chrome
Safari
Ogg
-
3.5+
10.5+
5.0+
-
MPEG 4
9.0+
-
-
5.0+
3.0+
WebM
-
4.0+
10.6+
6.0+
-
视频编解码
格式
视频编码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。