文章目录
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、设置保存对象参数
- 视频保存地址
- 视频编码格式
- 视频采样频率
- 视频的尺寸
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并配置环境变量