图像处理之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并配置环境变量
发布了68 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ayouleyang/article/details/104101049