mra*_*bin 9 javascript youtube jquery youtube-api
如何确定YouTube视频是实际视频还是静态图像?
由于使用youtube API可能无法实现,是否有使用javascript/jquery扫描窗口给定区域中的像素并确定它们是否已更改的解决方法?
pix*_*tik 11
这个粗略的想法是基于Stichoza的答案,但更简单.
您可以获取视频缩略图http://i.ytimg.com/vi/VIDEO_ID/X.jpg.例如,如果视频ID是500Pm4mQZQQ(静态图像视频),您将拥有以下缩略图:
Run Code Online (Sandbox Code Playgroud)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图像.它们的文件大小会有所不同,具体取决于图像的压缩程度.类似的图像将导致类似的文件大小.
上面的例子有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'];
Run Code Online (Sandbox Code Playgroud)
编辑:
<?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));
}
Run Code Online (Sandbox Code Playgroud)
我使用了三个"普通"视频和三个完全静态的视频,他们的网址在代码中.在命令行运行脚本,我得到:
$ 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
Run Code Online (Sandbox Code Playgroud)
在这个(不可否认的小)样本中,确实可以从静态(前三个)告诉正常(前三个).
一个很大的问题是由多个静止图像组成的视频(幻灯片),这在音乐上传中非常常见.
没有正式的方法来确定视频是否是静态图像,但你仍然可以做一些技巧.
您可以获得视频缩略图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
归档时间: |
|
查看次数: |
1567 次 |
最近记录: |