图像处理之opencv保存视频+wave保存音频+ffmpeg合并_opencv获取视频声音并保存-程序员宅基地

技术标签: opencv保存视频  计算机视觉  图像处理  wave保存音频  ffmpeg合并音频  

1、opencv保存视频

1.1、读取并展示视频

import cv2
import numpy as np

cap = cv2.VideoCapture('./vod.mp4')#加载视频
while True:
    flag, frame = cap.read()#以图片方式读取。flag为状态, frame为图片
    if flag == False:#结束退出机制
        break
    cv2.imshow('video', frame)
    if ord('q') ==cv2.waitKey(40):#键盘退出和等待
        break
#释放资源
cv2.destroyAllWindows()
cap.release()

在这里插入图片描述

1.2、灰色处理

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

在这里插入图片描述

1.3、调整视频大小——分辨率

1.3.1、查看视频的分辨率

gray.shape
(720, 1280)
  • 返回的数据为高720px,宽1280px。

1.3.2、调整视频的分辨率

  • 黑白是二维数据,不能直接cv2.write方法
# 1、先要设置好要转化的大小
gray = cv2.resize(gray, dsize = (480, 270))

# 2、将它的形状进行反转
gray = gray.reshape(270, 480, 1)

# 3、concatenate,级联,将多个ndarray数组合并到一起
np.concatenate([gray, gray, gray],axis = -1)

在这里插入图片描述

1.3、保存视频

1.3.1、设置保存对象参数

  1. 视频保存地址
  2. 视频编码格式
  3. 视频采样频率
  4. 视频的尺寸
writer = cv2.VideoWriter('./star_gray.avi', cv2.VideoWriter_fourcc('M','P','4','1'), 24, (w, h))
writer = cv2.VideoWriter('./star_gray.flv', cv2.VideoWriter_fourcc('F','L','V','1'), 24, (w, h))
writer = cv2.VideoWriter('./star_gray.mp4', cv2.VideoWriter_fourcc('M','P','4','1'), 24, (w, h))

1.3.2、调用写入函数保存

writer.write(gray)

1.4、获取视频自身的宽高

(1)方法一

cap = cv2.VideoCapture('./vod.mp4')
w = int(cap.get(propId = cv2.CAP_PROP_FRAME_WIDTH))
h  = int(cap.get(propId = cv2.CAP_PROP_FRAME_HEIGHT))
print ("该视频的宽=%s,高=%s"%(w,h))
该视频的宽=1280,=720

(2)方法二
在这里插入图片描述

1.5、保存视频源码汇总

import cv2
import numpy as np

#设置保存视频的参数
w = 480
h = 270
writer = cv2.VideoWriter('./star_gray.mp4', cv2.VideoWriter_fourcc('M','P','4','1'), 24, (w, h))

cap = cv2.VideoCapture('./vod.mp4')#加载视频
while True:
    flag, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#黑白是二维数据,不能直接cv2.write方法    
    #调整像素大小
    gray = cv2.resize(gray, dsize = (480, 270))
    gray = gray.reshape(270, 480, 1)
    #concatenate,级联,将多个ndarray数组合并到一起
    np.concatenate([gray, gray, gray],axis = -1)
    writer.write(gray)#保存视频
    cv2.imshow('video', gray)
    if ord('q') == cv2.waitKey(40):
        break
#释放资源        
cv2.destroyAllWindows()
cap.release()
writer.release()


2、wave保存音频

2.1、读入音频

import wave
music = wave.open(r'./铃声-野狼disco-铃声版.wav', mode='rb')
music
---------------------------------------------------------------------------
Error                                     Traceback (most recent call last)
<ipython-input-23-3931b967d1fa> in <module>
      1 import wave
----> 2 music = wave.open(r'./铃声-野狼disco-铃声版.wav', mode='rb')
      3 music

Error: file does not start with RIFF id

总结: wave只能保存wav,上面的wav是我直接用mp3改的格式,虽然在播放器可以播放,但是wave读取时却会报错。

2.2、ffmpeg转换格式

  • 直接在当前文件夹进入控制台,使用cmd命令
ffmpeg -i 野狼disco.mp3 music.wav

注意: 如果电脑上没有ffmpeg,需要下载安装后,配置环境变量,才能正常使用。

2.3、重新读入音频

import wave
music = wave.open(r'./music.wav', mode='rb')
music
<wave.Wave_read at 0x2c19300f548>

2.4、获取音频参数

music.getparams()
_wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=2127744, comptype='NONE', compname='not compressed')
  • 返回值分别对应 通道数 采样字节长度 采样频率 总帧数(总的采样数)

2.5、音频切片

(1)转化音频数据形状

data = music.readframes(nframes=2127744)
data = np.frombuffer(data, dtype = np.int16)#音频的格式通常都是16位;buffer缓冲器
data = data.reshape(2127744, 2)
data.shape
(2127744, 2)

(2)切片

part1 = data[:15*44100]#切片,切出前15秒,44100是framerate=44100
part1
array([[   0,    0],
       [   0,    0],
       [   0,    0],
       ...,
       [1652, 8927],
       [1407, 7052],
       [1355, 5892]], dtype=int16)

2.6、将音频写入文件夹

fp = wave.Wave_write('./new_music.wav')
#设置fp的参数
fp.setframerate(44100)
fp.setnframes(37*44100)
fp.setnchannels(2)
fp.setsampwidth(2)

#写入目录
fp.writeframes(part1.tobytes())
fp.close()

3、音频和无声视频合并

import subprocess
cmd = 'ffmpeg -i new_music.wav -i star_gray.mp4 out.mp4'
subprocess.call(cmd)#返回‘0’就说明合并成功了
  • subprocess库可以控制cmd命令到控制台执行
  • 合并前需要安装ffmpeg并配置环境变量
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ayouleyang/article/details/104101049

智能推荐

《第一行代码》(第二版)广播的问题及其解决_代码里的广播错误-程序员宅基地

文章浏览阅读2.6k次,点赞5次,收藏13次。1)5.2.1弹出两次已连接或者未连接这是因为你同时打开了流量和WiFi,他就会发出两次广播。2)5.3.1中发送自定义广播问题标准广播未能弹出消息:Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST");sendBroadcast(intent);上述已经失效了。修改:Intent intent=new Intent("com.example.broadcasttest...._代码里的广播错误

K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)-程序员宅基地

文章浏览阅读249次。作者 |平名 阿里服务端开发技术专家导读:Kubernetes 作为云原生时代的“操作系统”,熟悉和使用它是每名用户的必备技能。本篇文章概述了容器服务 Kubernet..._k8知识库

TencentOS3.1安装PHP+Nginx+redis测试系统_tencentos-3.1-程序员宅基地

文章浏览阅读923次。分别是etc/pear.conf,etc/php-fpm.conf, etc/php-fpm.d/www.conf,lib/php.ini。php8安装基本一致,因为一个服务期内有2个版本,所以注意修改不同的安装目录和端口号。可以直接使用sbin下的nginx命令启动服务。完成编译安装需要gcc支持,如果没有,使用如下命令安装。安装过程基本一致,下面是安装7.1.33的步骤。执行如下命令,检查已经安装的包和可安装的包。执行如下命令,检查已经安装的包和可安装的包。执行如下命令,检查已经安装的包和可安装的包。_tencentos-3.1

urllib.request.urlopen()基本使用_urllib.request.urlopen(url)-程序员宅基地

文章浏览阅读3.1w次,点赞21次,收藏75次。import urllib.requesturl = 'https://www.python.org'# 方式一response = urllib.request.urlopen(url)print(type(response)) # <class 'http.client.HTTPResponse'># 方式二request = urllib.request.Req..._urllib.request.urlopen(url)

如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?-程序员宅基地

文章浏览阅读1.5k次,点赞12次,收藏15次。如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?

RS485总线常识_rs485 差分走綫間距-程序员宅基地

文章浏览阅读1.2k次。RS485总线常识 2010-10-12 15:56:36| 分类: 知识储备 | 标签:rs485 总线 传输 差分 |字号大中小 订阅RS485总线RS485采用平衡发送和差分接收方式实现通信:发送端将串行口的TTL电平信号转换成差分信号A,B两路输出,经过线缆传输之后在接收端将差分信号还原成TTL电平信号。由于传输线通常使用双绞线,又是差分传输,所_rs485 差分走綫間距

随便推点

移植、制作uboot、Linux(一)_uboot制作-程序员宅基地

文章浏览阅读621次。u-boot、linux烧录_uboot制作

windows下安装git和gitbash安装教程_64-bit git for windows setup.-程序员宅基地

文章浏览阅读1.2w次,点赞10次,收藏44次。windos上git安装,git bash安装_64-bit git for windows setup.

环形链表(算法java)_java 实现环形链表-程序员宅基地

文章浏览阅读196次。环形链表(算法java)的两种解决方法_java 实现环形链表

docker部署Airflow(修改URL-path、更换postgres -->myslq数据库、LDAP登录)_airflow docker-程序员宅基地

文章浏览阅读5.7k次。Airflow什么是 Airflow?Airflow 的架构Airflow 解决哪些问题一、docker-compose 安装airflow(postgres)1、创建启动文件airflow-docker-compose.yml.1.1、添加挂载卷,需要修改airflow-docker-compose.yml的位置2、创建本地配置文件airflow.cfg2.1、如果想修改WEB URL地址,需要修改airflow.cfg中以下两个地方3、之后up -d直接启动即可web访问地址:二、存储数据库更换post_airflow docker

计算机毕业设计springboot高校教务管理系统532k79【附源码+数据库+部署+LW】-程序员宅基地

文章浏览阅读28次。选题背景:随着社会的发展和教育的普及,高校教务管理系统在现代高等教育中扮演着至关重要的角色。传统的手工管理方式已经无法满足高校日益增长的规模和复杂的管理需求。因此,开发一套高效、智能的教务管理系统成为了当今高校管理的迫切需求。选题意义:高校教务管理系统的开发具有重要的意义和价值。首先,它可以提高高校教务管理的效率和准确性。通过自动化处理学生选课、排课、考试安排等繁琐的事务,大大减轻了教务人员的工作负担,提高了工作效率。同时,系统可以实时更新学生信息和课程信息,减少了数据错误和冗余,保证了管理的准确性

javaint接收float_Java Integer转换double,float,int,long,string-程序员宅基地

文章浏览阅读132次。首页>基础教程>常用类>常用 Integer类Java Integer转换double,float,int,long,stringjava中Integer类可以很方便的转换成double,float,int,long,string等类型,都有固定的方法进行转换。方法double doubleValue() //以 double 类型返回该 Integer 的值。flo..._java integet接收float类型的参数

推荐文章

热门文章

相关标签