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

寻求可直接播放Vimeo链接的Flutter播放器或稳定获取MP4链接方案

解决Vimeo视频在Flutter中播放的问题

一、稳定获取Vimeo MP4链接的优化方案

你的PHP代码可以从权限校验、响应处理、错误兜底三个维度优化,提升MP4链接获取的稳定性:

1. 核心优化点

  • 确认API令牌权限:确保你的Bearer令牌包含video_files权限(在Vimeo开发者控制台查看令牌的Scope),私有视频还需令牌拥有对应访问权限,或把视频设为「公开可观看」。
  • 精简API请求:调用Vimeo API时指定fields参数,只请求需要的字段,减少响应体积和解析错误概率。
  • 分层兜底逻辑:主API失败时,优先尝试备用接口,同时增加错误捕获,避免无效返回。

2. 优化后的PHP代码

public function mp4_link($id)
{
    $token = '你的有效Bearer令牌';
    // 指定仅获取所需字段,减轻API响应压力
    $apiUrl = "https://api.vimeo.com/videos/{$id}?fields=files,pictures,duration";
    
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => $apiUrl,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Accept: application/json',
            "Authorization: Bearer {$token}",
        ],
        CURLOPT_FAILONERROR => true, // 请求失败时直接触发错误
    ]);
    
    $response = curl_exec($curl);
    $curlError = curl_error($curl);
    curl_close($curl);

    // 主API请求失败,尝试播放器配置接口兜底
    if ($curlError) {
        $playerConfigUrl = "https://player.vimeo.com/video/{$id}/config";
        $playerResponse = file_get_contents($playerConfigUrl);
        if (!$playerResponse) {
            return ['error' => '无法获取视频配置'];
        }
        
        $playerData = json_decode($playerResponse, true);
        if (empty($playerData['request']['files']['progressive'])) {
            return ['error' => '未找到可用的MP4链接'];
        }
        
        // 按分辨率从高到低排序,优先返回高清链接
        usort($playerData['request']['files']['progressive'], function($a, $b) {
            return $b['height'] - $a['height'];
        });
        
        return [
            'pictures' => $playerData['video']['thumbs'] ?? [],
            'duration' => $playerData['video']['duration'] ?? 0,
            'files' => $playerData['request']['files']['progressive'],
        ];
    }

    $apiData = json_decode($response, true);
    if (empty($apiData['files'])) {
        return ['error' => 'API未返回视频文件,请检查令牌权限或视频隐私设置'];
    }

    // 筛选出MP4格式的渐进式播放链接
    $mp4Files = array_filter($apiData['files'], function($file) {
        return $file['type'] === 'progressive';
    });
    
    // 按分辨率排序
    usort($mp4Files, function($a, $b) {
        return $b['height'] - $a['height'];
    });

    return [
        'pictures' => $apiData['pictures'] ?? [],
        'duration' => $apiData['duration'] ?? 0,
        'files' => array_values($mp4Files),
    ];
}

二、直接播放Vimeo链接的Flutter播放器方案

如果不想自己处理API解析,可以使用专门支持Vimeo的Flutter插件,直接传入视频ID或链接即可播放:

1. 使用vimeo_player插件

该插件内部封装了Vimeo视频的解析逻辑,支持跨平台播放:

import 'package:vimeo_player/vimeo_player.dart';

// 播放示例
VimeoPlayer(
  videoId: '你的Vimeo视频ID', // 从Vimeo链接中提取的ID,比如https://vimeo.com/123456中的123456
  autoPlay: false,
  loop: false,
  onPlay: () => print('视频开始播放'),
  onPause: () => print('视频暂停'),
)

2. 使用flutter_vimeo_player插件

功能类似,支持更多自定义配置:

import 'package:flutter_vimeo_player/flutter_vimeo_player.dart';

// 播放示例
VimeoPlayer(
  url: 'https://vimeo.com/123456', // 完整Vimeo链接
  controls: true,
  autoPlay: false,
)

注意:使用这类插件时,需确保视频的隐私设置允许嵌入播放(比如设为「公开」或「允许嵌入」)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:25:31