用python进行视频剪辑
一、目标
python,利用moviepy和pydub将一段视频进行区间切割
二、源码
importos
frommoviepy.video.io.VideoFileClipimportVideoFileClip
frompydubimportAudioSegment
defclip_video(source_file,target_file,start_time,stop_time):
"""
利用moviepy进行视频剪切
:paramsource_file:原视频的路径,mp4格式
:paramtarget_file:生成的目标视频路径,mp4格式
:paramstart_time:剪切的起始时间点(第start_time秒)
:paramstop_time:剪切的结束时间点(第stop_time秒)
:return:
"""
validate_file(source_file)
source_video=VideoFileClip(source_file)
video=source_video.subclip(int(start_time),int(stop_time))#执行剪切操作
video.write_videofile(target_file)#输出文件
defclip_audio(source_file,target_file,start_time,stop_time):
"""
利用pydub进行音频剪切。pydub支持源文件为mp4格式,因此这里的输入可以与视频剪切源文件一致
:paramsource_file:原视频的路径,mp4格式
:paramtarget_file:生成的目标视频路径,mp4格式
:paramstart_time:剪切的起始时间点(第start_time秒)
:paramstop_time:剪切的结束时间点(第stop_time秒)
:return:
"""
validate_file(source_file)
audio=AudioSegment.from_file(source_file,"mp4")
audio=audio[start_time*1000:stop_time*1000]
audio_format=target_file[target_file.rindex(".")+1:]
audio.export(target_file,format=audio_format)
defcombine_video_audio(video_file,audio_file,target_file,delete_tmp=False):
"""
利用ffmpeg将视频和音频进行合成
:paramvideo_file:
:paramaudio_file:
:paramtarget_file:
:paramdelete_tmp:是否删除剪切过程生成的原视频/音频文件
:return:
"""
validate_file(video_file)
validate_file(audio_file)
#注:需要先指定音频再指定视频,否则可能出现无声音的情况
command="ffmpeg-y-i{0}-i{1}-vcodeccopy-acodeccopy{2}".format(audio_file,video_file,target_file)
os.system(command)
ifdelete_tmp:
os.remove(video_file)
os.remove(audio_file)
defclip_handle(source_file,target_file,start_time,stop_time,tmp_path=None,delete_tmp=False):
"""
将一个视频文件按指定时间区间进行剪切
:paramsource_file:原视频文件
:paramtarget_file:目标视频文件
:paramstart_time:剪切的起始时间点(第start_time秒)
:paramstop_time:剪切的结束时间点(第stop_time秒)
:paramtmp_path:剪切过程的文件存放位置
:paramdelete_tmp:是否删除剪切生成的文件
:return:
"""
#设置临时文件名
iftmp_pathisNoneornotos.path.exists(tmp_path):
#如果没有指定临时文件路径,则默认与目标文件的位置相同
tmp_path=target_file[:target_file.rindex("/")+1]
target_file_name=target_file[target_file.rindex("/")+1:target_file.rindex(".")]
tmp_video=tmp_path+"v_"+target_file_name+".mp4"
tmp_audio=tmp_path+"a_"+target_file_name+".mp4"
#执行文件剪切及合成
clip_video(source_file,tmp_video,start_time,stop_time)
clip_audio(source_file,tmp_audio,start_time,stop_time)
combine_video_audio(tmp_video,tmp_audio,target_file,delete_tmp)
defvalidate_file(source_file):
ifnotos.path.exists(source_file):
raiseFileNotFoundError("没有找到该文件:"+source_file)
deftest_example():
"""
测试例子
:return:
"""
root_path='XXX/videos/'
video_name="test.mp4"
source_file=root_path+video_name
start_time=5
stop_time=6
#设置目标文件名
target_name=str(start_time)+"_"+str(stop_time)
target_file=root_path+"c_"+target_name+".mp4"
#处理主函数
clip_handle(source_file,target_file,start_time,stop_time)
if__name__=="__main__":
test_example()
三、遇到的问题
1.moviepy切割后的视频没有声音
解决方案:通过pydub切割后再合并
2.直接利用ffmpeg切割后,视频会出现黑屏、时间区间不准确、分辨率低
解决方案:用了各种命令也没有成功,所以放弃。。。
3.合并时,不支持mp3、wav等格式
解决方案:统一保存为mp4
以上就是用python进行视频剪辑的详细内容,更多关于python视频剪辑的资料请关注毛票票其它相关文章!