51

ユーザーがアップロードしたビデオから特定のフレームを抽出する必要がある Web ページがあります。ユーザーがプレーヤーで .mp4 の特定の部分を探し、ボタンをクリックすると、.mp4 とビデオから正確な時間を取得し、それを使用して抽出する php スクリプトに対して ajax 呼び出しが開始されます。 「サムネイル」フレーム。

私の現在の解決策はphpexecコマンドを使用しています:

exec("ffmpeg -i $videoPath -ss $timeOffset -vframes 1 $jpgOutputPath");

...糖蜜と同じくらい遅いことを除けば、これはうまく機能します。私の推測では、ffmpegは仕事には少し多すぎるので、基礎となるライブラリなどを利用することでもっとうまくやれるかもしれません...しかし、それを行う方法がまったくわかりません。

理想的には、実際の「インストール プロセス」を必要とするものをインストールする必要はありません...つまり、実行可能ファイルを Web アプリのフォルダーにドロップすることは問題ありませんが、実際にインストーラーを実行する必要はありません。また、このソリューションは、Mac、Linux、および Windows で実行できる必要があります (ただし、Linux が最優先事項です)。

このプロセスをスピードアップするにはどうすればよいですか?

ありがとう。

4

1 に答える 1

82

もちろん、いくつかの C/C++ をコーディングして -lav* にリンクすることもできます。基本的には、フレームを抽出するためだけに単純化されたバージョンの ffmpeg を作成し、おそらくそれを php 拡張機能として実行することもできます (同じユーザーとしては実行しません)。 、もちろん同じプロセスで)。ただし、フォークとセットアップのオーバーヘッドを回避するだけなので、結果が速くなる可能性はほとんどありませんが、実際にはデコードが問題になる可能性があり、これは同じです。

代わりに、最初に高速シーク モード (または高速/正確なハイブリッド モード) で ffmpeg を使用することを検討する必要があります。彼らのウィキは、高速シークについて次のように述べています。

-ss パラメータは -i の前に指定する必要があります:

ffmpeg -ss 00:03:00 -i Underworld.Awakening.avi -frames:v 1 out1.jpg

この例では、ムービーの開始から約 3 分後に 1 つのイメージ フレーム (out1.jpg) が生成されます。入力はキーフレームを使用して解析されますが、これは非常に高速です。欠点は、必ずしも指定された時間 (00:03:00) に配置されているとは限らないキーフレームでシークも終了するため、シークが期待どおりに正確に行われないことです。

高速/正確なハイブリッドモードは良い妥協点ですが、ffmpegはシーク中に実際に映画(のほとんど)をデコードする必要がないため、高速シークは正確ではありませんが、非常に高速です。利用可能なすべてのオプションについては、wiki ページを参照してください。

編集 14/06/10 :

FFmpeg 2.1 の時点で、ffmpeg でトランスコードする場合 (つまり、ストリーム コピーではない場合)、-ss が入力オプションとして使用された場合でも正確になりました。-noaccurate_seek オプションを使用すると、以前の動作に戻すことができます。 (ソース)

そのため、2.1 以降では、再エンコードに関して正確な結果を得るために「ハイブリッド」シークは必要なくなりました (保存先.jpegは再エンコードです)。-ss ... -i ...低速シーク ( ) ではなく、通常の高速シーク ( ) を実行するだけで十分です-i ... -ss ...

于 2013-08-30T18:39:37.843 に答える