[github author="zzzhxxx" project="easy-video-separate"][/github]

[github author="FFmpeg" project="FFmpeg"][/github]

前言

最近会了很多新东西,到时候会慢慢全部写下来,先把这个写下来

开始

首先是文件选择,这次放弃了上次使用的win32ui因为这次需要把抽出来的帧放到一个文件夹里,所以用python自带的tkinter

import tkinter as tk
from tkinter import filedialog
root=tk.Tk()
root.withdraw()

FFmpeg

因为涉及视频处理,所以要使用ffmpeg,目前主要有两种通过python使用的方法,第一种是使用anaconda和pip一起安装库和依赖,另一种是下载ffmpeg的发行版通过shell调用,因为第一种太烦这里使用第二种

import subprocess

首先引入subprocess

subprocess其实可以比喻成一个包壳的命令行,原则上可以在命令行中实现的事情都可以使用subprocess在python中实现,固然可以实现ffmpeg

subprocess.Popen(ffmpegpath +' -i'+ ' ' + filename+ ' ' +'-qscale:v 1 -qmin 1 -qmax 1 -vsync 0 ' + pathname +'/frame%08d.png', shell=True)

这里的ffmpegpath filename pathname会稍后再提

路径处理

这里来处理上文提到的路径

ffmpegpath代表了ffmpeg的文件位置,因为和代码在一个文件夹下,所以可以直接定义

import os
ffmpegpath=os.getcwd()+'/ffmpeg/bin/ffmpeg.exe'

filename是用来储存视频文件的路径的变量,而pathname是用来储存输出文件夹路径的变量,这个时候就需要用到上面引入的tkinter了

pathname=filedialog.askdirectory()
filename=filedialog.askopenfilename()

这样路径也就处理好了

现在再来看subprocess部分的代码就很好理解,用单引号框住的全是ffmpeg的变量,剩下的则是我们定义的变量

最终效果

这里以一段海贼王的视频为例

视频

输出文件夹选择新一个叫做tmp_frames的文件夹

选择文件

在终端检查一下运行状况

输出文件夹

总结

至此工作就已经大致结束了,ffmpeg还可以实现很多其他的功能,像转码录屏等等,我这里抽帧是为了输送到realesrgan进行超分,ffmpeg的github参考在这篇文章的顶部,另外一个是这篇文章的代码