Проверьте, является ли видео youtube статическим изображением

Как можно определить, является ли видео youtube фактическим видео или просто статическим изображением?

поскольку, вероятно, невозможно использовать API youtube, существует ли обходной путь с помощью javascript/jquery для сканирования пикселей в данной области окна и определения их изменения?

4 ответов


эта грубая идея основана на ответ Stichoza, но намного проще.

используйте только эскизы

вы можете получить миниатюры видео http://i.ytimg.com/vi/VIDEO_ID/X.jpg. Для например, если идентификатор видео 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

если эти изображения очень похожи, видео статично (они не будут точно идентичны из-за шума сжатия). Чтобы сравнить три доступных неподвижных изображения простым способом, вам не нужно применять фактические алгоритмы сравнения изображений. Просто сравните их размеры.

идея: сравните размеры JPEG

это изображения JPEG. Их размер варьирует, в зависимости от того, насколько хорошо изображение может быть сжато. Похожие изображения приведут к одинаковым размерам файлов.

приведенные выше примеры имеют 3534, 3539, и 3539 байт. Проверяя случайное нестатическое видео, я становлюсь намного больше. различия: 4179, 4726, и 4779 байт. Очень похожие размеры файлов = статическое видео.

начать

получение размера байта изображения (легко) невозможно с помощью Javascript. Но это должно быть тривиально с любой серверной техникой. Вот!--27-->простой способ с PHP:

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

Edit:

тестовая реализация в 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));
}

результат теста:

я использовал три "нормальных" видео и три полностью статичных видео, их 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

в этом (по общему признанию, небольшом) образце действительно можно отличить нормальное (первые три) от статического (последние три).

большая проблема будет видео из несколько неподвижные изображения (слайд-шоу), что довольно распространено для загрузки музыки.


нет официального способа определить, является ли видео статическим изображением на not,но вы все еще можете сделать некоторые трюки.

вы можете получить видео-картинки http://i.ytimg.com/vi/VIDEO_ID/X.jpg. Например, если идентификатор видео 500Pm4mQZQQ (статическое изображение), вы будете иметь это миниатюры:

теперь вы можете использовать библиотеки обнаружения сходства изображений для определения сходства эскизов. Например, вы можете использовать это Яш-образ-подобие алгоритм JavaScript: https://github.com/bitlyfied/js-image-similarity

Примечание: эта библиотека JS должна работать только в последнем WebKit. Поддержка холста и массива.foreach это требуется.

вы также можете использовать PHP. Подробнее об алгоритме здесь а также проверьте этот класс PHP: http://www.phpclasses.org/package/6478-PHP-Compare-two-images-to-find-the-differences.html


нет, к сожалению. В API YouTube нет поддержки для получения информации о воспроизводимом аудио-или визуальном контенте.


это не поддерживается API YouTube, но это должно быть возможно для видео 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;