Linux 如何使用ffmpeg bash脚本从一个文件夹中的多个视频中提取单个图像(每次使用不同的名称)

Linux 如何使用ffmpeg bash脚本从一个文件夹中的多个视频中提取单个图像(每次使用不同的名称),linux,image,bash,video,ffmpeg,Linux,Image,Bash,Video,Ffmpeg,让我们从这个开始。。。我对Linux相当陌生 我一直在研究ffmpeg,以便使用终端从视频中提取图像。我已经使用这段代码完成了这项工作: ffmpeg -itsoffset -4 -i oggvideo.ogg -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 oggThumb.jpg for %%i in (*.mp4) do ffmpeg -ss 20 -i %%i -t 1 -s 590x340 -f image2 %%i.

让我们从这个开始。。。我对Linux相当陌生

我一直在研究ffmpeg,以便使用终端从视频中提取图像。我已经使用这段代码完成了这项工作:

   ffmpeg  -itsoffset -4  -i oggvideo.ogg -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 oggThumb.jpg
for %%i in (*.mp4) do ffmpeg -ss 20 -i %%i -t 1 -s 590x340 -f image2 %%i.jpg
我在保存项目中视频的目录中运行此程序。但我想要的是同时从该文件夹中的所有视频中提取一幅图像,并将其命名为与其提取的视频名称对应的图像。我的最终目标是拥有一个文件夹,其中将保存用户上传的视频,并在特定时间运行脚本,从上传的视频中提取图像,将图像路径保存到数据库

我发现这行代码:

   ffmpeg  -itsoffset -4  -i oggvideo.ogg -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 oggThumb.jpg
for %%i in (*.mp4) do ffmpeg -ss 20 -i %%i -t 1 -s 590x340 -f image2 %%i.jpg
从本网站:

我在终端中运行它,它给出错误:“bash:syntax error near unexpected token”(“”) 我试着删除“()”,但它只是把我带到了一个新的行上。这是我遇到的问题最多的地方,因为我对linux命令比较陌生


任何建议或建议都会非常有用。

您在那里发布的一行代码看起来像Windows shell代码

等效的bash转换(尽管您的命令和参数可能不同)如下所示:

for i in $(ls *.mp4); do ffmpeg -ss 20 -i $i -t 1 -s 590x340 -f image2 ${i//.mp4/}.jpg; done
我重写了你的命令

for i in *.mp4 
do
    echo Processing "$i" # Just to visually keep track of what's going on
    ffmpeg -ss 20 -i "$i" -t 1 -s 590x340 "${i%.mp4}".jpg
done
请注意:

  • ffmpeg
    在处理时可能会产生警告和/或错误。此命令只需忽略它们即可
  • 为了处理文件名中的空格,我引用了变量
    I
  • 我使用(bash)remove匹配后缀操作符(
    ${parameter%word}
    )删除文件扩展名,因为这是它自己的目的
  • 我将您的语句改写为多行表达式,以使其更具可读性(符合我的口味)。如果出于某种原因,您希望将其改写为一行,请在第一行、第三行和第四行末尾添加一个
  • 我删除了
    -f image2
    选项(初始命令的一部分),因为它可能不是您想要的。没有提取它们
  • 关于
    ffmpeg
    本身的其他问题最好在上讨论。
    关于您的具体需求,请参见示例


    编辑:如果您是从Windows环境提交的,请注意大多数类似Unix的文件系统都区分大小写。默认情况下,名为“XXX.MP4”的fale与全局模式“*.MP4”不匹配

    如果这是您的问题,使用
    bash
    您可以使用
    shopt-s nocaseglob
    强制不区分大小写。使用
    shopt-u nocaseglob
    恢复正常行为

    以下是我的系统(ext4 fs)上的一个示例:


    我相信在*.mp4中为I使用
    比解析
    ls
    的输出更好,这被认为是一种不好的做法。这对你有用吗?我不确定bash是否是这样工作的:)另外,为什么这是一种“不好的做法”?ls是GNU coreutils的一部分!这正是bash的工作原理——它是bash的优势之一
    ls
    输出是为人类安排的,计算机有更好的方法知道目录中的内容。请尝试将代码粘贴到此处,在此处阅读,然后思考文件名中是否包含空格和换行符。顺便说一句,您还应该在
    $i
    周围添加双引号,如
    “$i”
    @LiviuChircu
    for i in$(ls*.mp4)将失败。它仍然只拍摄第一个mp4视频。我看看能不能从那里开始工作。非常感谢@morriscotty_sd如果某些文件未经处理,则
    ffmpeg
    就是无法处理它们(编码错误?)。最近,一些发行版从
    ffmpeg
    切换到
    avconv
    ——这可能有其不兼容之处。或者,由于区分大小写,各种文件名可能与*.mp4 glob模式不匹配。我编辑了我的答案,指出了以后可能出现的问题。@morriscotty_sd BTW,你不想在这里!!!我刚刚意识到一件非常愚蠢的事情。没有生成图像的视频只有5秒长,因此-ss 20不会输出图像!!现在完全可以用了。谢谢