2012-02-13 11 views
11

私は10枚の画像を持っており、それらの画像をスライドショーのようなビデオに結合したいとします。PHPで画像から動画を作成するには?

たとえば、各画像を5秒間表示してから、次の画像をさらに5秒間続けたいとします。

可能であれば、音楽や説明文も含めることができます。

ffmpegライブラリにはサンプルコードがありますか?

答えて

9

私の最初の考えは、ffmpegコマンドにこのようなものを付け加えることでした。

のffmpegはビデオに一緒にいくつかの画像をステッチするために使用することができ画像からビデオを作成します。 多くのオプションがありますが、次の例は を開始するのに十分なはずです。ファイル名が XXXXX.morph.jpg(Xは数字)の画像をすべて取得し、 "output.mp4"という名前のビデオを作成します。 qscaleオプションは画質を指定します(1は 、32は最低)。また、-rオプションを使用して に1秒あたりのフレーム数を指定します。

のffmpeg -r 25 -qscale 2 -i%05d.morph.jpgのoutput.mp4

(この宣伝文句はリンク が削除されました。なくなってから撮影されたことをウェブサイト。)

ここで、25は1秒あたり25枚の画像を意味します。わずかな(1秒)遅延の場合は1に設定し、小数点の場合はIE:0.5秒を設定します。

これで、ビデオストリームとオーディオストリームをこのような方法で組み合わせることができます。

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -b:a 128k final.mp4 

もちろん、適切なコーデックを選択してください。 mp4を使用したい場合は、オーディオ用にffmpegに組み込まれており、もはや「実験的」ではないビデオとaac用のlibx264を使用します。

ffmpegの出力がデフォルトでstderrに読み込まれるようにするこのような方法を使用することを選択した場合、覚えておいてください。必要に応じて、stdoutにリダイレクトすることができます。

+0

[OK]を、私たちは、毎秒のフレームを選択するが、あることができますつまり、fpsを上げて動画の再生時間を判断できますか?たとえば、25 fpsが1秒の場合です。 'ffmpeg -r 250 'を使用しているのは、各画像に対して10秒を意味していますか? – motto

+0

いいえ、毎秒25枚の画像を使用します。 25はちょうどコピー/貼り付けの例でした。 2秒の一時停止の場合は1に設定するか、0.5に設定してみてください。この情報を投稿にも追加しました。 – Timeout

+0

URLはもう機能しません。 –

5

最初に気になったのはimagemagickでした。私は多くの画像操作のためにPHPでそれを使用しました。そして、それはビデオフォーマットのまともな量を読み上げることをサポートしていることを知っています。

+2

imagickにはffmpegが必要なので、基本的にphpでビデオを操作する利点はありません。 – Michal

4

はい、ffmpegはあなたにとって最適なソリューションです。私はちょうど似たようなものを作ったばかりです。アニメーションサムネイルを使ったビデオサイトです。私はffmpegを使用して、アミノ化されたgifで画像をまとめました。しかし、出力はあなたが必要とするものであってもかまいません...残念ながら、このトピックへの私の検索では、後のすべてのポイントを結合するサンプルコードは見つかりませんでしたので、手動でffmpegを試してみる必要があります。 。私のプロジェクトでは、私は少し簡単にするためにいくつかの部分でPHPビデオツールキットhttp://sourceforge.net/projects/phpvideotoolkit/を使用して...

あなたはffmpegのとブレンド効果を使用することができます
2

ffmpeg -framerate 20 \ 
-loop 1 -t 0.5 -i 1.jpg \ 
-loop 1 -t 0.5 -i 2.jpg \ 
-loop 1 -t 0.5 -i 3.jpg \ 
-loop 1 -t 0.5 -i 4.jpg \ 
-c:v libx264 \ 
-filter_complex " \ 
[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \ 
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \ 
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \ 
[0:v][b1v][1:v][b2v][2:v][b3v][3:v]concat=n=7:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4 

あなたはffmpegのの、より効果のために怒鳴るのリンクを確認してください:D

https://github.com/letungit90/ffmpeg_memo

+0

フィードバックのためのtks @LordNeckbeard私は自分の答えを更新しました – Makio

関連する問題