文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何用 Python 和 EV 剪辑短视频

2024-12-03 01:32

关注

 现在小视频非常流行,如何进行高效简便的视频剪辑,是各个up主的必备技能。本文借助python和EV剪辑制作我们所要的视频效果,不仅免费,而且没有广告水印。

一、将图片转化成视频

通过python的opencv库就可以把图片转成视频,要注意的是把帧率设置成30,方便后续和其他视频拼接,因为帧率不同会导致拼接出错。 

  1. import cv2,os  
  2. import matplotlib.pyplot as plt  
  3. from PIL import Image  
  4. canshu=0.5  #设置视频分辨率参数  
  5. img = Image.open('中国票据发展报告.jpg')  
  6. img.save('ddd.jpg')  
  7. img = cv2.imread('ddd.jpg') #设置一个图片的大小作为指定大小  
  8. imgimgInfo = img.shape  
  9. size = (int(imgInfo[1]*canshu),int(imgInfo[0]*canshu))  
  10. fourcc = cv2.VideoWriter_fourcc('M','J','P','G')   
  11. videoWrite = cv2.VideoWriter('3.avi',fourcc,30,size,True)  #参数依次是:文件路径;指定编码器;帧率;画面大小;是彩色还是黑色  
  12. file_list = os.listdir('./1//')   #获取文件夹里的列表  
  13. for i in range(0,len(file_list)):  
  14.     fileName ='./1//'+file_list[i] 
  15.     img = Image.open(fileName)  
  16.     #根据样本图片调整图片大小  
  17.     (x00,y00) = img.size  
  18.     x_s = x00*canshu  
  19.     y_s = int(y00 * x_s / x00)   
  20.     imgimg = img.resize(size,Image.ANTIALIAS)  
  21.     img.save('ddd.jpg')  
  22.     img = cv2.imread('ddd.jpg') #读取图像  
  23.     #因为是单张图片的时间太短,每一张图片插入20帧  
  24.     for j in range(0,20):  
  25.         videoWrite.write(img)  
  26. videoWrite.release() 

但是如果要将图片做一些简单的动画效果,例如做一个画面逐渐缩小的动画,那就要借助EV剪辑,调整图片的大小,加上白背景,然后导出视频。

注意导出的时候要设置帧率,如果时间过长,可以设置设置帧率低一点,然后用python程序把播放速度提升,帧率也会相应提高。 

  1. import cv2  
  2. vdop = "4.mp4"#输入视频路径  
  3. cap = cv2.VideoCapture(vdop)   
  4. fps = cap.get(cv2.CAP_PROP_FPS) #获取输入视频的帧率 
  5. size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),  
  6.         int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))#获取输入视频的大小  
  7. fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')  #These are the FOURCCs to compressed formats  
  8. out_path = "8.mp4" #输出2倍速的avi格式的视频路径  
  9. output_viedo = cv2.VideoWriter()  
  10. fps = (29.5/26.8)*fps #2倍速处理  
  11. #isColor:如果该位值为Ture,解码器会进行颜色框架的解码,否则会使用灰度进行颜色架构  
  12. output_viedo.open(out_path , fourcc, fps, size, isColor=True 
  13. rval = True  
  14. while rval:  
  15.     rval, img = cap.read()#逐帧读取原视频  
  16.     output_viedo.write(img)#写入视频帧  
  17. output_viedo.release()  
  18. cap.release() 

用opencv处理过的视频会失去音频。我们也可以使用ffmpeg来调速,可以保留声音,特别适合微调。要使用FFmpeg,安装完之后,设置环境变量,就能在python调用FFmpeg。 

  1. import os  
  2. os.system('ffmpeg -i 4.mp4 -vf  "setpts=2*PTS" 8.mp4')  #图像两倍慢速  

二、将视频添加音频作为背景音乐 

  1. import subprocess,os  
  2. mp4_f = './2.avi'  
  3. mp3_f = './背景音.mp3'  
  4. n_mp4_n = 'new' + mp4_f.split('/')[-1] 
  5. n_mp4_f = mp4_f.replace(mp4_f.split('/')[-1],n_mp4_n)  
  6. com = f'D:\\ffmpeg\\bin\\ffmpeg.exe -i "{mp3_f}" -i "{mp4_f}" ' \ f' -acodec copy -vcodec copy "{n_mp4_f}"'  
  7. print(com)  
  8. os.system(com) 

三、合并视频

剪切视频 

  1. import os  
  2. import subprocess,cv2  
  3. com = f'ffmpeg -i 5.mp4 -c copy -t 00:00:20.0 output.mp4'  # 截取前20秒  -ss 00:00:00.0   起始位置  
  4. os.system(com) 

要将不同的视频合并,首先要确保帧率和画布大小一样,这样才能确保合并起来不出错。下面代码是调整画布。将形状不同的视频画面,要按照原视频的比例,调整到一个框里面去。 

  1. import subprocess,os  
  2. import cv2  
  3. #获取样本的画布大小  
  4. video_path = "2\\1.mp4"  
  5. cap = cv2.VideoCapture(video_path)  
  6. frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))# 获取视频高度  
  7. frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 获取视频宽度  
  8. fps = cap.get(cv2.CAP_PROP_FPS) #视频平均帧率  
  9. h0=frame_height  
  10. w0=frame_width  
  11. file_list = os.listdir('3\\')   #获取文件夹里的所有文件列表  
  12. for i in file_list:  
  13.   #获取当前视频的  
  14.   video_path = '3\\'+i  
  15.   cap = cv2.VideoCapture(video_path)  
  16.   frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 
  17.   # 获取视频高度、宽度  
  18.   frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  
  19.   h=frame_height  
  20.   w=frame_width   
  21.   if h/w>h0/w0:    
  22.     strn=f'ffmpeg -i %s -vf "scale=(%s*%s/%s):%s,pad=%s:%s:(%s-(%s*%s/%s))/2:0:black" %s'%  (video_path,w,h0,h,h0,        w0,h0,w0,w,h0,h,i)  
  23.   else:               
  24.      strn=f'ffmpeg -i  %s -vf "scale=%s:%s*%s/%s,pad=%s:%s:0:((%s-(%s*%s/%s))/2):black"  %s'%    (video_path,w0,w0,h,w,       w0,h0,          h0,w0,h,w,i)  
  25.                               #本图缩放后=宽:高,位置=总宽:总高:水平方向放置的位置:垂直方向放置的位置  
  26.   os.system(strn) 

将视频合并

将视频先转化成ts格式,然后再合并,成功率更高。 

  1. import os  
  2. lista='kaishiwizhi'  
  3. #先获取这些MP4文件,转换成ts格式  
  4. for each in os.listdir():  
  5.     if each[-3:] in ['mp4','avi'] :  
  6.         os.system('ffmpeg.exe -i %s -c copy -vbsf h264_mp4toannexb %s.ts' % (each, each[:-4]))  
  7.         listalista=lista +('|%s.ts'%(each[:-4]))  
  8. listalista=lista.replace('kaishiwizhi|','')  
  9. import subprocess,cv2  
  10. #subprocess.call(cmd, shell=True 
  11. com = f'ffmpeg -i "concat:%s" -c copy 333333.avi'%lista  
  12. #com = f'mencoder -forceidx -of lavf -oac copy -ovc copy -o output.avinew 2.avi new 2.avi'  
  13. print(com)  
  14. os.system(com)  

 

来源:Python中文社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯