代码之家  ›  专栏  ›  技术社区  ›  McBear Holden

哈斯克尔海龟脚本:如何消费贝壳

  •  1
  • McBear Holden  · 技术社区  · 7 年前
    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. 如何组合 procs 具有 Shell 流?
    2. ffmpeg需要两个输入:一个用于 -i

    我看过 foldIO 功能看起来很有前途。但我不知道怎么用。

    1 回复  |  直到 5 年前
        1
  •  2
  •   HTNW    7 年前

    不要使用 view 就像那样。你用它来 Shell ,并打印结果值,使您无法访问这些值。 它本身是一个单子,所以你应该建立一个 操作,然后使用运行 看法 sh (在不打印的情况下丢弃值)。(它们是终端函数;只有在完成所做的事情时才使用它们)。事实上 MonadIO Shell IO 你可以进来 (通过 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