使用 YouTube API 获取时长

Posted

技术标签:

【中文标题】使用 YouTube API 获取时长【英文标题】:Get duration using YouTube API 【发布时间】:2015-09-18 15:27:57 【问题描述】:

我需要使用 Youtube API V3 获取视频时长。我的应用程序在 API V3 上运行良好,但现在无法运行。

我找到了一个可行的示例,它可以工作:

$dur = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=[VIDOID]&key=[API KEY]");


$duration =json_decode($dur, true);

foreach ($duration['items'] as $vidTime) 
    $vTime= $vidTime['contentDetails']['duration'];

致谢:Youtube API v3 , how to get video durations?

这将返回类似这样的时间格式。

PT24M30S 

我怎样才能把它变成一个可读的时间。比如24:30?

【问题讨论】:

【参考方案1】:

我不敢相信,有人用过DateInterval,为什么?就是这样:

$duration = new DateInterval('PT24M30S');

print $duration->format('%H:%i:%s'); // outputs: 00:24:30

有用的链接:

The DateInterval class DateInterval::format

【讨论】:

这是最好的答案!如果使用 laravel,请不要忘记将类导入控制器或您正在使用的任何东西:use DateInterval;【参考方案2】:

一种可能的方法是使用函数str_replace();

$stamp = "PT24M30S";
$formated_stamp = str_replace(array("PT","M","S"), array("",":",""),$stamp);

echo $formated_stamp; //should give "24:30"

奖励内容 - 前导零

为了添加前导零,必须首先使用explode() 将字符串拆分,然后使用sprintf() 单独格式化数字;最后再把它们加在一起。

$exploded_string = explode(":",$formated_stamp);
$new_formated_stamp = sprintf("%02d", $exploded_string[0]).":".sprintf("%02d", $exploded_string[1]);

【讨论】:

请注意,这会将PT2M3S 转换为2:3【参考方案3】:
 $time_format = "PT24M30S ";

preg_match_all('/(\d+)/',$time_format,$parts);

$hours = floor($parts[0][0]/60);
$minutes = $parts[0][0]%60;
$seconds = $parts[0][1];

echo $hours . ": ". $minutes .":". $seconds; 

【讨论】:

【参考方案4】:

video resource 包含一个 duration 字段,它是一个以下格式的 string。开发人员可以根据您的应用程序和需求重新格式化它。

contentDetails.duration

视频的长度。标记值是 ISO 8601 持续时间。为了 例如,对于至少一分钟且少于一分钟的视频 一小时长,持续时间的格式为 PT#M#S,其中 字母 PT 表示该值指定一个时间段,而 字母 M 和 S 分别表示以分钟和秒为单位的长度。 M 和 S 字母前面的 # 字符都是整数 指定视频的分钟数(或秒数)。例如, 值为 PT15M33S 表示视频为 15 分 33 秒长。

如果视频长度至少为一小时,则时长采用以下格式 PT#H#M#S,其中字母 H 前面的 # 指定长度 以小时为单位的视频,所有其他细节都与 如上所述。如果视频长度至少为一天,则字母 P 和 T 是分开的,值的格式是 P#DT#H#M#S。请 有关完整的详细信息,请参阅 ISO 8601 规范。

至于怎么做,我不得不说删除 PT 和 S 并用 : 替换 M。根据值为空时发生的情况,您可能需要进行一些测试。我会对ISO-8061做一些研究

【讨论】:

【参考方案5】:

我使用以下函数来转换 YouTube 时长。只需将 $yt 替换为 YouTube 为您提供的格式,它就会打印出漂亮且可读的格式。

function ConvertYoutubeVideoDuration($yt)
$yt=str_replace(['P','T'],'',$yt);
foreach(['D','H','M','S'] as $a)
    $pos=strpos($yt,$a);
    if($pos!==false) $$a=substr($yt,0,$pos); else  $$a=0; continue; 
    $yt=substr($yt,$pos+1);

if($D>0)
    $M=str_pad($M,2,'0',STR_PAD_LEFT);
    $S=str_pad($S,2,'0',STR_PAD_LEFT);
    return ($H+(24*$D)).":$M:$S"; // add days to hours
 elseif($H>0)
    $M=str_pad($M,2,'0',STR_PAD_LEFT);
    $S=str_pad($S,2,'0',STR_PAD_LEFT);
    return "$H:$M:$S";
 else 
    $S=str_pad($S,2,'0',STR_PAD_LEFT);
    return "$M:$S";


【讨论】:

【参考方案6】:

解决方案 PHP

function covtime($youtube_time)
            preg_match_all('/(\d+)/',$youtube_time,$parts);
            $hours = $parts[0][0];
            $minutes = $parts[0][1];
            $seconds = $parts[0][2];
            if($seconds != 0)
                return $hours.':'.$minutes.':'.$seconds;
            else
                return $hours.':'.$minutes;
        

【讨论】:

以上是关于使用 YouTube API 获取时长的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过 Youtube 数据 API v3.0 获取时长(时间)视频

如何使用 python 获取 Youtube 视频的时长?

使用 JSON 从 Youtube API 返回视频时长

从频道获取来自 youtube api 的视频

如何使用 Youtube API 获取 Youtube 频道横幅?

使用 youtube api 使用 jQuery 获取 youtube 视频的标题