ビデオからスクリーンショットと情報を取得する

この記事では、ビデオからスクリーンショットを撮る方法と、ビデオファイルに関する情報を取得する方法について説明します。

もちろん、多くはすでにビデオからスクリーンショットを撮る方法を知っています。 しかし、彼らが言うように、誰かが彼らの手に届かない。 そのような人のために、私はこの小さなメモを書きました。 彼女が助けてくれることを願っています。



だから、私は続行します:

多くの人はおそらくffmpeg-ビデオを操作するためのライブラリのセットについて聞いたことがあります。 しかし、ビデオファイルからスクリーンショットを取得するような些細なことは非常に遅いことがわかりました! ffmpegは最初にビデオを目的のポイントまで「スクロール」するので、映画の冒頭からスクリーンショットを撮る必要があるほど、待機する時間が長くなります。 次のようなffmpegのスクリーンショットを取得できます。

ffmpeg -i /home/username/movie.avi -an -ss 00:20:14 -r 1 -vframes 24 -s 320×240 -y -f mjpeg /home/username/screenshot-pct.jpg


しかし、これは遅いので、これを行うことはお勧めしません。 当然、このような遅い作業は誰にも適していません(開発者がなぜffmpegでこの機能を作成したのですか?)。
幸いなことに、代替手段があります-これはMplayerです。 それはグラフィカルシェルの有無に関係なく発生し(アセンブル方法によって異なります)、ffmpegを作成するのと同じ仲間によって作成されます。 グラフィカルなシェルnafigは必要ありません。映画を見ることはありません! したがって、GUIなしでMplayerを自由に構築できます。
私たちは使用します:

mplayer /home/username/movie.avi -ss 00:20:14 -frames 24 -vo jpeg:outdir=/home/username


このコマンドは、「映画/home/username/movie.aviの20分から14秒までの24枚のスクリーンショットを取得し、それらをディレクトリ/ home /ユーザー名に入れてください」を意味します。

24枚のスクリーンショットが必要な理由。 実際には、通常、映画には24〜31フレームが含まれているため、24フレームを使用します。 さらに、私は思うに、ほとんど必要ありません。 シーンが1秒以内に劇的に変化することは明らかです(特にヘリコプターが爆発する場合)。そのため、24フレームを取得し、これらのフレームから最も美しいフレームを選択する機会を与えます。
次に、ビデオから情報を取得する方法について説明します。
個人的には、同じMplayerを使用して、ビデオファイルに関するメタ情報を取得します。

mplayer -identify /home/username/movie.avi -ao null -vo null -frames 0 2>/dev/null | grep ^ID_


または、これを行うことができます(php、grepなし):

<?
/**
* - -.
* mplayer.
*/
class VideoInfoComponent {
public $mplayer = '/usr/local/bin/mplayer';
/**
* - -
*
* @param string $filename
* @return array -
*/
public function info($filename) {
$result = array();
$params = array();
exec("{$this->mplayer} -vo null -ao null -frames 0 -identify '{$filename}'", $result);
foreach ($result as $i=>$value) {
if (!preg_match('/^ID_/', $value)) unset($result[$i]);
else {
list ($param, $data) = explode('=', $value);
$params[ $param ] = strtolower($data);
}
}
$params['ID_SIZE'] = filesize($filename);
return $params;
}
}
?>

Source: https://habr.com/ru/post/J22481/


All Articles