用ffmpeg进行视频处理

1.下载及安装

在ffmpeg官网https://ffmpeg.zeranoe.com/builds/可以下载到需要的版本,然后解压到D盘,添加环境变量(如D:\ffmpeg\bin)
用ffmpeg进行视频处理_第1张图片
在cmd输入ffmpeg,出现如图现象,即为安装成功

2.使用

class video():
    def __init__(self):
        print('(1)视频合并\n(2)视频剪辑\n(3)视频格式转换\n(4)提取音频')
        print('(5)视频拆分成帧图片\n(6)帧图片合成视频')
        b = eval(input('请选择:\n'))
        if(b==1):
            self.video_convert()
        elif(b==2):
            self.video_clip()
        elif(b==3):
            self.video_format_conversion()
        elif(b==4):
        	#提取音频
            print('请输入视频的存储路径:')
            video = input(r'')
            cmd = 'ffmpeg -i {} -f mp3 -vn output.mp3'.format(video)
            subprocess.call(cmd,shell=True)
            print('提取完成!')
        elif(b==5):
            self.video_frame_photo()
        elif(b==6):
            self.frame_photo_video()
        else:
            print('输入有误!')  
    #视频合并
    def video_convert(self):
        print('请输入视频个数:')
        num = eval(input())
        filelist = open('filelist.txt','a')
        for i in range(num):
            print('请输入视频%d的存储路径:'%(i+1))
            a = input(r'')
            filelist.write("file '"+ a +"'\n")
        filelist.close()
        cmd = 'ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4'
        subprocess.call(cmd,shell=True)
        os.remove(filelist)
        print('合并完成!')
    #视频格式转换
    def video_format_conversion(self):
        print('请输入视频路径:')
        video = input(r'')
        cap = cv2.VideoCapture(video)
        width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        style = input('请输入要转换的视频格式:')
        cmd = 'ffmpeg -i {} -s {}x{} -vcodec libxvid -qscale 1 -acodec aac output.{}'.format(video,width,height,style)
        subprocess.call(cmd,shell=True)
        print('转换完成!')
    #视频剪辑
    def video_clip(self):
        print('请输入视频路径:')
        video = input(r'')
        print('请输入开始时间:')
        start = input()
        print('请输入结束时间:')
        end = input()
        cmd = 'ffmpeg -i {} -ss {} -c copy -to {} output.mp4'.format(video,start,end)
        subprocess.call(cmd,shell=True)
        print('剪辑完成!')
    #视频拆分成帧图片
    def video_frame_photo(self):
        print('\t请输入视频的存放路径:')
        videos_path = input(r'') #视频的存放路径
        print('\t请输入帧图片的存放路径:')
        frames_save_path = input(r'') #视频切分成帧之后图片的保存路径
        print('\t每几帧中保存1帧?')
        time_interval = eval(input()) #每1帧保存一次    
        vidcap = cv2.VideoCapture(videos_path)
        success, image = vidcap.read()
        count = 0
        while success:
            success, image = vidcap.read()
        count = count + 1
        if count % time_interval == 0:
            cv2.imencode('.jpg', image)[1].tofile(frames_save_path + "frame%d.jpg" % count)
            print('拆分完成!')
    #帧图片合成视频
    def frame_photo_video(self):
        print('\t请输入帧图片存放路径:')
        im_dir = input(r'')#帧存放路径
        print('\t请输入合成视频的存放路径:')
        video_dir = input(r'') #合成视频存放的路径
        print('\t请输入帧率:')
        fps = eval(input()) #帧率
        im_list = os.listdir(im_dir)
        im_list.sort(key=lambda x: int(x.replace("frame","").split('.')[0]))
        img = Image.open(os.path.join(im_dir,im_list[0]))
        img_size = img.size #获得图片分辨率,im_dir文件夹下的图片分辨率需要一致
        fourcc = cv2.VideoWriter_fourcc(*'XVID') 
        videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
        for i in im_list:
            im_name = os.path.join(im_dir+i)
            frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
            videoWriter.write(frame)
        videoWriter.release()
        print('合成完成!')
if __init__== '__main__':
	video()

此外,还有一些其他功能:

4.其它功能

提取无声视频

ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4

合并两个音频

ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex amerge -ac 2 -c:a libmp3lame -q:a 4 output.mp3

提取字幕:

ffmpeg -i input.mkv -vn -an -codec:s:0 srt subtitle.srt

添加字幕:

ffmpeg -i input.mkv -vf subtitles=subtitle.srt output.mp4

你可能感兴趣的:(用ffmpeg进行视频处理)