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

如何在SwiftUI项目中播放Google Drive中的视频?

在SwiftUI中通过AVPlayer流式播放Google Drive视频

核心步骤说明

要实现从Google Drive流式播放视频,关键在于将分享链接转换为AVPlayer可识别的流式URL,同时确保文件权限正确。


1. 提取Google Drive文件ID

你的分享链接格式为:https://drive.google.com/file/d/xxxxxxxxxxx/view?usp=share_link,其中xxxxxxxxxxx就是唯一的文件ID。可以通过正则表达式提取:

private func extractDriveFileID(from link: String) -> String? {
    let pattern = #"drive.google.com/file/d/([a-zA-Z0-9_-]+)/"#
    guard let regex = try? NSRegularExpression(pattern: pattern) else { return nil }
    let range = NSRange(link.startIndex..., in: link)
    guard let match = regex.firstMatch(in: link, range: range) else { return nil }
    let idRange = match.range(at: 1)
    return String(link[Range(idRange, in: link)!])
}

2. 构造可流式播放的URL

用提取到的文件ID,替换以下格式中的{FILE_ID}:

https://drive.google.com/uc?export=stream&id={FILE_ID}

注意:必须将Google Drive文件的分享权限设置为「任何有链接的人均可查看」,否则AVPlayer会因权限不足无法加载视频。

3. SwiftUI播放器实现

使用iOS 14+提供的VideoPlayer视图结合AVPlayer实现播放:

import SwiftUI
import AVKit

struct DriveVideoPlayerView: View {
    let driveShareLink: String
    @State private var player: AVPlayer?
    
    var body: some View {
        Group {
            if let player = player {
                VideoPlayer(player: player)
                    .onAppear { player.play() }
                    .onDisappear { player.pause() }
            } else {
                ProgressView("加载视频中...")
                    .onAppear { loadVideo() }
            }
        }
    }
    
    private func loadVideo() {
        guard let fileID = extractDriveFileID(from: driveShareLink) else {
            print("无法解析Google Drive链接")
            return
        }
        
        guard let streamURL = URL(string: "https://drive.google.com/uc?export=stream&id=\(fileID)") else {
            print("构造流式URL失败")
            return
        }
        
        player = AVPlayer(url: streamURL)
    }
    
    private func extractDriveFileID(from link: String) -> String? {
        let pattern = #"drive.google.com/file/d/([a-zA-Z0-9_-]+)/"#
        guard let regex = try? NSRegularExpression(pattern: pattern) else { return nil }
        let range = NSRange(link.startIndex..., in: link)
        guard let match = regex.firstMatch(in: link, range: range) else { return nil }
        let idRange = match.range(at: 1)
        return String(link[Range(idRange, in: link)!])
    }
}

// 使用示例
struct ContentView: View {
    // 替换为你的实际Google Drive分享链接
    let courseVideoLink = "https://drive.google.com/file/d/xxxxxxxxxxx/view?usp=share_link"
    
    var body: some View {
        NavigationStack {
            DriveVideoPlayerView(driveShareLink: courseVideoLink)
                .navigationTitle("课程视频")
        }
    }
}

常见问题排查

  • 你之前使用export=download的URL会触发文件下载而非流式播放,因此AVPlayer无法正常加载,替换为export=stream即可解决。
  • 如果视频仍无法播放,优先检查文件的分享权限:打开Google Drive文件,点击「分享」→ 确保权限设置为「任何有链接的人都可以查看」。
  • 若文件需要私密访问(仅特定用户可看),则需要集成Google Drive API并通过OAuth 2.0获取访问令牌,构造URL时添加access_token参数,这种场景需要额外处理认证流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:33:12