2017-10-10 1 views
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は2つの入力をとります:1つは-i、出力ファイル名は1つです。タートルでこれを実装するベストプラクティスは何ですか?

私は、有望に見えるfoldIO機能を見てきました。しかし、私はそれを使用する方法を把握することはできません。

答えて

2

viewのように使用しないでください。これを使用してShellを実行すると、結果の値が出力され、アクセスできなくなります。 Shell自体はモナドなので、Shellアクションを構築し、viewまたはshで実行してください(印刷せずに値を破棄するには)。 (彼らは端末機能であり、あなたがやっていることをやってしまったときにのみ使用します)。実際にはMonadIO Shellなので、IOでできることは何でもShellliftIO :: 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 
+0

非常に便利に匹敵します。私は実際にすでにそれを把握しています。また、出力ファイル名の生成方法についてのヒントを教えてください。 mp4からmp3に変更したい。私は置換を行うためにsedコマンドを使用する方法を理解できません。 – osager

+1

私は 'sed'を使用しません。 'Text'ライブラリの関数を使うだけです。 'init'は最後の文字(最後の '4 'を除くすべて)をとり、' <>' 3 ''は最後に' '3''を追加します)。 – HTNW

+0

スマート! 'procs'が例外を送出するのはどうですか?その例外を管理していくつかのメッセージをスローし、他のファイルへの処理を続ける方法? @HTNW – osager

関連する問題