python脚本中的ffmpeg

Posted

技术标签:

【中文标题】python脚本中的ffmpeg【英文标题】:ffmpeg in python script 【发布时间】:2017-07-15 06:29:06 【问题描述】:

我想在 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 包装器,这是一个解决方案吗?

【问题讨论】:

你有没有想过你将如何做这些你可以分享的事情? 【参考方案1】:

没有评论的声誉,因此添加了另一个回复。

另一个版本的豹猫答案,使用更易读的python f-string语法-

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

【讨论】:

【参考方案2】:

这是一种在 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)

【讨论】:

【参考方案3】:

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. -- 点击文档链接。

您可以使用os.system 执行 FFMPEG 命令。无论如何,您都需要导入操作系统来遍历文件。

不过,您需要遍历目录中的所有文件。这将是更具挑战性的一点,不过使用 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

【讨论】:

if 行末尾应该有一个“)”,例如:if (filename.endswith(".mp4")):【参考方案4】:

在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的主要内容,如果未能解决你的问题,请参考以下文章

替换python脚本中的字符串并执行脚本

在一个python脚本中调用另一个python脚本中的函数

Python脚本中的变量未定义

Python导入并运行位于不同目录中的python脚本[重复]

Python中的多个ping脚本

Python 脚本中的“一劳永逸”过程