ffmpeg 错误:选择了模式类型“glob”,但此 libavformat 构建不支持 glob

Posted

技术标签:

【中文标题】ffmpeg 错误:选择了模式类型“glob”,但此 libavformat 构建不支持 glob【英文标题】:ffmpeg Error: Pattern type 'glob' was selected but globbing is not support ed by this libavformat build 【发布时间】:2015-09-20 23:05:44 【问题描述】:

我正在尝试将充当单个帧的“.jpg”文件组转换为 1 个单个 mpeg 视频“.mp4”

我使用的示例参数:

frame duration  = 2 secs
frame rate      = 30  fps
encoder         = libx264 (mpeg)
input pattern   = "*.jpg"
output pattern  = video.mp4

根据 (https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images) 的 ffmpeg wiki 说明,我发出了以下命令:

ffmpeg -framerate 1/2 -pattern_type glob -i "*.jpg" -c:v libx264 -r 30 -pix_fmt yuv420p video.mp4

但是我收到了这个错误:

[image2 @ 049ab120] Pattern type 'glob' was selected but globbing is not 
supported by this libavformat build *.jpg: Function not implemented

这可能意味着我的构建/版本的 API 模式匹配命令已更改。顺便说一下,这是我的 windows 32 位 ffmpeg 下载版本 (ffmpeg-20150702-git-03b2b40-win32-static)。

如何使用 ffmpeg 进行模式匹配来选择一组文件?

【问题讨论】:

为什么会被否决? Stackoveflow 上有很多 ffmpeg 问题,ffmpeg 是一个合法的视频编码库和 API。我也清楚地陈述了我的问题、尝试和疑问? 顺便说一句,我通过使用 ffmpeg 输入模式 -i img%1d.jpg 整个命令 ffmpeg -y -framerate 1/2 -start_number 1 -i img%1d.jpg -vf scale=720:756 -c:v libx264 -r 30 -pix_fmt yuv420p video.mp4 进行了这种工作,但是这只转换了前五帧/JPEG图像,为什么会有限制,如何我可以将任意数量的 JPEG 转换为 MPEG 视频吗? 它是img%01d.jpg,带有一个零。它只会匹配 img0.jpgimg9.jpg 另见superuser.com/questions/666860/… 【参考方案1】:

-pattern_type globrequires glob.h.

glob 在 POSIX 标准中定义,默认情况下在 Windows 上不可用

使用顺序文件命名image###.jpg 创建/重命名文件,然后使用-i image%03d.jpg 等顺序通配符作为输入。

【讨论】:

请参考我上面 7 月 3 日的评论,我解决了原来的问题,但是 ffmpeg 只将 1st 5 个文件编码为视频,而不是更多,这是当前的问题/问题。我需要将“N”个帧编码成一个更大的序列。 您的问题涉及 glob,请考虑更新或发布新问题。我还评论了你原来的问题。如果您需要更大的序列,只需使用%0n,其中n 是位数。您的文件是如何命名的? 如你所见,我已经在 7 月 3 日解决了这个问题,但是它的帧数不超过 5 帧。 然后更新问题并添加文件的命名约定。如果使用顺序索引,是不是一直递增1而不跳过? ffmpeg -framerate 15 -pattern_type sequence -start_number 00001 -i C:\Users\u\Videos\LRT_%05d.jpg -s:v 1920x1080 -c:v libx264 -crf 17 -pix_fmt yuv420p C:\Users\u\Videos\my-timelapse_1.mp4【参考方案2】:

您可以用 Python 编写脚本,该脚本支持 Windows 中的 glob 模块:

import subprocess
import glob
import os

filenames = glob.glob('*.png')
path = os.path.abspath("").replace("\\", "/")
print(path)
duration = 0.05

with open("ffmpeg_input.txt", "wb") as outfile:
    for filename in filenames:
        outfile.write(f"file 'path/filename'\n".encode())
        outfile.write(f"duration duration\n".encode())

command_line = f"ffmpeg -r 60 -f concat -safe 0 -i ffmpeg_input.txt -c:v libx265 -pix_fmt yuv420p path\\out.mp4"
print(command_line)

pipe = subprocess.Popen(command_line, shell=True, stdout=subprocess.PIPE).stdout
output = pipe.read().decode()
pipe.close()

【讨论】:

以上是关于ffmpeg 错误:选择了模式类型“glob”,但此 libavformat 构建不支持 glob的主要内容,如果未能解决你的问题,请参考以下文章

Python glob,但针对字符串列表而不是文件系统

Perl glob 在尝试匹配特定文件类型时返回误报

Sourcetree忽略文件

FFmpeg之Linux下编译与调试

glob模式

如何使用 os.walk 或 glob.glob 获取目录中所有类型的文件扩展名