用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视频剪辑的资料请关注毛票票其它相关文章!