当前位置:   article > 正文

图像处理之opencv保存视频+wave保存音频+ffmpeg合并_opencv获取视频声音并保存

opencv获取视频声音并保存

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述

1.2、灰色处理

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

在这里插入图片描述

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

1.3.1、查看视频的分辨率

gray.shape
  • 1
(720, 1280)
  • 1
  • 返回的数据为高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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

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
  • 2
  • 3

1.3.2、调用写入函数保存

writer.write(gray)
  • 1

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))
  • 1
  • 2
  • 3
  • 4
该视频的宽=1280,=720
  • 1

(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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25


2、wave保存音频

2.1、读入音频

import wave
music = wave.open(r'./铃声-野狼disco-铃声版.wav', mode='rb')
music
  • 1
  • 2
  • 3
---------------------------------------------------------------------------
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

2.2、ffmpeg转换格式

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

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

2.3、重新读入音频

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

2.4、获取音频参数

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

2.5、音频切片

(1)转化音频数据形状

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

(2)切片

part1 = data[:15*44100]#切片,切出前15秒,44100是framerate=44100
part1
  • 1
  • 2
array([[   0,    0],
       [   0,    0],
       [   0,    0],
       ...,
       [1652, 8927],
       [1407, 7052],
       [1355, 5892]], dtype=int16)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3、音频和无声视频合并

import subprocess
cmd = 'ffmpeg -i new_music.wav -i star_gray.mp4 out.mp4'
subprocess.call(cmd)#返回‘0’就说明合并成功了
  • 1
  • 2
  • 3
  • subprocess库可以控制cmd命令到控制台执行
  • 合并前需要安装ffmpeg并配置环境变量
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号