FFmpeg は、ほぼすべてのことを行うことができますが、形式を解析することはほぼ不可能であることは間違いありません。UNIX ベースのシステムを使用している場合は、PHP に出力を理解させるよりも、オペレーティング システムと FFmpeg の機能を使用して解析を行う方が実際には高速です。同様の目的で、数か月前に次のシェル コマンドを開発しました。
fulltime=`ffmpeg -i MOVIE.AVI 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//`;hour=`echo $fulltime | cut -d ':' -f 1`;minute=`echo $fulltime | cut -d ':' -f 2`;second=`echo $fulltime | cut -d ':' -f 3 | cut -d '.' -f 1`;echo `expr 3600 \* $hour + 60 \* $minute + $second`
パイプ ( |
) は、前のコマンドの出力を次のコマンドへの入力として渡すように UNIX に指示します。セミコロン ( ;
) は、UNIX に新しいコマンドを開始するように指示します。UNIX シェルでは、オンザフライで変数を作成することもできます。変数を作成するには、 と言うだけvar=value
です。この変数を呼び出すには、 などのドル記号を使用する必要があります$var
。
私のコマンドは基本的に の出力を受け取り、ffmpeg -i MOVIE.AVI 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
それを として保存しfulltime
ます。このコマンドはさらに細分化されています。
ffmpeg -i MOVIE.AVI 2>&1
-i
MOVIE.AVI の情報 ( ) を表示することを意味します。2>&1
出力を画面ではなくパイプにリダイレクトしたと思います(これはずっと前に作成されたので、はっきりしていません)
grep 'Duration'
入力 ( の出力ffmpeg -i MOVIE.AVI 2>&1
) を受け取り、単語「Duration」を見つけ、その単語を含む行のみを出力します。
cut -d ' ' -f 4
入力 (前のステートメントの出力) を受け取り、それをすべてのスペース ( ' '
) で分割し、これらの 4 番目のみを出力します。これは、FFmpeg の出力が次のようになるためです。
MOVIE.AVI
video encoder, yada yada
audio encoder, yada yada
bitrates and stuff
Duration: hh:mm:ss fulltime: 00:30:00.1
つまり、「期間」を含む行の 4 番目の「セクション」は、実際の期間です...時間、分、秒 (小数点以下 1 桁) で表されます。
sed s/,//
「、」を何も置き換えないことを意味します。これにはおそらく正当な理由がありました。
hour
この後、 、minute
、およびの 3 つの変数を作成しましたsecond
。
hour=`echo $fulltime | cut -d ':' -f 1`;
minute=`echo $fulltime | cut -d ':' -f 2`;
second=`echo $fulltime | cut -d ':' -f 3 | cut -d '.' -f 1`;
の出力に時間を設定していることに注意してくださいecho $fulltime | cut -d ':' -f 1
。コロンごとに時間を分割する場合は、最初の部分を取得します ( :
)
分についても同様のことを行い、次に秒についても同じことを行いますが、最後に小数点以下を切り捨てます。expr
コマンド (時、分、秒から秒を計算するために使用した) は整数演算のみを実行するため、シェルで作業している場合は、この小数を削除する必要があります。期間の小数を保持したい場合は、この時点で、時、分、秒を PHP に返して、そこで解析を行う必要があります。これは、上記を次のように置き換えることで最も簡単に実行できます。
echo $fulltime
これにより、 を呼び出した後に "00:30:00.1" などの文字列が PHP に返されます。この文字列はshell_exec()
、 を使用して簡単に解析できますexplode(':',$string)
。
シェルから直接秒を取得するには、次のようにします。
時、分、秒を取得した後、魔法の行が来ました:
echo `expr 3600 \* $hour + 60 \* $minute + $second`
このexpr
コマンドは、数式を実行するように指示します。残念ながら、それはかなりばかげています。まず、特殊文字をエスケープする必要があります (*
は UNIX のワイルドカードであるため、\*
乗算を意味するために使用する必要があります)。次に、整数演算のみを実行します。ご覧のとおり、時間に 3600 を掛け、分に 60 を掛けて、それらを足し合わせるのはかなり簡単でした。
この大規模なコマンド全体の出力は、単一の数値になります。動画が続く秒数。すべてのビデオ形式で機能するはずです。
これはただの期間です。ビデオ エンコーダーとオーディオ エンコーダーについては、同様の方法を使用することをお勧めしますが、最後の計算は除きます。一般的な解決策は次のとおりです。
ffmpeg -i MOVIE.AVI 2>&1 | grep 'Something unique to the line you want' | cut -d ' ' -f <the "section" you want>
この出力は、引き続きシェルで解析することも (上記の時間で行ったように)、PHP に渡すこともできます。