获取 YouTube 视频缩略图并将其与 PHP 一起使用

Posted

技术标签:

【中文标题】获取 YouTube 视频缩略图并将其与 PHP 一起使用【英文标题】:Get YouTube video thumbnail and use it with PHP 【发布时间】:2015-11-27 13:20:15 【问题描述】:

如何使用 YouTube API 中的视频链接访问 YouTube 视频的缩略图集。 我希望使用 php 使用存储在变量中的视频 ID 在网站上显示缩略图,例如 $link

【问题讨论】:

【参考方案1】:

YouTube 在其服务器上为不同的设备存储了许多不同类型的缩略图。您可以使用视频 ID 访问它 每个 YouTube 视频都有。您可以使用变量 $link 在您的网站上显示图像,该变量保存视频的 id 并替换它 在链接中 video_ID 的位置。

低质量缩略图:

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

示例:

如果您想访问以下视频的缩略图:

https://www.youtube.com/watch?v=Q-GYwhqDo6o

视频ID:Q-GYwhqDo6o

所以,这就是视频缩略图链接的样子:

http://img.youtube.com/vi/Q-GYwhqDo6o/mqdefault.jpg

希望对您有所帮助。享受编码。

【讨论】:

【参考方案2】:

要获得高质量的图像,您可以使用以下从 youtube API 获取的 URL

$video_id = explode("?v=", $link);
$video_id = $video_id[1];
$thumbnail="http://img.youtube.com/vi/".$video_id."/maxresdefault.jpg";

【讨论】:

所有答案中质量最好的...谢谢哥们。 这不适用于youtu.be 类型的网址,因为它们省略了?v= @MarcosDiPaolo 它适用于几乎所有视频。 @Rishi 确切地说,“几乎”,你不能用explode("?v=", $link); 分解youtu.be/&lt;video_id&gt; url 建议:使用alaouy/youtube 库。它管理 url、id 并与 Youtube Api v.3 通信,为您提供大量视频信息。【参考方案3】:

您可以使用以下代码。这对我来说是工作。根据您的要求选择图像质量。

<?php
$youtubeID = getYouTubeVideoId('youtube video url');
$thumbURL = 'https://img.youtube.com/vi/' . $youtubeID . '/mqdefault.jpg';
print_r($thumbURL);

function getYouTubeVideoId($pageVideUrl) 
    $link = $pageVideUrl;
    $video_id = explode("?v=", $link);
    if (!isset($video_id[1])) 
        $video_id = explode("youtu.be/", $link);
    
    $youtubeID = $video_id[1];
    if (empty($video_id[1])) $video_id = explode("/v/", $link);
    $video_id = explode("&", $video_id[1]);
    $youtubeVideoID = $video_id[0];
    if ($youtubeVideoID) 
        return $youtubeVideoID;
     else 
        return false;
    

?>

【讨论】:

太好了,我刚刚用这个创建了辅助函数,非常感谢【参考方案4】:

这是我下载 Youtube 缩略图的便捷功能

function downloadYouTubeThubnailImage($youTubeLink='',$thumbNamilQuality='',$fileNameWithExt='',$fileDownLoadPath='')
    
        $videoIdExploded = explode('?v=', $youTubeLink);   

        if ( sizeof($videoIdExploded) == 1) 
        
            $videoIdExploded = explode('&v=', $youTubeLink);

            $videoIdEnd = end($videoIdExploded);

            $removeOtherInVideoIdExploded = explode('&',$videoIdEnd);

            $youTubeVideoId = current($removeOtherInVideoIdExploded);
        else
            $videoIdExploded = explode('?v=', $youTubeLink);

            $videoIdEnd = end($videoIdExploded);

            $removeOtherInVideoIdExploded = explode('&',$videoIdEnd);

            $youTubeVideoId = current($removeOtherInVideoIdExploded);
        

        switch ($thumbNamilQuality) 
        
            case 'LOW':
                    $imageUrl = 'http://img.youtube.com/vi/'.$youTubeVideoId.'/sddefault.jpg';
                break;

            case 'MEDIUM':
                    $imageUrl = 'http://img.youtube.com/vi/'.$youTubeVideoId.'/mqdefault.jpg';
                break;

            case 'HIGH':
                    $imageUrl = 'http://img.youtube.com/vi/'.$youTubeVideoId.'/hqdefault.jpg';
                break;

            case 'MAXIMUM':
                    $imageUrl = 'http://img.youtube.com/vi/'.$youTubeVideoId.'/maxresdefault.jpg';
                break;
            default:
                return  'Choose The Quality Between [ LOW (or) MEDIUM  (or) HIGH  (or)  MAXIMUM]';
                break;
          

        if( empty($fileNameWithExt) || is_null($fileNameWithExt)  || $fileNameWithExt === '') 
        
            $toArray = explode('/',$imageUrl);
            $fileNameWithExt = md5( time().mt_rand( 1,10 ) ).'.'.substr(strrchr(end($toArray),'.'),1);
          

          if (! is_dir($fileDownLoadPath)) 
            
                mkdir($fileDownLoadPath,0777,true);
            

            file_put_contents($fileDownLoadPath.$fileNameWithExt, file_get_contents($imageUrl));
            return $fileNameWithExt;   
    

Function Description

参数

$youTubeLink Youtube 网址 for example https://www.youtube.com/watch?v=a3ICNMQW7Ok

$thumbNamilQuality 有很多品质如LOW ,MEDIUM, HIGH, MAXIMUM

缩略图质量列表取自 https://***.com/a/32346348/8487424

&& https://***.com/a/47546113/8487424

$fileNameWithExt 带扩展名的文件名**for example** myfavouriteimage.png

注意$fileNameWithExt 不是强制性的,它将生成基于uuid 的文件名 对于Example91b2a30d0682058ebda8d71606f5e327.jpg

如果你想把文件放到自定义目录使用这个参数

注意$fileDownLoadPath 不是强制性的,它将生成脚本执行的图像文件

一些示例

$folderpath = 'c:'.DIRECTORY_SEPARATOR.'xampp'.DIRECTORY_SEPARATOR.'htdocs'.DIRECTORY_SEPARATOR.'youtube'.DIRECTORY_SEPARATOR;

$imageName = 'mybeautfulpic.jpg';

downloadYouTubeThubnailImage('https://www.youtube.com/watch?v=a3ICNMQW7Ok','MAXIMUM',null,$folderpath );

downloadYouTubeThubnailImage('https://www.youtube.com/watch?v=a3ICNMQW7Ok','LOW',$imageName ,null);

希望它已经得到回答,但这个功能有some exta features

【讨论】:

【参考方案5】:

Google 在 v.3 上更改了 API,Python 中的代码可以正常工作!您可以用于 PHP。

def get_small_image_url(self):
    return 'http://img.youtube.com/vi/%s/%s.jpg' % (self.video_id, random.randint(1, 3))

def get_hqdefault(self):
    return 'http://i1.ytimg.com/vi/%s/hqdefault.jpg' % self.video_id

def get_mqdefault(self):
    return 'http://i1.ytimg.com/vi/%s/mqdefault.jpg' % self.video_id

def get_sddefault(self):
    return 'http://i1.ytimg.com/vi/%s/sddefault.jpg' % self.video_id

def get_video_id(self, url):
    link = urlparse.urlparse(url)
    if link.hostname == 'youtu.be':
        return link.path[1:]
    if link.hostname in ('www.youtube.com', 'youtube.com'):
        if link.path == '/watch':
            state = urlparse.parse_qs(link.query)
            return state['v'][0]
        if link.path[:7] == '/embed/':
            return link.path.split('/')[2]
        if link.path[:3] == '/v/':
            return link.path.split('/')[2]
    return False

def get_meta(self, video_id):
    api_token = **'here your API_Token'**
    url = 'https://www.googleapis.com/youtube/v3/videos?part=snippet&id=%s&key=%s' % (video_id, api_token)
    response = json.load(urllib.urlopen(url))
    print response
    context = 
        'title': response['items'][0]['snippet']['localized']['title'],
        'desc': response['items'][0]['snippet']['localized']['description']
    
    return context

def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):
    video_id = self.get_video_id(self.url)
    meta = self.get_meta(video_id)
    self.video_id = video_id
    self.title = meta['title']
    self.description = meta['desc']
    super(Videos, self).save(
        force_insert=force_insert,
        force_update=force_update,
        using=using,
        update_fields=update_fields
    )

【讨论】:

以上是关于获取 YouTube 视频缩略图并将其与 PHP 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用php和API从url获取youtube视频的缩略图

从youtube嵌入缩略图和视频(php - Wordpress)

如何使用 Youtube javascript API 在特定“秒”获取 youtube 视频的缩略图或快照?

html 从视频ID获取YouTube缩略图

JavaScript 获取YouTube视频ID和缩略图

php WP Foto Vote - 上传Youtube视频时触发,Video addon解析视频缩略图