You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取YouTube视频时长?现有PHP方法无法返回时长求解决

获取YouTube视频时长的正确方法

你说得对,YouTube的oEmbed接口确实不会返回视频时长,这就是为什么你之前的代码拿不到这个字段。要获取视频时长,你需要使用YouTube Data API v3,这是官方支持的、目前有效的解决方案。

步骤说明

  • 先从传入的URL里提取视频ID(比如你示例里的jmQsk6tm5aY)
  • 调用YouTube Data API v3的Videos.list端点,需要一个免费的API密钥(可在Google Cloud控制台创建并启用YouTube Data API v3)
  • 解析API返回的JSON数据,其中duration字段以ISO 8601格式存在,可按需转换为易读格式

修改后的PHP代码示例

public function getYTdata($url) {
    // 第一步:从URL提取视频ID,兼容多数YouTube链接格式
    preg_match('/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/', $url, $matches);
    if (!isset($matches[1])) {
        return ['error' => '无法提取YouTube视频ID'];
    }
    $videoId = $matches[1];

    // 第二步:调用YouTube Data API v3,替换为你的API密钥
    $apiKey = '你的Google API密钥';
    $apiUrl = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id={$videoId}&key={$apiKey}";

    $curl = curl_init($apiUrl);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $return = curl_exec($curl);
    curl_close($curl);

    $apiData = json_decode($return, true);
    if (empty($apiData['items'][0]['contentDetails']['duration'])) {
        return ['error' => '无法获取视频时长'];
    }

    // 可选:将ISO 8601格式时长转换为易读格式(如"3分45秒")
    $rawDuration = $apiData['items'][0]['contentDetails']['duration'];
    $readableDuration = $this->convertISO8601ToReadable($rawDuration);

    // 合并原oEmbed数据与时长信息
    $oEmbedData = $this->getOriginalOEmbedData($url);
    $oEmbedData['duration'] = $readableDuration;
    $oEmbedData['raw_duration'] = $rawDuration; // 保留原始格式供后续使用

    return $oEmbedData;
}

// 获取原oEmbed数据的辅助函数
private function getOriginalOEmbedData($url) {
    $youtube = "http://www.youtube.com/oembed?url=". urlencode($url) ."&format=json";
    $curl = curl_init($youtube);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $return = curl_exec($curl);
    curl_close($curl);
    return json_decode($return, true);
}

// 转换ISO 8601时长为易读格式的辅助函数
private function convertISO8601ToReadable($duration) {
    $interval = new DateInterval($duration);
    $parts = [];
    if ($interval->h > 0) $parts[] = $interval->h . '小时';
    if ($interval->i > 0) $parts[] = $interval->i . '分钟';
    if ($interval->s > 0) $parts[] = $interval->s . '秒';
    return implode(' ', $parts);
}

关键注意事项

  • API密钥获取:登录Google Cloud控制台,创建新项目后搜索启用"YouTube Data API v3",生成API密钥即可,免费配额足够个人日常使用(每日10000次免费调用)
  • 视频ID兼容性:代码中的正则表达式支持普通链接、嵌入链接、短链接等多数YouTube URL格式
  • 时长转换:利用PHP的DateInterval类可直接解析ISO 8601格式,你也可以根据需求调整转换后的展示样式

内容的提问来源于stack exchange,提问作者enj100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:37:14