获取 YouTube 视频的尺寸大小(宽度/高度)

18

我正在尝试获取YouTube视频的大小。 我使用Gdata API调用来检索基本信息(标题,URL,缩略图和类别),但无法找到视频尺寸。

我正在使用YouTube Data API服务器端调用将一些视频嵌入网站,如下所示:http://gdata.youtube.com/feeds/api/videos/z_AbfPXTKms?0=v&1=2&alt=json。不幸的是,没有关于视频尺寸的可靠信息(即使在宽屏视频中所有预览图像也是4/3比率)。

我的目标是完全适合播放器的视频; 播放器宽度固定,因此我只需要原始尺寸或至少比例。

有没有办法使用Youtube API检索此类数据?

(我的备选计划是将播放器大小设置为4/3并永远不回看,但任何帮助都将不胜感激!)

5个回答

12

6
这个视频的分辨率是1080p,但仍返回480x270:http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch?v%3DucivXRBrP_0&format=json 所以我会选择Israel的答案。 - Antoine
1
感谢您的报告!YouTube的工作人员似乎对他们的oEmbed API并不是很关注 :-( - Isra
1
不冒犯,但这是最高评价和被接受的答案吗?尽管它并不起作用?还是我错了? - jakob.j
1
@jakob.j 你说得对,这个方法已经不再适用了。请参考我的回答,其中提供了一个可行的解决方案(截至2017年)。 - rsp

11

更新2017 - 接受的答案已不再适用

如果您想获取问题中示例视频的尺寸:

那么请尝试使用Noembed提供的以下URL:

它将返回以下JSON:

{
  "version": "1.0",
  "title": "まるです。",
  "author_name": "mugumogu",
  "provider_url": "https://www.youtube.com/",
  "width": 459,
  "height": 344,
  "thumbnail_height": 360,
  "type": "video",
  "thumbnail_width": 480,
  "provider_name": "YouTube",
  "url": "https://www.youtube.com/watch?v=z_AbfPXTKms",
  "author_url": "https://www.youtube.com/user/mugumogu",
  "html": "\n<iframe width=\" 459\" height=\"344\" src=\"https://www.youtube.com/embed/z_AbfPXTKms?feature=oembed\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"></iframe>\n",
  "thumbnail_url": "https://i.ytimg.com/vi/z_AbfPXTKms/hqdefault.jpg"
}
它还支持JSONP进行跨域请求: 有关详细信息,请参见此答案:

演示

使用jQuery的简单演示:

var id = 'z_AbfPXTKms';
var url = 'https://www.youtube.com/watch?v=' + id;

$.getJSON('https://noembed.com/embed',
    {format: 'json', url: url}, function (data) {
    alert('Dimensions: ' + data.width + 'x' + data.height);
});

请查看在JSBin上的演示


这个视频的尺寸是300x250 https://www.youtube.com/watch?v=DAvyF2CKfNg 我没有得到正确的尺寸或比例。 - Jakob Sternberg
很奇怪,有些视频是正确的(例如,https://www.youtube.com/watch?v=tsJEmLkphrI),但对于其他视频则不正确。我想这可能是YouTube的一个bug或者在上传到YouTube时视频的尺寸真的发生了变化。 - starikovs
8
不幸的是,它增加了对第三方网站的依赖。谁在运营那个网站?它会永远在线吗?... - rupps

9

现在已经有一个解决方案:如果您抓取视频的公共页面:

http://www.youtube.com/watch?v=[id]

您可以看到开放图谱宽度和高度标签,例如:

<meta property="og:video:width" content="1920">
<meta property="og:video:height" content="1080">

所以您可以在那里获取尺寸信息 ;-)

有没有可能在不加载完整网站的HTML代码的情况下获取这些信息? 如果一个人想要一次获取几个视频的分辨率,那么这似乎是一种相关的效率开销。 - jakob.j
3
没有这样的标签。 - catamphetamine
1
那个答案是什么?没有这样的标签。它应该放在哪里,源页面代码中还是生成的代码中? - serge

3
如果你按照以下方式加载YouTube视频,那么仅在视频加载完成后才可以触发JavaScript函数。
<script src="https://www.youtube.com/iframe_api"></script>
    <center>
        <div class="videoWrapper">
           <div id="player"></div>
        </div>
    </center>
<script>
    function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
            videoId:'xxxxxxxxxxx',playerVars: {  controls:0,autoplay:0,disablekb:1,enablejsapi:1,iv_load_policy:3,modestbranding:1,showinfo:0,rel:0,theme:'light' }
        } );
        resizeHeroVideo();
    }
</script>

resizeHeroVideo 在视频加载后被调用。

var player = null;
$( document ).ready(function() {
    resizeHeroVideo();
} );

$(window).resize(function() {
    resizeHeroVideo();
});

function resizeHeroVideo() {
    var content = $('#hero');
    var contentH = viewportSize.getHeight();
    contentH -= 158;
    content.css('height',contentH);

    if(player != null) {
        var iframe = $('.videoWrapper iframe');
        var iframeH = contentH - 150;
        if (isMobile) {
            iframeH = 163; 
        }
        iframe.css('height',iframeH);
        var iframeW = iframeH/9 * 16;
        iframe.css('width',iframeW);
    }
}

然后,我们计算尺寸以保持其在页面中心的位置,遵循适当的16:9宽高比。 完整代码片段请查看:这里。示例网页请查看:这里

3

继承Isra的解决方案之后,是的,看起来youtube尚未开发他们的oEmbed API代码,因为videoFrameSize返回470 x 270 px。但至少它提供了一些可以动态抓取的东西!

使用“Lee taylor”提出的“吸入并查看”方法是实现此目的的简单方式,但如果需要动态内容,这不是理想的选择。

好吧 - 考虑到oEmbed提供的不准确尺寸 - 它确实提供了一种解决方案。

我目前正在开发一个针对与YouTube视频相关的图库中视频内容的structuredData生成器。

这里有一种从youtube获取尺寸的不准确方法,但至少它提供了数据!

如何从Youtube获取视频大小。

阶段1: 从youtube调用oEmbed数据:

$video_id = "your youtube videos unique ID number ";

$oEmbed         = simplexml_load_file('http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch?v=' . $video_id . '&format=xml');

阶段2:

    $data['height'] = $oEmbed->height;
    $data['width']  = $oEmbed->width;

    $data['videoFrameSize'] = $oEmbed->height . "x" . $oEmbed->width . "px";

第三阶段:

根据你的需要在编码中使用变量:


它不起作用。如果我上传一个300x250像素的视频,我会得到:{"type":"video","html":"\u003ciframe .... "height":344,"width":459...}没有任何地方说300x250,而459x344的比例(宽度/高度比)与300x250不同。 - Jakob Sternberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接