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

Flutter加载未列出Vimeo视频失败,求助解决ExoPlayer播放错误

Flutter播放未列出Vimeo视频解决方案

问题分析

你遇到的ExoPlayer错误核心是无法获取有效的视频源路径。第三方Vimeo播放包(如vimeo_video_player等)默认仅适配公开视频的解析逻辑,而未列出视频需要通过Vimeo API授权才能拿到合法播放流URL——直接通过视频ID解析会返回空路径,最终导致播放器抛出FileNotFoundException。

解决步骤

1. 获取Vimeo API授权

未列出视频的播放流需要API权限才能获取,先完成以下准备:

  • 在Vimeo开发者平台创建应用,生成个人访问令牌(Personal Access Token),权限至少勾选video_files
  • 确认目标视频的隐私设置为「未列出」(而非「私有」,私有视频需额外的用户级访问权限)

2. 调用API获取视频流URL

通过视频ID调用Vimeo视频详情接口,提取可直接播放的流地址:

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<String?> getVimeoStreamUrl(String videoId, String apiToken) async {
  final apiUrl = Uri.parse('https://api.vimeo.com/videos/$videoId');
  final response = await http.get(
    apiUrl,
    headers: {'Authorization': 'Bearer $apiToken'},
  );

  if (response.statusCode == 200) {
    final videoData = jsonDecode(response.body);
    // 筛选并返回最高清的视频流(可根据需求调整)
    final videoFiles = videoData['files'] as List;
    if (videoFiles.isNotEmpty) {
      videoFiles.sort((a, b) => b['quality'].compareTo(a['quality']));
      return videoFiles.first['link'];
    }
  }
  return null;
}

3. 用官方video_player插件播放

拿到合法流URL后,使用Flutter官方的video_player插件直接播放,规避第三方包的封装缺陷:

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

class VimeoUnlistedPlayer extends StatefulWidget {
  final String streamUrl;

  const VimeoUnlistedPlayer({super.key, required this.streamUrl});

  @override
  State<VimeoUnlistedPlayer> createState() => _VimeoUnlistedPlayerState();
}

class _VimeoUnlistedPlayerState extends State<VimeoUnlistedPlayer> {
  late VideoPlayerController _controller;

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(widget.streamUrl)
      ..initialize().then((_) {
        setState(() {});
        _controller.play();
      });
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: _controller.value.isInitialized
            ? AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: VideoPlayer(_controller),
              )
            : const CircularProgressIndicator(),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _controller.value.isPlaying
                ? _controller.pause()
                : _controller.play();
          });
        },
        child: Icon(
          _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }
}

4. 关键注意事项

  • 确保应用已开启网络权限(Android需添加INTERNET权限,iOS需允许HTTPS请求)
  • 禁止将API令牌硬编码在客户端代码中,建议通过后端代理完成API请求
  • 若视频带DRM保护,需额外集成ExoPlayer的DRM适配逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:27:53