如何从YouTube API获取YouTube视频缩略图?

2790
如果我有一个YouTube视频的URL,是否有办法使用PHP和cURL从YouTube API中获取相关的缩略图?

1
这里是我创建的一些PHP函数,用于从URL方法中获取最佳缩略图而无需ping API,基于此页面上许多好的答案:https://gist.github.com/squarecandy/30ec9f6779c0e8cdf12e337c665d96c5 - squarecandy
从现在开始,您需要使用它来从YouTube视频ID中提取缩略图图像https://img.youtube.com/vi/{VIDEO_ID}/maxresdefault.jpg - Md. Suhel Arman Khan
32个回答

5349
每个YouTube视频都有四张生成的图片。它们的格式如下所示:
https://img.youtube.com/vi/<insert-youtube-video-id-here>/0.jpg
https://img.youtube.com/vi/<insert-youtube-video-id-here>/1.jpg
https://img.youtube.com/vi/<insert-youtube-video-id-here>/2.jpg
https://img.youtube.com/vi/<insert-youtube-video-id-here>/3.jpg

列表中的第一个是完整尺寸的图像,其余是缩略图像。默认的缩略图像(即其中之一:1.jpg2.jpg3.jpg)为:

https://img.youtube.com/vi/<insert-youtube-video-id-here>/default.jpg

若要获取高质量的缩略图,请使用类似于此的URL:

https://img.youtube.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg

还有一种中等质量的缩略图版本,使用类似于高清版的URL:

https://img.youtube.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg

如果要使用标准定义版本的缩略图,请使用类似于此的URL:

https://img.youtube.com/vi/<insert-youtube-video-id-here>/sddefault.jpg

要获得缩略图的最大分辨率版本,请使用类似于此的URL:

https://img.youtube.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg

所有上述URL都可以通过HTTP访问。此外,在示例URL中,稍微缩短的主机名i3.ytimg.com也可以替代img.youtube.com

或者,您可以使用YouTube数据API(v3)获取缩略图图像。


55
以防其他人犯同样的愚蠢错误,我提醒大家不能使用 http://www.img.youtube.com,只能使用 http://img.youtube.com - Ciaran Phillips
16
sddefault.jpgmaxresdefault.jpg格式不再可用。 - clami219
8
@munissor那不是真的,“0.jpg并不总是全尺寸”版本……可能是,但这不是一个规则。 - jave.web
13
由于“sddefault”和“maxresdefault”并不总是可用的,那么“mqdefault”是否适用于所有视频?获取缩略图的最佳URL是什么,可以避免出现两个黑边(在顶部和底部)? - Ne AS
18
如果有人想知道如何获取非默认大小的尺寸:我刚试了一下(并且它确实有效),格式名称可以作为前缀。因此,您可以获取maxres2.jpghq2.jpghq3.jpg等尺寸。 - Hernan
显示剩余16条评论

433
您可以使用YouTube数据API检索视频缩略图、字幕、描述、评分、统计数据等。 API版本3需要一个密钥*。获取密钥并创建视频列表请求:
https://www.googleapis.com/youtube/v3/videos?key=YOUR_API_KEY&part=snippet&id=VIDEO_ID

示例PHP代码

$data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?key=YOUR_API_KEY&part=snippet&id=T0Jqdjbed40");
$json = json_decode($data);
var_dump($json->items[0]->snippet->thumbnails);

输出

object(stdClass)#5 (5) {
  ["default"]=>
  object(stdClass)#6 (3) {
    ["url"]=>
    string(46) "https://i.ytimg.com/vi/T0Jqdjbed40/default.jpg"
    ["width"]=>
    int(120)
    ["height"]=>
    int(90)
  }
  ["medium"]=>
  object(stdClass)#7 (3) {
    ["url"]=>
    string(48) "https://i.ytimg.com/vi/T0Jqdjbed40/mqdefault.jpg"
    ["width"]=>
    int(320)
    ["height"]=>
    int(180)
  }
  ["high"]=>
  object(stdClass)#8 (3) {
    ["url"]=>
    string(48) "https://i.ytimg.com/vi/T0Jqdjbed40/hqdefault.jpg"
    ["width"]=>
    int(480)
    ["height"]=>
    int(360)
  }
  ["standard"]=>
  object(stdClass)#9 (3) {
    ["url"]=>
    string(48) "https://i.ytimg.com/vi/T0Jqdjbed40/sddefault.jpg"
    ["width"]=>
    int(640)
    ["height"]=>
    int(480)
  }
  ["maxres"]=>
  object(stdClass)#10 (3) {
    ["url"]=>
    string(52) "https://i.ytimg.com/vi/T0Jqdjbed40/maxresdefault.jpg"
    ["width"]=>
    int(1280)
    ["height"]=>
    int(720)
  }
}

* 不仅需要密钥,根据您计划进行的API请求数量,您可能会被要求提供账单信息。但是,每天少量的请求是免费的。

来源文章


6
FYI:我没有改变代码以适应新的JSON结构。你getJson中的代码是错误的。你使用了jsonc而不是json来获取JSON数据。由于你的JSON结构错误,它会失败。 翻译为:提醒您:我并没有更改代码以适应新的JSON结构。您的getJSON中的代码有误。您使用了 jsonc 而不是 json 来进行getJSON操作。这是因为您的JSON结构错误导致操作失败。 - mauris
5
只有第一个示例可以使用 jsonc。jQuery 和 PHP 示例 必须 使用 json。我已经更新了代码以符合新的 JSON 结构。我现在正在使用该代码,它正在实时工作。所以请先阅读更改后再说它不起作用。谢谢! - mauris
7
请问是否有参考资料?此外,请求特定API版本号(v=2)可以处理API更改。需要使用JSON格式来演示jQuery和PHP的例子。 - Salman A
4
gdata调用不会返回maxresdefault.jpg是否可用的信息,即使在可以使用的视频中,它只会返回mq/hq/sd。 - Aaron
2
API v3的文档非常糟糕。虽然他们提供了示例代码,但“参考”部分缺乏详细信息。一些本应相对“明显”的事情似乎需要极其复杂的解决方案。 - CashCow

347
阿萨夫说的没错。然而,并不是每个YouTube视频都包含所有九个缩略图。此外,缩略图的图像大小取决于视频本身(下面的数字是基于一个视频的)。有一些缩略图是肯定存在的:
Width Height URL
120 90 https://i.ytimg.com/vi//1.jpg
120 90 https://i.ytimg.com/vi//2.jpg
120 90 https://i.ytimg.com/vi//3.jpg
120 90 https://i.ytimg.com/vi//default.jpg
320 180 https://i.ytimg.com/vi//mq1.jpg
320 180 https://i.ytimg.com/vi//mq2.jpg
320 180 https://i.ytimg.com/vi//mq3.jpg
320 180 https://i.ytimg.com/vi//mqdefault.jpg
480 360 https://i.ytimg.com/vi//0.jpg
480 360 https://i.ytimg.com/vi//hq1.jpg
480 360 https://i.ytimg.com/vi//hq2.jpg
480 360 https://i.ytimg.com/vi//hq3.jpg
480 360 https://i.ytimg.com/vi//hqdefault.jpg
此外,还可能存在其他一些缩略图,也可能不存在。它们的存在与否可能取决于视频的质量。
Width Height URL
640 480 https://i.ytimg.com/vi//sd1.jpg
640 480 https://i.ytimg.com/vi//sd2.jpg
640 480 https://i.ytimg.com/vi//sd3.jpg
640 480 https://i.ytimg.com/vi//sddefault.jpg
1280 720 https://i.ytimg.com/vi//hq720.jpg
1920 1080 https://i.ytimg.com/vi//maxresdefault.jpg

你可以在以下地方找到用于获取缩略图和其他YouTube信息的JavaScript和PHP脚本:

你还可以使用YouTube视频信息生成器工具,通过提交URL或视频ID获取有关YouTube视频的所有信息。


6
您可以通过官方YouTube链接 http://img.youtube.com/vi/mJ8tq8AnNis/mqdefault.jpg 来达到相同的效果,其中mJ8tq8AnNis是视频ID。 - Ragaisis
5
YouTube视频信息生成器工具目前无法使用,请考虑编辑回答。 - giovannipds
2
建议删除所有三个链接。据我所见,它们都没有提供任何有用的信息。 - Bob Stein
就此而言,YouTube前端硬编码mqdefault.jpg为320x180。 - Mattwmaster58

94

在YouTube API V3中,我们还可以使用这些URL来获取缩略图...它们根据其质量进行分类。

https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/default.jpg -   default
https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg - medium 
https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg - high
https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/sddefault.jpg - standard

对于最大分辨率...

https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg

相对于第一个答案中的URL,这些URL的一个优点是它们不会被防火墙屏蔽。


3
这些图像是否应该放在img标签中,仅仅是这样做就可以工作了吗?因为我正在尝试使用正确的YouTube视频ID链接,并将它们放在img标签中,但我一直收到404错误。 - Lion789
5
@Lion789,当这些URL放置在img标签中时,它们可以正常工作。问题可能是视频ID错误或所请求的分辨率不可用,但这些错误不会导致404错误。请检查img标签的URL。 - Naren
2
API v2停用后,URL是否仍将继续工作已得到确认? - Daniele B
1
@DanieleB 这些URL仍然有效。您知道如何检查这些URL在API v2之后是否仍然有效吗? - Naren

66

如果您想摆脱“黑边”,并像YouTube一样处理,您可以使用:

https://i.ytimg.com/vi_webp/<video id>/mqdefault.webp

如果您无法使用.webp文件扩展名,可以这样做:

https://i.ytimg.com/vi/<video id>/mqdefault.jpg

另外,如果您需要未缩放的版本,请使用maxresdefault而不是mqdefault

注意:如果您打算使用maxresdefault,我不确定它的纵横比。


3
许多视频都无法使用此功能。例如:http://i.ytimg.com/vi_webp/mJ8tq8AnNis/mqdefault.webp - NickG
4
如果你移除 "_webp" 并将扩展名改为 ".jpg",它就能工作。这是一个有效的例子:http://i.ytimg.com/vi/mJ8tq8AnNis/mqdefault.jpg ,但我不确定它的长宽比是否正确。 - LuTz
谢谢。有没有办法获取没有黑边的 sddefault?https://img.youtube.com/vi_webp/dQw4w9WgXcQ/sddefault.webp 一直返回带有黑边的图像。 - Akshay K Nair

63
如果您想获取特定视频ID的YouTube最大图像,则URL应该类似于这样:
http://i3.ytimg.com/vi/SomeVideoIDHere/0.jpg

使用API,您可以获取默认缩略图像。简单的代码应该是这样的:

//Grab the default thumbnail image
$attrs = $media->group->thumbnail[1]->attributes();
$thumbnail = $attrs['url'];
$thumbnail = substr($thumbnail, 0, -5);
$thumb1 = $thumbnail."default.jpg";

// Grab the third thumbnail image
$thumb2 = $thumbnail."2.jpg";

// Grab the fourth thumbnail image.
$thumb3 = $thumbnail."3.jpg";

// Using simple cURL to save it your server.
// You can extend the cURL below if you want it as fancy, just like
// the rest of the folks here.

$ch = curl_init ("$thumb1");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$rawdata = curl_exec($ch);
curl_close($ch);

// Using fwrite to save the above
$fp = fopen("SomeLocationInReferenceToYourScript/AnyNameYouWant.jpg", 'w');

// Write the file
fwrite($fp, $rawdata);

// And then close it.
fclose($fp);

6
我找到了一个例子,其中0.jpg的分辨率为480x360,而maxresdefault.jpg的分辨率为1280x720。 - Nico Haase

38

我写了一个函数,只从YouTube获取已存在的图像

function youtube_image($id) {
    $resolution = array (
        'maxresdefault',
        'sddefault',
        'mqdefault',
        'hqdefault',
        'default'
    );

    for ($x = 0; $x < sizeof($resolution); $x++) {
        $url = '//img.youtube.com/vi/' . $id . '/' . $resolution[$x] . '.jpg';
        if (get_headers($url)[0] == 'HTTP/1.0 200 OK') {
            break;
        }
    }
    return $url;
}

我在 Laravel 控制器中使用 get_headers() 函数时得到了以下提示:此函数只能用于 URL。 - Youssef Boudaya
FYI - 看起来它似乎不能获取现有的图像,而是获取第一个可用的图像。 - Zippp

35

YouTube属于Google,Google希望有适合不同屏幕尺寸的合理数量的图像,因此它的图像以不同的尺寸存储。以下是您的缩略图的示例:

低质量缩略图:

http://img.youtube.com/vi/<YouTube_Video_ID_HERE>/sddefault.jpg

中等质量缩略图:

http://img.youtube.com/vi/<YouTube_Video_ID_HERE>/mqdefault.jpg

高质量缩略图:

http://img.youtube.com/vi/<YouTube_Video_ID_HERE>/hqdefault.jpg

最高质量的缩略图:

http://img.youtube.com/vi/<YouTube_Video_ID_HERE>/maxresdefault.jpg

sddefault.jpg实际上比hqdefault.jpg质量更高。质量递增的顺序是default, mqdefault, hqdefault, sddefault, maxresdefault - undefined

34
您可以获取包含视频缩略图URL的视频条目。链接中有示例代码。或者,如果您想解析XML,则可以在此处找到信息。返回的XML具有一个media:thumbnail元素,其中包含缩略图的URL。

34

1
我猜这应该是正确的做法,因为它来自一个谷歌开发关系成员,用于YouTube API。 - Adonis K. Kakoulidis

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