用opencv实现视频音频提取和画面灰度
成果展示
python边缘检测视频
1.提取视频
1.1首先从网上下载一个视频
贝贝,然后输入你要解析的b站视频BV号,下载mp4格式
2.2 下载依赖
pip3 insntall moviepy==1.0.0#1.0.0的能用write_videofile()
pip3 install PyAudio
pip3 install winsound
pip3 install opencv-python
pip3 install librosa
2.3 提取视频代码
import cv2 as cv#导入opencv
import numpy as np
import librosa.display
import matplotlib.pyplot as plt
# 单张测试
#img=cv.imread("d:\\cry\\Videos\\Captures\\710027277-1-208.mp4") #读取图片
#ca=cv.Canny(img,100,100) #边缘检测
#ga=cv.GaussianBlur(img, (5, 5), 0) #高斯模糊
#cv.namedWindow('canny',0)
#cv.resizeWindow('canny', 700, 500)
#cv.imshow("canny",ca)
#cv.waitKey(0)
#cv.namedWindow('Blurred Image',0)
#cv.resizeWindow('Blurred Image', 700, 500)
#cv.imshow("Blurred Image",ga)
#cv.waitKey(0)
# 1.源视频处理
capture = cv.VideoCapture("d:\\cry\\Videos\\Captures\\710027277-1-208.mp4") # 首先获取并打开源视频,这个自己弄好路径就好,不要有中文
# 获取开始帧和介绍帧,start和end 是我们想要从整个视频中想要截取的一小段视频的开始和结束
start = 0
# 2.创建一个写入视频对象
# 下面三个cap.get我加了int()强制类型转换,因为返回的是float类型,在创建写入视频对象时不允许,也有可能有的opencv版本不需要,大家可以自行尝试判断,加一个不碍事
weight=int(capture.get(cv.CAP_PROP_FRAME_WIDTH)) #获取视频的长宽和fps
height=int(capture.get(cv.CAP_PROP_FRAME_HEIGHT))
fps=int(capture.get(cv.CAP_PROP_FPS))
# fourcc = cv.VideoWriter_fourcc('M', 'J', 'P', 'G') #用于avi格式的生成的参数
# fourcc = cv.VideoWriter_fourcc(*'mp4v') # 用于mp4格式的生成的参数
# fourcc = cv.VideoWriter_fourcc('P', 'I', 'M', 'I') # 用于avi格式的生成的参数
# videowriter = cv.VideoWriter(output, fourcc, fps, (weight, height),isColor=False) # 创建一个写入视频对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #avi,就这个好使
videowriter = cv.VideoWriter('testwrite.avi',fourcc, fps, (width, htight),False) #False表示不要颜色
# 3.开始保存目标视频
capture.set(cv.CAP_PROP_POS_FRAMES, start) # 设置开始帧
#pos = capture.get(cv.CAP_PROP_POS_FRAMES) # 获取当前帧数
# while capture.get(cv.CAP_PROP_POS_FRAMES)!=None: # 读取全部帧数
while capture.isOpened(): # 读取全部帧数
# while pos<end: # 从start到end之间读取帧数
ret, frame = capture.read() # 从开始帧开始读取,之后会从开始帧依次往后读取,直到退出循环
if ret==True:
ca=cv.Canny(frame,100,100) #值越大结果边缘越明显
# cv.imshow('frame',ca) #展示
videowriter.write(ca)
if cv.waitKey(10) & 0xFF == ord('q'):
break
else:
break
#pos = capture.get(cv.CAP_PROP_POS_FRAMES) # 获取当前帧数pos
videowriter.release() # 关闭写入视频对象
capture.release() # 关闭读取视频对象
cv.destroyAllWindows()
2.提取音频代码
import moviepy.editor as mpy
audio_background = mpy.AudioFileClip(r'10027277-1-208.mp4')
audio_background.write_audiofile(r'testwrite.wav') #保存
PlaySound('testwrite.wav',flags=1) #播放音频
- 展示声音图
audio, freq = librosa.load('testwrite.wav')
time = np.arange(0, len(audio)) / freq
print(len(audio), type(audio), freq, sep="\t")
audio, _ = librosa.effects.trim(audio)
librosa.display.waveshow(audio, sr=freq)
plt.show()
- 测试声音
import time
PlaySound("testwrite.wav",flags=1)
time.sleep(5)
PlaySound(None,flags=1)
3.播放声音和视频代码
name='testwrite.avi'
# name='./target.mp4'
def main():
# 1.初始化读取视频对象
cap = cv.VideoCapture(name)
#声音
PlaySound(None,flags=1) #None表示关闭,先关闭所有的然后再开
PlaySound('testwrite.wav', flags=1) #flag=1表示异步 2表示同步播放声音
# 2.循环读取图片
while cap.isOpened():
ret, frame = cap.read()
if ret:
#展示cv库视频
cv2.imshow("frame", frame)
else:
print("视频播放完成!")
break
# 退出播放
key = cv.waitKey(25)
if key == 27: # 按键esc
PlaySound(None,flags=1)
break
# 3.释放资源
cap.release()
cv.destroyAllWindows()
if __name__ == '__main__':
print("begin")
main()
4.合成wav和avi为mp4
audioclip = mpy.AudioFileClip("testwrite.wav")
audioclip =mpy.AudioFileClip(r'10027277-1-208.mp4').subclip(1,60)
videoclip = mpy.VideoFileClip("testwrite.avi").subclip(1,60)
videoclip2 = videoclip.set_audio(audioclip)
video = mpy.CompositeVideoClip([videoclip2])
""" *** bitrate 设置比特率,比特率越高, 合并的视频越清晰,视频文件也越大,合并的速度会很慢"""
# video.write_videofile("testwrite.mp4", codec='mpeg4',fps,(width,height))
# video.write_videofile("testwrite.mp4", codec='mpeg4')
# video.write_videofile("testwriteLibmp3lame.mp4",audio_codec="libmp3lame")
# video.write_videofile("testwriteWav32.mp4",audio_codec="pcm_s32le")
video.write_videofile("testwriteWav16.mp4",audio_codec="pcm_s16le")
# video.to_videofile("testwrite.mp4")
audioclip.close()
videoclip.close()
video.close()
类型 | 参数 |
---|---|
map3 | libmp3lame(默认) |
ogg | libvorbis(ogv或webm时的默认) |
m4a | libfdk_acc |
16-bit wav | pcm_s16le |
32-bit wav | pcm_s32le |
哪个都试了一遍但是没声音呀,还是用PlaySound吧。
求助:
moviepy合成声音和视频后没有声音。