5

ファイルへのパスを受け取り、それに関する情報の配列を返すPHP関数が必要です。PHPファイルはFFmpegを呼び出すことができます。

返されるデータは次のようになります

Array(
    [mime]          => video/ogg
    [container]     => Ogg
    [video]         => Theora
    [audio]         => Vorbis
    [duration]      => 20.3 // in seconds
)

Array(
    [mime]          => audio/ogg
    [container]     => Ogg
    [video]         =>
    [audio]         => FLAC
    [duration]      => 3
)

Array(
    [mime]          => image/gif
    [container]     => GIF
    [video]         => Animated GIF
    [audio]         =>
    [duration]      => 2
)

Array(
    [mime]          => video/webm
    [container]     => WebM
    [video]         => VP8
    [audio]         => Vorbis
    [duration]      => 900.7
)

false // not a media file

私はFFmpegやPHPのshell_exec()機能を使ったことがありませんが、FFmpegはビデオ(またはオーディオファイル)に関する情報をかなり解析しにくい形式で提供するようです。でも、こういうことは可能だと思います。

4

4 に答える 4

10

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-iMOVIE.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 に渡すこともできます。

于 2010-10-15T01:00:03.960 に答える
2

Mediainfoを見てみましょう。--Output=XML を渡すと、次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<Mediainfo>
<File>
<track type="General">
<Complete_name>Movie.webm</Complete_name>
<Format>Matroska</Format>
<File_size>215 MiB</File_size>
<Duration>28mn 39s</Duration>
<Overall_bit_rate>1 049 Kbps</Overall_bit_rate>
<Movie_name>Safari</Movie_name>
<Writing_application>Lavf52.78.0</Writing_application>
<Writing_library>Lavf52.78.0</Writing_library>
</track>

<track type="Video">
<ID>1</ID>
<Format>V_VP8</Format>
<Codec_ID>V_VP8</Codec_ID>
<Duration>28mn 39s</Duration>
<Bit_rate>529 Kbps</Bit_rate>
<Width>768 pixels</Width>
<Height>432 pixels</Height>
<Display_aspect_ratio>16:9</Display_aspect_ratio>
<Frame_rate>25.000 fps</Frame_rate>
<Bits__Pixel_Frame_>0.064</Bits__Pixel_Frame_>
<Stream_size>108 MiB (50%)</Stream_size>
<Language>Norwegian</Language>
</track>

<track type="Audio">
<ID>2</ID>
<Format>Vorbis</Format>
<Format_settings__Floor>1</Format_settings__Floor>
<Codec_ID>A_VORBIS</Codec_ID>
<Duration>28mn 39s</Duration>
<Bit_rate_mode>Constant</Bit_rate_mode>
<Bit_rate>500 Kbps</Bit_rate>
<Channel_s_>2 channels</Channel_s_>
<Sampling_rate>48.0 KHz</Sampling_rate>
<Resolution>16 bits</Resolution>
<Stream_size>102 MiB (48%)</Stream_size>
<Writing_library>libVorbis 20090709 (UTC 2009-07-09)</Writing_library>
<Language>Norwegian</Language>
</track>
</File>
</Mediainfo>
于 2010-10-18T10:33:24.767 に答える
1

この男を試してみたいかもしれません。ライブラリを活用できる場合は常に良い: http://www.phpclasses.org/browse/file/1582.html

于 2010-10-14T22:48:21.973 に答える
0

PHPオーディオパーサーを検索すると、 http: //getid3.sourceforge.net/が見つかりました

お役に立てれば、

チアーズ

于 2011-10-07T14:53:43.800 に答える