Проверьте, является ли видео 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 (статическое изображение), вы будете иметь это миниатюры:
- http://i.ytimg.com/vi/500Pm4mQZQQ/1.jpg
- http://i.ytimg.com/vi/500Pm4mQZQQ/2.jpg
- http://i.ytimg.com/vi/500Pm4mQZQQ/3.jpg
теперь вы можете использовать библиотеки обнаружения сходства изображений для определения сходства эскизов. Например, вы можете использовать это Яш-образ-подобие алгоритм 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;