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