MrF*_*bio 3 unix shell haskell ffmpeg
我正在使用FFmpeg开发一些Haskell项目.我需要从包含MP4文件的媒体文件夹批量创建并从所有这些文件创建屏幕截图.我得到了代码,并在Unix的终端上使用它.它可以工作,但是如何在一行中使它在Haskell中的系统"xxxx"中执行?
如果没有使用几个系统"xx"......
#/bin/sh
for i in $(ls *.mp4)
do
ffmpeg -i $i -vframes 7 -y -ss 10 -s 150x150 -an -sameq -f image2 -r 1/5 $i%1d.jpg
done
Run Code Online (Sandbox Code Playgroud)
我试过了:
import System.Cmd
function = do{system "#/bin/sh";
system "for i in $(ls *.mp4)";
system "do";
system "ffmpeg -i $i -vframes 7 -y -ss 10 -s 150x150 -an -sameq -f image2 -r 1/5 $i%1d.jpg";
system "done";}
Run Code Online (Sandbox Code Playgroud)
但它给出了一个错误:
-vframes: No such file or directory
/bin/sh: Syntax error: "done" unexpected
Run Code Online (Sandbox Code Playgroud)
问题是您尝试将脚本的每一行作为独立的shell独立调用来执行.您只需要通过一次system调用完成所有操作,并将脚本的每一行分开\n:
system "for i in $(ls *.mp4)\ndo\n..."
Run Code Online (Sandbox Code Playgroud)
但您可以在一条逻辑行上编写shell命令,而不是:
system "for i in $(ls *.mp4); do ...; done"
Run Code Online (Sandbox Code Playgroud)
#!/bin/sh使用时不需要第一行(顺便说一下)system.
但是,如果您只是要执行单个shell脚本,我不确定为什么要将Haskell用于此目的.您应该在Haskell中的目录内容上编写循环,并且只调用系统进行单独转换.至少,您应该将此脚本放入其自己的文件中,并使用system "sh convert.sh"或类似地调用它.
(如果您想在Haskell中使用更方便的多行字符串语法,请尝试使用interpolatedstring-perl6或string-qq包.)