确定YouTube视频是否为宽屏?

时间:2015-07-02 15:01:55

标签: php youtube youtube-api google-api-php-client aspect-ratio

我想确定YouTube视频是否为宽屏或不使用v3 API。有许多旧视频的比例为4:3,因此我需要检测到这一点。

这可以通过API v2实现,但现在正式退役。以下是API v3 docs

API调用看起来像这样:

https://www.googleapis.com/youtube/v3/videos?id=[VIDEOID]&part=snippet&key=[DEVELOPERKEY]

此外,缩略图数据始终返回 4:3 的尺寸,因此无法提供帮助。这是一个例子:

[thumbnails] => Array
(
    [default] => Array
    (
        [url] => https://i.ytimg.com/vi/nnnnnnnnn/default.jpg
        [width] => 120
        [height] => 90
    )
    ...
)

有什么想法吗?

(我目前 hacking 这是通过分析缩略图中的4:3视频中的黑色条形码的像素来实现的。)

以下是4:3比例的视频示例:

https://www.youtube.com/watch?v=zMJ-Dl4eJu8(古老的武侠视频)

martial arts in 4:3

和16:9中的一个:

https://www.youtube.com/watch?v=7O2Jqi-LhEI(新的锻炼视频)

workout video

更新:一个有希望的建议是探索fileDetails.videoStreams[].aspectRatio,但似乎只有视频所有者可以使用。否则请求fileDetails会导致

  

请求无法访问用户评级信息。由于请求未得到适当授权,可能会发生此错误

2 个答案:

答案 0 :(得分:2)

如果您愿意使用API​​以外的其他方法,那么我相信可以通过oEmbed API实现。

http://www.youtube.com/oembed?url={VIDEO_URL}&format=json

像这样:

http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=zMJ-Dl4eJu8&format=json

会产生:

{  
    "provider_url":"https:\/\/www.youtube.com\/",
    "thumbnail_url":"https:\/\/i.ytimg.com\/vi\/zMJ-Dl4eJu8\/hqdefault.jpg",
    "thumbnail_height":360,
    "height":344,
    "type":"video",
    "version":"1.0",
    "html":"\u003ciframe width=\"459\" height=\"344\" src=\"https:\/\/www.youtube.com\/embed\/zMJ-Dl4eJu8?feature=oembed\" frameborder=\"0\" allowfullscreen\u003e\u003c\/iframe\u003e",
    "author_name":"hadronica2",
    "width":459,
    "provider_name":"YouTube",
    "author_url":"https:\/\/www.youtube.com\/user\/hadronica2",
    "title":"Aikido - Kazuo Chiba sensei - 1\u00ba part",
    "thumbnail_width":480
}

在您给出的示例中,输出如下:

http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=zMJ-Dl4eJu8&format=json

Width: 459
Height: 344
Ratio: w/h = 1.3343 = 4:3 (ish)

http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=zMJ-Dl4eJu8&format=json

Width: 480
Height: 270
Ratio: w/h = 1.7777 = 16/9

这似乎适用于您提供的示例。

答案 1 :(得分:1)

这是我从API的v2退役以来一直使用的删节版本。

它测试了给定视频的default.jpg缩略图图像的顶部和底部的几个点,其中可能是黑条。测试与顶点垂直相对的点以查看这些像素是否彼此相似以在某个增量内。这又重复了几点。

function isWidescreen($video = null) {

    // LOGIC:
    // 4:3 videos will have default.jpg with no top black bars
    // 16:9 videos will have black top and bottom borders on default.jpg

    // Get the default thumbnail (may have black bars on top and bottom)
    $response = self::accessCurlObj()->get("https://i.ytimg.com/vi/{$video}/default.jpg");
    $defaultImgRes = imagecreatefromstring($response);

    $samplePoints = array(array(20,2), array(40,4), array(60,6), array(80,8));

    // Scan a few points for equality between top and bottom
    $height = imagesy($defaultImgRes);
    foreach($samplePoints as $point) {
        // Top
        $rgbTop = imagecolorat($defaultImgRes, $point[0], $point[1]);
        $colorsTop = imagecolorsforindex($defaultImgRes, $rgbTop);

        // Bottom
        $rgbBottom = imagecolorat($defaultImgRes, $point[0], $height - $point[1]);
        $colorsBottom = imagecolorsforindex($defaultImgRes, $rgbBottom);

        // If these arrays are not close, then let's call this 4:3 aspect
        if(!$this->areArraysClose($colorsTop, $colorsBottom, 20)) {
            return false;
        }
    }

    // Default to widescreen
    return true;
}

// Determine if the numeric values in the RGBA array are within some delta from each other
function areArraysClose(&$a, &$b, $delta = 10) {
    foreach($a as $key => $val) {
        if(abs($val - $b[$key]) > $delta) {
            return false;
        }
    }
    return true;
}

这似乎足够有效。一个明显的改进是检查像素是否接近黑色,或者应用一些图像处理来自动删除黑条,然后检查剩余图像的尺寸。

然而,我希望知识领域的SO成员在深入挖掘这个兔子洞之前能有更好的解决方案...... someone came through