一、引言
老猿从来没有录播个视频课件,但最近有要求在一周内必须录制一个视频课件,为此花了3天时间准备ppt,花了一个小时录播了一个20多分钟的课件。
由于第一次干这个活,讲课时情绪还是有点紧张,导致录播的语音出现了各种重复、不该有的间断、两页切换时课件讲解过快、部分词语发音不准等问题,导致效果一团糟。
为了解决这些问题,又使用剪辑软件进行了剪辑,光剪辑就花了2天时间,结果效果还是不好,最后想到了一个办法,就是废掉原录播材料,将ppt导出成图像,然后逐页录音,再使用合成软件将图像和音频逐一匹配,再进行制作。花了40多分钟逐页录音并试听,最后花了半天时间制作和输出,终于赶上最后的截止时间前上交了视频。如果最开始就用这个方法,可以节省大部分时间。
基于上述过程,老猿又想到最后这个处理过程完全不需要使用合成软件,而是使用moviepy是否更好呢?今天付诸行动,发现使用moviepy进行合成比图形操作界面的合成软件效果更好,完美地解决了音频和ppt材料的协同问题。下面就详细介绍一下这个过程,供ppt视频课件制作生手提供一个可以高效制作视频的方法。
二、ppt视频课件制作过程
2.1、将ppt保存为一张张图像
打开ppt,选择:文件 --> 另存为,保存类型选择为png或jpg,如图:
然后点击保存,出现:
选择“每张幻灯片”。
这样就可以将每页ppt导出成图片了,如:
相关图片会输出到一个单独的目录,以“幻灯片xx.png”等形式逐页输出保存。
2.2、按页录音
对照ppt每页的内容,将该页讲解的语音使用手机录音软件等方式录制成一个个音频文件,下面是老猿录制的音频文件目录:
注意,在以上录音时,第18页和20页录制成了2段,这种方式处理和其他页面不一样,是不适合用程序来处理的,除非对此针对性的改造。
2.3、编写代码进行合成
代码的说明与注释,不单独进行补充说明,完整代码如下:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
from moviepy.editor import *
import os,traceback
def isdigit(c):
return c> = '0' and c< = '9'
def getpattern(patternstring):
"""
:param patternstring: 含有模式串的字符串,模式串仿c语言整型输出格式,类似于:%d、%02d等
:return: 返回将patternstring拆分成三段的一个列表,三个元素分别是:模式串前面的字符串、模式串(含百分号、数字和d)、模式串后面的字符串,如果没有找到模式串则返回none
"""
patternindex = patternstring.index( "%" )
if patternindex< 0 :
print ( "模式字符串中未发现模式匹配符:%" )
return none
matched = false
for patternend in range (patternindex + 1 , len (patternstring)):
if patternstring[patternend] in 'dd' :
matched = true
break
else :
if not isdigit(patternstring[patternend]):
print ( "模式字符串中的模式存在非数字" )
return none
if matched: return [patternstring[:patternindex],patternstring[patternindex:patternend + 1 ],patternstring[patternend + 1 :]]
else :
print ( "模式字符串中的模式不是字母d结尾" )
return none
def composepptimgsandsounds(imgfilepattern,soundfilepattern,startseq = 1 ,endseq = none):
"""
:param imgfilepattern: 图像文件模式,要求图像文件中必须含文件序号,序号采用%d、%02d/%03d的方式来识别
:param soundfilepattern:音频文件格式,要求文件中必须含文件序号,序号采用%d、%02d/%03d的方式来识别
:param startseq:文件序列号其实值,一般为0或1
:param endseq:文件序列号结束值,可以不填
:return:生成的视频
"""
if endseq is none:endseq = 9999999 #当对应序号找不到文件时结束
patterns = getpattern(imgfilepattern)
if patterns is none:
print ( '图像文件名不符合模式格式要求' )
return none
else :
imgprefix,imgpattern,imgpostfix = patterns
patterns = getpattern(soundfilepattern)
if patterns is none:
print ( '音频文件名不符合模式格式要求' )
return none
else :
soundprefix, soundpattern, soundpostfix = patterns
clips = []
try :
for seq in range (startseq,endseq):
imgfname = f "{imgprefix}{seq:{imgpattern[1:]}}{imgpostfix}"
soundfname = f "{soundprefix}{seq:{soundpattern[1:]}}{soundpostfix}"
if os.path.exists(soundfname) and os.path.exists(imgfname):
soundclip = audiofileclip(soundfname)
imgclip = imageclip(imgfname).set_duration(soundclip.duration).set_fps( 2 ).set_audio(soundclip)
clips.append(imgclip)
else :
if seq:
print (f "音视和图像文件加载结束,最后一个文件的序号为{seq}" )
break
else :
print (f "图像文件{imgclip}或音频文件{soundclip}不存在" )
return none
except exception as e:
print (f "加载音频和图像文件失败:\n{e}\n{traceback.format_exc()}" )
return none
print ( "输出视频文件...." )
clip = concatenate_videoclips(clips, 'compose' )
clip.write_videofile(r "c:\temp\ppt.mp4" ,threads = 8 )
print ( "视频文件已经生成" )
return clip
composepptimgsandsounds(r 'f:\bak\pr\大h\十百千\视频制作\5g在线计费动态授权机制介绍3.9\幻灯片%d.png' ,r 'c:\temp\录音文件\p%d.m4a' )
|
如果不了解moviepy的,请参考《 python音视频剪辑库moviepy1.0.3中文教程导览及可执行工具下载》的导览式介绍。
三、效果
使用该方式制作的视频,比图形界面合成软件制作的视频效果更流畅、大小更小、制作时间也更短,大小大概是图形界面视频合成软件的不到十分之一,视频输出时间是图形界面合成软件手工输出的四分之一,还省了手工去进行合成剪辑的过程(非熟练人员一般需要1-2个小时),老猿20分钟的视频课,含录音、试听及部分重录时间,整个制作过程不到70分钟(不含代码编写时间),是不是特别好用?
不过注意,老猿上面的案例处理到第18页时就认为课件完结了,要将整个课件处理完,需要合并18页和20页的音频输出到其他音频文件类似的音频文件中。
四、小结
本文介绍了一种ppt视频课件快速制作的方法,通过将ppt输出成一张张图片,然后逐页配音,最后使用moviepy将其合成输出,课件制作又快又好。由于采用了分页录音的方式,对于讲解不好的地方很快就可以更换,因此比期望一次性录播然后剪辑的效果要好很多,同时输出的视频文件小、输出快。
以上就是python快速将ppt制作成配音视频课件的操作方法的详细内容,更多关于python ppt配音视频课件的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/LaoYuanPython/article/details/118001884