私は最近、動画ファイルからのメタデータの解析で大きな頭痛の種を抱えていましたが、問題の一部は、動画制作ソフトウェア ベンダー (およびその他の理由) によるさまざまな標準 (または少なくとも解釈の違い) を無視していることにあることがわかりました。
その結果、さまざまな形式、コンテナー、コーデックの非常に大きなビデオ (および画像) ファイルをスキャンし、メタデータを掘り出すことができる必要があります。私はすでにFFMpeg、ExifTool Imagick、およびExiv2をそれぞれ取得して、さまざまなファイルタイプのさまざまなタイプのメタデータを処理し、他のいくつかのギャップを埋めるためにさまざまな他のオプションを使用してきました(ライブラリや他のツールを提案しないでください、私はそれらすべてを試しました: )))。
ここで、XMP ブロック (Adobe スイートやその他のソフトウェアによってムービー ファイルに書き込まれるのが一般的) を見つけるために、大きなファイル (それぞれ最大 2GB) をスキャンします。私はそれを行う関数を書きましたが、改善できるのではないかと心配しています。
function extractBlockReverse($file, $searchStart, $searchEnd)
{
$handle = fopen($file, "r");
if($handle)
{
$startLen = strlen($searchStart);
$endLen = strlen($searchEnd);
for($pos = 0,
$output = '',
$length = 0,
$finished = false,
$target = '';
$length < 10000 &&
!$finished &&
fseek($handle, $pos, SEEK_END) !== -1;
$pos--)
{
$currChar = fgetc($handle);
if(!empty($output))
{
$output = $currChar . $output;
$length++;
$target = $currChar . substr($target, 0, $startLen - 1);
$finished = ($target == $searchStart);
}
else
{
$target = $currChar . substr($target, 0, $endLen - 1);
if($target == $searchEnd)
{
$output = $target;
$length = $length + $endLen;
$target = '';
}
}
}
fclose($handle);
return $output;
}
else
{
throw new Exception('not found file');
}
return false;
}
echo extractBlockReverse("very_large_video_file.mov",
'<x:xmpmeta',
'</x:xmpmeta>');
現時点では「OK」ですが、サーバーを壊すことなくここでphpを最大限に活用したいので、これを行うためのより良い方法があるかどうか疑問に思っています(またはそれを改善するコードを微調整します)このアプローチは、いくつかの文字列を見つけてそれらの間の何かを引き出すのと同じくらい簡単なことには少しやり過ぎに思えます.