9

YouTubeビデオが実際のビデオなのか、単なる静止画像なのかをどのように判断できますか?

YouTube APIを使用することはおそらく不可能なので、javascript / jqueryを使用してウィンドウの特定の領域のピクセルをスキャンし、それらが変更されたかどうかを判断する回避策はありますか?

4

4 に答える 4

11

この大まかなアイデアはStichozaの答えに基づいていますが、はるかに単純です。

サムネイルだけを使用する

ビデオのサムネイルはhttp://i.ytimg.com/vi/VIDEO_ID/X.jpgで入手できます。たとえば、ビデオIDが500Pm4mQZQQ(静止画像ビデオ)の場合、次のサムネイルが表示されます。

http://i.ytimg.com/vi/500Pm4mQZQQ/1.jpg
http://i.ytimg.com/vi/500Pm4mQZQQ/2.jpg
http://i.ytimg.com/vi/500Pm4mQZQQ/3.jpg

これらの画像が非常に類似している場合、ビデオは静的です(圧縮ノイズのために完全に同一ではありません)。利用可能な3つの静止画像を簡単に比較するために、実際の画像比較アルゴリズムを適用する必要はありません。ファイルサイズを比較するだけです。

アイデア:JPEGサイズを比較する

これらはJPEG画像です。それらのファイルサイズは、画像をどれだけうまく圧縮できるかによって異なります。同様の画像は、同様のファイルサイズになります。

上記の例には、3534、3539、および3539バイトがあります。いくつかのランダムな非静的ビデオをチェックすると、4179、4726、および4779バイトというはるかに大きな違いがあります。非常に類似したファイルサイズ=静的ビデオ。

始めましょう

画像のバイトサイズを取得することは、Javascriptでは(簡単に)不可能です。ただし、サーバー側の手法では簡単なはずです。PHPを使用する簡単な方法は次のとおりです。

$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE));
$filesize = $head['content-length'];

編集:

PHPでの実装のテスト:

<?php
$urls = array(
    // Actual videos
    'https://www.youtube.com/watch?v=1iTg20x7w2s',
    'https://www.youtube.com/watch?v=uY6ooLaM3_U',
    'https://www.youtube.com/watch?v=E0vNU6pEQLU',
    // Static videos
    'https://www.youtube.com/watch?v=wWiC_I7R2iI',
    'https://www.youtube.com/watch?v=ytbpMht-7OA',
    'https://www.youtube.com/watch?v=x_38wF6bYCw'
);

foreach($urls as $url) {
    echo $url . ":\n";
    echo thumbSizeStandardDeviation($url) . "\n\n";
}

/**
 * This is the main function
 */
function thumbSizeStandardDeviation($url) {
    $videoId = extractVideoId($url);

    for($i = 1; $i <= 3; $i++) {
        $thumbnailUrl =
            "http://i.ytimg.com/vi/" . $videoId . "/" . $i . ".jpg";
        $fileSizes[] = getRemoteFileSize($thumbnailUrl);
    }

    return standardDeviation($fileSizes);
}

/**
 * https://stackoverflow.com/a/3393008/376138
 */
function extractVideoId($url) {
    parse_str( parse_url( $url, PHP_URL_QUERY ), $queryParams );
    return $queryParams['v'];
}

/**
 * https://stackoverflow.com/a/12249536/376138
 */
function getRemoteFileSize($url) {
    $headers = array_change_key_case(get_headers($url, TRUE));
    return $headers['content-length'];
}

/**
 * https://en.wikipedia.org/wiki/Standard_deviation#Basic_examples
 */
function standardDeviation($numbers) {
    $mean = array_sum($numbers) / count($numbers);
    $differenceSum = 0;
    foreach($numbers as $number) {
        $differenceSum += pow($number - $mean, 2);
    }
    return sqrt($differenceSum / count($numbers));
}

テスト結果:

私は3つの「通常の」ビデオと3つの完全に静的なビデオを使用しました、それらのURLはコードにあります。コマンドラインでスクリプトを実行すると、次のようになります。

$ php youtube-is-static-video.php
https://www.youtube.com/watch?v=1iTg20x7w2s:
271.21496189472

https://www.youtube.com/watch?v=uY6ooLaM3_U:
28.335294049805

https://www.youtube.com/watch?v=E0vNU6pEQLU:
182.70620010157

https://www.youtube.com/watch?v=wWiC_I7R2iI:
4.1899350299922

https://www.youtube.com/watch?v=ytbpMht-7OA:
7.5424723326565

https://www.youtube.com/watch?v=x_38wF6bYCw:
5.1854497287013

この(確かに小さい)サンプルでは、​​通常のサンプル(最初の3つ)と静的なサンプル(最後の3つ)を区別することが実際に可能です。

大きな問題は、複数の静止画像で作成されたビデオ(スライドショー)です。これは、音楽のアップロードでは非常に一般的です。

于 2013-02-14T00:46:35.070 に答える
5

動画が静止画像であるかどうかを判断する公式の方法はありませんが、それでもいくつかのトリックを行うことができます。

あなたはビデオのサムネイルを得ることができますhttp://i.ytimg.com/vi/VIDEO_ID/X.jpg。たとえば、ビデオIDが500Pm4mQZQQ(静止画像ビデオ)の場合、次のサムネイルが表示されます。

これで、画像類似性検出ライブラリを使用して、サムネイルの類似性を判断できます。たとえば、次のjs-image-similarity JavaScriptアルゴリズムを使用できます:https ://github.com/bitlyfied/js-image-similarity

注:このJSライブラリは、最新のWebKitでのみ機能するようになっています。CanvasとArray.forEachのサポートが必要です。

PHPを使用することもできます。ここでアルゴリズムの詳細を読み、このPHPクラスも確認してください:http ://www.phpclasses.org/package/6478-PHP-Compare-two-images-to-find-the-differences.html

于 2013-02-13T14:41:45.913 に答える
2

いいえ、ごめんなさい。再生中のオーディオコンテンツまたはビジュアルコンテンツに関する情報を取得するためのYouTubeAPIはサポートされていません。

于 2012-12-10T22:44:48.070 に答える
1

これはYouTubeAPIではサポートされていませんが、HTML5ビデオではサポートされているはずです。HTML5の使用単一のフレームを画像のようにコピーできます。次に、単一のピクセルを操作することが可能です。

次のコードは、単一のフレーム(ビデオ)からピクセルデータを取得します。

bcv.drawImage(video, 0, 0, w, h); /* bcv is a canvas object */
var apx = bcv.getImageData(0, 0, w, h);
var data = apx.data;
于 2013-02-13T14:29:59.960 に答える