perlで動画ファイルを音楽ファイルに簡単変換
最近@tomitaさんが出した本「CPANモジュールガイド」は読みながらすぐ試せるのが楽しい!
というわけで、早速紹介されているモジュールを組み合わせたプログラムを書いてみたので晒してみます。フォルダから動画ファイルを取り出し、iTunesで再生可能な音楽ファイルに変換した上で、指定の別フォルダに保存する、といったものです。実際の変換にはffmpegというソフトを使ってるので、元となる動画ファイルや変換後の音楽ファイルの拡張子はお好みで変えることも出来ます。Macでしか試してないですが、ちょっといじるだけでWinでも使えると思います。
ffmpegを先にGet FFmpegからダウンロード&インストールしといてください。Mac の場合インストールの前に、
$ sudo port install yasm
しとくといいと思います。
以下では、Path::Class::Dirオブジェクトのchildrenメソッドを使って、/home/user/Movies/music 以下に存在するファイルをリストで取得。取得したリストを for でまわし、拡張子に”.mp4”が付くファイルのみをffmpegメソッドに渡して変換を行っています。ffmpegメソッドではIPC::Cmdを使って、外部コマンドのffmpegコマンドを実行させています。無事変換が行われたら、元の動画ファイルを削除しています。致命的なのは、動画ファイルのファイル名にスペースが入ってるとffmpegで変換が出来ません。。。なので「Cloudy Heart karaoke 100214.mp4」とかはあらかじめ「Cloudy_Heart_karaoke_100214.mp4」にリネームしとく必要があります。なんとか出来たらなんとかします。。。
ffmpeg.pl
#!/usr/bin/perl
use strict;
use warnings;
use Path::Class;
use IPC::Cmd qw/run/;
my $extention = shift || "mp4"; # 引数があればそれ、無ければ mp4
my $movies_dir = $ENV{'HOME'} . '/Movies/music'; # お好きなフォルダを
my $upload_dir = $ENV{'HOME'} . '/Dropbox/Music[mP3]/'; # お好きなフォルダを
my @entries = dir( $movies_dir )->children;
for my $entry (sort @entries) {
next if $entry->is_dir;
next if $entry->basename !~ /\.$extention$/;
ffmpeg( $entry );
}
sub ffmpeg {
my $file = shift;
my ($ok, $err) = run(
verbose => 1,
command => ['ffmpeg',
-i => $file,
'-vn',
$upload_dir . substr(file($file)->basename, 0, -3) . 'm4a',
],
buffer => \my $buf,
timeout => 300,
);
die $err unless $ok;
}
環境変数を使ってホームディレクトリを取得してるので、プログラム自体の置き場所はどこでもいいです。ちなみに標準で入ってるモジュールしか使ってないので、Macならコードをコピペして「ffmpeg.pl」とかで保存してターミナルから、
$ perl ffmpeg.pl # または perl ffmpeg.pl flv
と実行すれば即使えるはず。引数を加えることで、コマンドラインから拡張子を指定できるようにしてみました。例えば flv と打つとフォルダ内から .flv の付いたファイルを変換します。
なんかいろんな意味で無駄が多い気もするぞ。。。ツッコミ歓迎!