【问题标题】:How to correctly use oembed to pull thumbs from youtube如何正确使用 oembed 从 youtube 拉拇指
【发布时间】:2012-05-09 18:32:32
【问题描述】:

我在我的主页上显示了很多来自 youtube 视频的拇指。我在下面使用此功能从 youtube 网址中获取拇指,该网址运行速度很快,但不适用于像 youtu.be/JSHDLSKL 这样的缩短形式的网址。

function get_youtube_screen_link( $url = '', $type = 'default', $echo = true ) {
if( empty( $url ) )
    return false;

if( !isset( $type ) )
    $type = '';

$url = esc_url( $url );

preg_match("|[\\?&]v=([^&#]*)|",$url,$vid_id);

if( !isset( $vid_id[1] ) )
    return false;

$img_server_num =  'i'. rand(1,4);

switch( $type ) {
    case 'large':
        $img_link = "http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/0.jpg";
        break;
    case 'first':
        // Thumbnail of the first frame
        $img_link = "http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/1.jpg";
        break;
    case 'small':
        // Thumbnail of a later frame(i'm not sure how they determine this)
        $img_link = "http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/2.jpg";
        break;
    case 'default':
    case '':
    default:
        $img_link = "http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/default.jpg";
        break;
}
if( $echo )
    echo $img_link;
else
    return $img_link;

}

所以我尝试使用 Oembed 来获取拇指,而不是它适用于 youtube 网址的所有变体,但它会检索 480px/360px 拇指,这会导致大量裁剪以将其缩小到我使用的 120px/90px 大小显示它们。另一个问题是它导致我的页面速度增加了 4 秒,我猜这是我实现它的方式的问题。这是我在循环中调用拇指的方式。

<?php 
 require_once(ABSPATH.'wp-includes/class-oembed.php');
 $oembed= new WP_oEmbed;
 $name = get_post_meta($post->ID,'video_code',true);
 $url = $name;
//As noted in the comments below, you can auto-detect the video provider with the following
 $provider = $oembed->discover($name);
//$provider = 'http://www.youtube.com/oembed';
 $video = $oembed->fetch($provider, $url, array('width' => 300, 'height' => 175));
 $thumb = $video->thumbnail_url; if ($thumb) { ?>
   <img src="<?php echo $thumb; ?>" width="120px" height="90px" />
<?php } ?>

那么我应该如何做到这一点以最大限度地提高效率?

【问题讨论】:

  • 使用 oembed 获取 id 以及您的第一个函数的其他部分 - 或者您的问题是什么?
  • 你的意思是使用oembed获取标准url,然后使用第一个函数获取拇指?我的问题是人们提交 youtube 网址以在我的网站上发布视频。顶部功能不会获得 url 的 youtu.be 版本的拇指。使用 Oembed 获取拇指得到 480/360 版本,这对我来说会导致不必要的裁剪。它增加了加载时间,我不知道为什么。
  • 这似乎不适用于浏览器中显示的实际视频的网址。我说的是像http://www.youtube.com/watch?v=bCDHeEbG3g8&amp;feature=g-all-u这样的长格式
  • 我强烈建议您稍微搜索一下该站点,因为您遇到的所有问题都已经被询问和回答 - 真的。您不是第一个寻找 youtube 图片的人(难怪您是否考虑到该网站的受欢迎程度)。请记住,如果 Google 将来更改 youtube URI 的布局,所有现有的解决方案可能不再适用。

标签: youtube-api thumbnails oembed


【解决方案1】:

好的,我从其他问题中想出了一个解决方案。首先,我们需要使用此函数从 youtube 具有的任何类型的 url 中获取 id。

function getVideoId($url)
{
$parsedUrl = parse_url($url);
if ($parsedUrl === false)
    return false;

if (!empty($parsedUrl['query']))
{
    $query = array();
    parse_str($parsedUrl['query'], $query);
    if (!empty($query['v']))
        return $query['v'];
}

if (strtolower($parsedUrl['host']) == 'youtu.be')
    return trim($parsedUrl['path'], '/');

return false;
}

现在我们可以使用 YouTube Data API 从视频 ID 中获取缩略图。看起来像这样。

<?php
  $vid_id = getVideoId($video_code);
  $json = json_decode(file_get_contents("http://gdata.youtube.com/feeds/api/videos/$vid_id?v=2&alt=jsonc"));
  echo '<img src="' . $json->data->thumbnail->sqDefault . '" width="176" height="126">'; 
?>

问题是这会导致额外的 2 秒加载时间,所以我只需使用 $vid_id 并将其放在 http://i3.ytimg.com/vi/&lt;?php echo $vid_id; ?&gt;/default.jpg 中,这样就消除了通过访问 youtube api 添加的 2 秒。

【讨论】:

    【解决方案2】:

    我从 youtube 上看到这个页面,解释他们的 oembed support,他们提到他们输出为 json 格式,所以我制作了一个函数来获取 json 数据,然后让你使用它。

    如果您需要更多帮助,请随时询问。

    <?php
    
    $youtube_url = 'http://youtu.be/oHg5SJYRHA0'; // url to youtube video
    
    function getJson($youtube_url){
    
        $baseurl = 'http://www.youtube.com/oembed?url='; // youtube oembed base url
        $url = $baseurl . $youtube_url . '&format=json'; // combines the url with format json
    
        $json = json_decode(file_get_contents($url)); // gets url and decodes the json
    
        return $json;
    
    }
    
    $json = getJson($youtube_url);
    
    // from this point on you have all your data placed in variables.
    
    $provider_url = $json->{'provider_url'};
    $thumbnail_url = $json->{'thumbnail_url'};
    $title = $json->{'title'};
    $html = $json->{'html'};
    $author_name = $json->{'author_name'};
    $height = $json->{'height'};
    $thumbnail_width = $json->{'thumbnail_width'};
    $thumbnail_height = $json->{'thumbnail_height'};
    $width = $json->{'width'};
    $version = $json->{'version'};
    $author_url = $json->{'author_url'};
    $provider_name = $json->{'provider_name'};
    $type = $json->{'type'};
    
    echo '<img src="'.$thumbnail_url.'" />'; // echo'ing out the thumbnail image
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 2011-10-30
      • 2013-04-03
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多