1
import Turtle
import Prelude hiding (FilePath)
import Data.Text hiding (find)
main = do
  f <- view $ format fp  <$> find (suffix ".mp4") "/Users/me/videos"
  procs "ffmpeg" ["-vn","-acodec","libmp3lame","-ac","2","-ab","160k","-ar","48000","-i"] empty

基本上我想将所有视频文件名提供给 ffmpeg。两个问题:

  1. 如何procsShell流结合?
  2. ffmpeg 接受两个输入:一个用于-i输出文件名,一个用于输出文件名。用 Turtle 实现这一点的最佳实践是什么?

我已经看到了看起来很有希望的foldIO函数。但我不知道如何使用它。

4

1 回答 1

2

不要那样用view。您使用它来运行a Shell,它会打印结果值并使您无法访问它们。Shell本身是一个单子,所以你应该建立一个Shell动作,然后用viewor运行sh(丢弃值而不打印)。(它们是终端功能;仅当您完成您正在做的事情时才使用它们)。事实上,MonadIO Shell, 所以你可以在里面做的任何事情都IO可以在Shell(via liftIO :: MonadIO m => IO a -> m a) 里面做。

main = sh $ do -- You don't want to print the output of this Shell (a bunch of ()s)
  filename <- format fp <$> find (suffix ".mp4") "/Users/me/videos"
  let output = findOtherName filename -- Find the output arg for ffmpeg
  procs "ffmpeg" ["-vn","-acodec","libmp3lame","-ac","2","-ab"
                 ,"160k","-ar","48000","-i",filename,output  ] -- Just add them on

这相当于

#!/bin/sh
for filename in /Users/me/videos/*.mp4; do
    output="`findOtherName "$filename"`"
    ffmpeg -vn -acodec libmp3lame -ac 2 -ab 160k -ar 48000 -i "$filename" "$output"
done
于 2017-10-10T20:18:58.053 回答