python 脚本中的 ffmpeg
ffmpeg in python script
我想 运行 在 python 脚本中执行以下命令,我还想让它循环播放一个文件夹中的多个视频。这是我要 运行.
的命令
ffmpeg -i mymovie.avi -f image2 -vf fps=fps=1 output%d.png
我想把它装成这样:
import ffmpy
import os
path = './Videos/MyVideos/'
for filename in os.listdir(path):
name = filename.replace('.avi','')
os.mkdir(os.path.join(path,name))
*ffmpeg command here*
我找到了一个名为 ffmpy 的 ffmpeg 包装器,这可以作为解决方案吗?
From a brief look at FFMPY, you could do this using ffmpy.FFmpeg, as that allows any and all FFMPEG command line options, including -f. -- 单击 link 获取文档。
您可以使用 os.system
执行 FFMPEG 命令。无论如何,您都需要导入 OS 以遍历文件。
虽然您需要遍历目录中的所有文件。这将是更具挑战性的一点,不过使用 for 循环很容易。
for filename in os.listdir(path):
if (filename.endswith(".mp4")): #or .avi, .mpeg, whatever.
os.system("ffmpeg -i {0} -f image2 -vf fps=fps=1 output%d.png".format(filename))
else:
continue
以上代码遍历 path
处的目录,并使用命令提示符执行给定的 FFMPEG 命令,使用文件名(如果它是视频文件)代替 mymovie.avi
在 https://github.com/Tee0125/pydemux 中试用 pydemux。 Pydemux 模块可以提取 Pillow Image 格式的视频帧
from PyDemux import Video
v = Video.open('video.mov')
i = 0
while True:
im = v.get_frame()
if im is None:
break
im.save('output%d.png'%i)
i = i + 1
这是一种在 python 脚本中使用 ffmpeg 的方法,例如用于提取每个视频的最后 10 秒:
ffmpeg -sseof -10 -i input.mp4 output.mp4
要将其应用于整个 mp4 文件文件夹:
from pathlib import Path
import os
suffix = ".mp4"
input_path= Path.home() / "Desktop/foo"
file_paths= [subp for subp in input_path.rglob('*') if suffix == subp.suffix]
file_paths.sort()
output_path = Path.home() / "Desktop/foo/new"
output_path.mkdir(parents=True, exist_ok=True)
for file_p in file_paths:
input = str(file_p)
output = str( output_path / file_p.name )
command = f"ffmpeg -sseof -10 -i {input} {output}"
print(command)
os.system(command)
没有评论的声誉,因此添加另一个回复。
ocelot 答案的另一个版本,具有更易读的 f 字符串语法 python -
for filename in os.listdir(path):
if (filename.endswith(".mp4")): #or .avi, .mpeg, whatever.
os.system(f'ffmpeg -i {filename} -f image2 -vf fps=fps=1 output%d.png')
else:
continue
我想 运行 在 python 脚本中执行以下命令,我还想让它循环播放一个文件夹中的多个视频。这是我要 运行.
的命令ffmpeg -i mymovie.avi -f image2 -vf fps=fps=1 output%d.png
我想把它装成这样:
import ffmpy
import os
path = './Videos/MyVideos/'
for filename in os.listdir(path):
name = filename.replace('.avi','')
os.mkdir(os.path.join(path,name))
*ffmpeg command here*
我找到了一个名为 ffmpy 的 ffmpeg 包装器,这可以作为解决方案吗?
From a brief look at FFMPY, you could do this using ffmpy.FFmpeg, as that allows any and all FFMPEG command line options, including -f. -- 单击 link 获取文档。
您可以使用 os.system
执行 FFMPEG 命令。无论如何,您都需要导入 OS 以遍历文件。
虽然您需要遍历目录中的所有文件。这将是更具挑战性的一点,不过使用 for 循环很容易。
for filename in os.listdir(path):
if (filename.endswith(".mp4")): #or .avi, .mpeg, whatever.
os.system("ffmpeg -i {0} -f image2 -vf fps=fps=1 output%d.png".format(filename))
else:
continue
以上代码遍历 path
处的目录,并使用命令提示符执行给定的 FFMPEG 命令,使用文件名(如果它是视频文件)代替 mymovie.avi
在 https://github.com/Tee0125/pydemux 中试用 pydemux。 Pydemux 模块可以提取 Pillow Image 格式的视频帧
from PyDemux import Video
v = Video.open('video.mov')
i = 0
while True:
im = v.get_frame()
if im is None:
break
im.save('output%d.png'%i)
i = i + 1
这是一种在 python 脚本中使用 ffmpeg 的方法,例如用于提取每个视频的最后 10 秒:
ffmpeg -sseof -10 -i input.mp4 output.mp4
要将其应用于整个 mp4 文件文件夹:
from pathlib import Path
import os
suffix = ".mp4"
input_path= Path.home() / "Desktop/foo"
file_paths= [subp for subp in input_path.rglob('*') if suffix == subp.suffix]
file_paths.sort()
output_path = Path.home() / "Desktop/foo/new"
output_path.mkdir(parents=True, exist_ok=True)
for file_p in file_paths:
input = str(file_p)
output = str( output_path / file_p.name )
command = f"ffmpeg -sseof -10 -i {input} {output}"
print(command)
os.system(command)
没有评论的声誉,因此添加另一个回复。
ocelot 答案的另一个版本,具有更易读的 f 字符串语法 python -
for filename in os.listdir(path):
if (filename.endswith(".mp4")): #or .avi, .mpeg, whatever.
os.system(f'ffmpeg -i {filename} -f image2 -vf fps=fps=1 output%d.png')
else:
continue