ffmpeg一括エンコードのバッチ作成
find . -name '*.m4a' -type f > filelist.log
一旦ファイルリストを作成。
そして
#!/bin/sh while read -r FILE do OUTPUT=`echo $FILE | perl -pe 's/m4a$/mp3/'` ffmpeg -y -i "$FILE" -ab 160 "$OUTPUT" done < filelist.log
これでいけるかと思いきや、先頭のファイルしか変換されない。
やたらdebug=512って感じの出力がされ、終わる。
おかしい。ファイル名がマルチバイト文字列だしスペースあるし、そういうのが原因なのか。。。
サクっと終わるかと思ってたら、結局これで半日潰れました。
なんでうまくいかないのかはわかりません。
もう手でやったらいいやんっていう。
なんか他の言語でシステム関数たたいてなんとかしてしまおうと。
phpでやろうかと思いましたが、open_basedirとか、もうって思って、
#!/usr/bin/php -d 'open_basedir=/Users'
かなと思いましたが、
勉強もかねて、pythonでやってみました。
カッコとか行末のセミコロンとか書かなくてもインデントでスコープが決まるのはやっぱり楽ちんですね。
#!/usr/bin/env python import re import commands for file in open('filelist.log','r'): output = re.sub(r'\.m4a$','.mp3',file) c = 'ffmpeg -y -i "'+ file.strip()+'" -ab 160 ' +' "' + output.strip() + '"' result = commands.getoutput(c) print result
これでうまくいきました。
もうさっきまでの時間はなんだったんだろうかと。