4

私は最近、動画ファイルからのメタデータの解析で大きな頭痛の種を抱えていましたが、問題の一部は、動画制作ソフトウェア ベンダー (およびその他の理由) によるさまざまな標準 (または少なくとも解釈の違い) を無視していることにあることがわかりました。

その結果、さまざまな形式、コンテナー、コーデックの非常に大きなビデオ (および画像) ファイルをスキャンし、メタデータを掘り出すことができる必要があります。私はすでに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を最大限に活用したいので、これを行うためのより良い方法があるかどうか疑問に思っています(またはそれを改善するコードを微調整します)このアプローチは、いくつかの文字列を見つけてそれらの間の何かを引き出すのと同じくらい簡単なことには少しやり過ぎに思えます.

4

2 に答える 2

3

Knuth-Morris-PrattBoyer-Mooreなどの高速文字列検索アルゴリズムの1つを使用して、開始タグと終了タグの位置を見つけ、それらの間のすべてのデータを読み取ることができます。

ただし、そのような小さな検索パターンの場合と同様に、選択したアルゴリズムの定数が十分に価値がないことが判明する可能性があるため、それらのパフォーマンスを測定する必要があります。

于 2012-07-03T22:30:17.467 に答える
1

ファイルがこれほど大きい場合、最も重要な最適化は、どこでも文字列を検索しないことだと思います。私は、動画や画像の途中に XML ブロックが含まれているとは考えていません。

わかりました、それは可能です - TIFF はこれを行うことができ、JPEG も PNG も可能です。では、ビデオ形式ではないのはなぜですか? しかし実際のアプリケーションでは、通常、XMP などの緩やかな形式のメタデータは最後に保存されます。ごくまれに、ファイルの先頭近くに保存されますが、それほど一般的ではありません。

また、ほとんどの XMP ブロックのサイズが大きすぎることはないと思います (アドビが「ほぼ常に」迅速にインプレースで更新できるようにするために定期的にパディングを行っているとしても)。

したがって、私の最初の試みは、ファイルから最初の 100 Kb と最後の 100 Kb の情報を抽出することです。次に、これら 2 つのブロックをスキャンして "

検索が失敗した場合でも、徹底的な検索を実行できますが、成功した場合は 1 万分の 1 の時間で返されます。逆に言えば、この「トリック」が1000回に1回しか成功しないとしても、それだけの価値はあるでしょう。

于 2012-07-03T22:57:07.287 に答える