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

如果这些图像非常相似,则视频是静态的(由于压缩噪声,它们不会完全相同)。为了以简单的方式比较三个可用的静止图像,您不需要应用实际的图像比较算法。只需比较它们的文件大小。

想法:比较 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));
}

测试结果:

我使用了三个“普通”视频和三个完全静态的视频,它们的 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

在这个(诚然很小的)样本中,确实可以将正常(前三个)与静态(后三个)区分开来。

一个大问题是由多个静止图像(幻灯片)组成的视频,这对于音乐上传来说很常见。

于 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

不,对不起。YouTube API 不支持检索有关正在播放的音频或视频内容的信息。

于 2012-12-10T22:44:48.070 回答
1

YouTube API 不支持此功能,但 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 回答