如何在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
相关产品推荐
相关产品推荐

