Creazy!

WEBエンジニア・ヤガーのテック・ガジェットブログ

PHP 小技集

FLVをまとめてMP4に変換するPHPスクリプト

投稿日:


YouTube HD Suiteの最新版になってから、ファイル名をいちいち指定しなくてもよくなったので、ドンドン落とせるようになってしまいました。で、すでに時間的に普通には消化できない量になってきているのでIS01に入れといて移動中とか観ようと思ってるんですが、HD画質だったりFLVだったりすると再生できないことはないけどコマ落ちしたりするので、最適なサイズに変換したいなと。
で、fmt18ならサイズ的にはそのまま再生できるんだけど画質がいまいちなんです。で、サイズだけでいうとFLVのfmt35かfmt34なんですが、これを一気にMP4に変換したい。今まではHandBrakeにキューイングしていって寝てる間に変換させとくってことをしてたんだけど、もっと簡単にならないかなと。FLVといってもコーデックはH.264なのでffmpegならかなり高速に処理が終ります。じゃあ、複数のファイルを処理するところをちょろっとスクリプトで解決するかと。


スクリプトの前に、ffmpegは適当に入手しておいてください。MacPortsで入れるなら、

sudo port install ffmpeg

とかで、いいのかな?(もうちょっと細かいオプションあったかも。ググって)
で、こんなスクリプトを書きました。
/Applications/flv2mp4.php

#!/opt/local/bin/php
<?php
$dir    = '~/Movies/';
$delete = false;
if ( count($argv) > 1 ) {
foreach ( $argv as $arg ) {
if ( is_dir($arg) ) {
$dir = $arg;
break;
}
}
foreach ( $argv as $arg ) {
if ( $arg == '--delete' ) {
$delete = true;
break;
}
}
}
exec("find $dir -name '*.flv'",$files);
foreach ( $files as $i => $file ) {
echo "############################################################\n";
echo "( ".($i+1)." / ".count($files)." )\n";
echo "## CHECK: $file\n";
$mp4 = preg_replace("/^(.+?)\.flv$/i","$1.mp4",$file);
if ( file_exists($mp4) ) {
echo "## EXISTS:$mp4\n";
} else {
echo "## CONVERT:$mp4\n";
exec("ffmpeg -i \"$file\" -vcodec copy -acodec copy \"$mp4\" >/dev/null",$result);
if ( $delete ) {
echo "## REMOVE:$file\n";
unlink($file);
}
}
}

実行権限を与えます。

chmod 744 /Applications/flv2mp4.php

で、実行するにはターミナルで、

/Applications/flv2mp4.php

と打つだけです。ボクはMacBookでは ~/Movies 配下に動画を保存しているので、オプションなしで実行するとムービーディレクトリ以下全てのFLVをMP4に変換しようとします。もし、特定のディレクトリ配下を変換したい場合は引数で対象のディレクトリを渡します。

/Applications/flv2mp4.php ~/Movies/music

さらに、ちゃんと動作確認した上でこのスクリプトを信用するのであれば、変換後にFLVファイルを削除するオプションも用意しました。

/Applications/flv2mp4.php ~/Movies/music --delete

「–delete」が付いていると変換後にFLVを削除します。PCにしても携帯やiPodなどにしてもMP4形式の方が何かと扱いやすいと思うので後で手動で削除する手間が省けます。
スクリプト内ではffmpegを叩いているだけなので、こんな感じの標準出力がでます。

############################################################
( 13 / 13 )
## CHECK: /Users/yager/Movies/music/大沢伸一/ZINGARO.flv
## CONVERT:/Users/yager/Movies/music/大沢伸一/ZINGARO.mp4
FFmpeg version 0.5, Copyright (c) 2000-2009 Fabrice Bellard, et al.
configuration: --prefix=/opt/local --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64
libavutil     49.15. 0 / 49.15. 0
libavcodec    52.20. 0 / 52.20. 0
libavformat   52.31. 0 / 52.31. 0
libavdevice   52. 1. 0 / 52. 1. 0
libavfilter    1. 4. 0 /  1. 4. 0
libswscale     1. 7. 1 /  1. 7. 1
libpostproc   51. 2. 0 / 51. 2. 0
built on Jul 13 2010 11:53:58, gcc: 4.2.1 (Apple Inc. build 5659)
Seems stream 0 codec frame rate differs from container frame rate: 60.00 (60/1) -> 29.97 (30000/1001)
Input #0, flv, from '/Users/yager/Movies/music/大沢伸一/ZINGARO.flv':
Duration: 00:05:53.02, start: 0.000000, bitrate: 606 kb/s
Stream #0.0: Video: h264, yuv420p, 480x360 [PAR 1:1 DAR 4:3], 606 kb/s, 29.97 tbr, 1k tbn, 60 tbc
Stream #0.1: Audio: aac, 44100 Hz, stereo, s16
Output #0, mp4, to '/Users/yager/Movies/music/大沢伸一/ZINGARO.mp4':
Stream #0.0: Video: libx264, yuv420p, 480x360 [PAR 1:1 DAR 4:3], q=2-31, 606 kb/s, 90k tbn, 1k tbc
Stream #0.1: Audio: libfaac, 44100 Hz, stereo, s16
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Press [q] to stop encoding
frame=10586 fps=  0 q=-1.0 Lsize=   29959kB time=353.03 bitrate= 695.2kbits/s
video:25481kB audio:4127kB global headers:0kB muxing overhead 1.184267%
## REMOVE:/Users/yager/Movies/music/大沢伸一/ZINGARO.flv

エラー制御とかあんまり考えていませんw
あと、Mac以外でうまく動く保証もありません。
自己責任にてご利用ください。

-PHP, 小技集

執筆者:

関連記事

【更新】ソーシャルメディアに共有するボタンの設置方法(Twitter, facebook, mixi, GREE, Evernote, Google+, Tumblr, Pinterest, はてブ)

ソーシャルメディアの各サービスがこぞって「いいね!」などの共有ボタンをリリースしています。ブログやニュースメディアでも頻繁に目にする昨今ですが、色々なソーシャルボタンの設置方法をまとめて紹介したいと思 …

PostToTwitter v2.0.0公開:自分好みのフォーマットでブログ更新をお知らせ

ボクはこのブログ(MT)の更新通知をTwitterに送るのにエムロジックさんのPostToTwitterプラグインを使わせてもらっています。先日MT5にアップグレードしてからはv1.3.0を使っていた …

Huluで「寝落ちワープ」しない方法

こんにちは、寝落ち王ヤガーです。 割りと夜遅くまで仕事(だったり他のPC作業)してるんですが、すでにちょっと眠いくせに一日の最後は何かお楽しみを・・・なんて考えてHuluを見たりします。Huluはみな …

TumblrにOGP設定してみた

【2011/06/21:追記】 あまりにも適当に書きすぎて分かりにくかったのでサンプルコードの中で差し替えが必要な部分について説明加筆しました。 メインブログのMTにOGP設定をしたのが良いキッカケに …

[N]ネタフル x [S]シカマケ = ブログデザイン勉強会 第2回:テーマ曲を決めて自分を更に深堀

昨日はブログデザイン勉強会の第2回がありました。 まずは、前回のおさらいですが1枚絵に自己紹介を描いてきて皆さんに発表。 それから、今のサイトと比べてどうかという事を他の方からご意見いただきました。 …

スポンサードリンク

スポンサードリンク