当然!下面是关于 AVPlayer 在 iOS 中播放在线视频和本地文件(例如数据库存储路径的媒体文件)的详细讲解和示范代码,帮你快速上手。


AVPlayer 播放在线视频和本地文件(含数据库路径管理)设置教程


一、AVPlayer 简介

  • AVPlayer 是苹果提供的音视频播放类,支持本地文件和网络流媒体。
  • 支持 HLS、MP4、MOV 等格式。
  • 适合用于 iOS/macOS 开发。

二、播放在线视频

import AVKit
import AVFoundation

// 在线视频URL
let videoURL = URL(string: "https://example.com/path/to/video.mp4")!

// 创建AVPlayer
let player = AVPlayer(url: videoURL)

// 创建播放器视图控制器
let playerViewController = AVPlayerViewController()
playerViewController.player = player

// 显示播放器视图控制器
present(playerViewController, animated: true) {
    player.play()
}

三、播放本地文件(数据库存储路径)

假设你在数据库中保存了本地文件路径(或文件名),你需要:

  1. 从数据库获取文件路径(完整路径或相对路径)
  2. 将路径转换为 URL
  3. 通过 AVPlayer 播放
// 例如:从数据库获得文件名
let fileName = "localVideo.mp4"

// 获取本地沙盒 Documents 目录路径
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!

// 拼接完整文件路径
let filePath = (documentsPath as NSString).appendingPathComponent(fileName)

// 转成URL
let fileURL = URL(fileURLWithPath: filePath)

// 创建AVPlayer播放本地文件
let player = AVPlayer(url: fileURL)
let playerViewController = AVPlayerViewController()
playerViewController.player = player

present(playerViewController, animated: true) {
    player.play()
}

四、数据库存储示例(简要)

通常你会用 SQLite、CoreData、Realm 等存储文件路径或视频信息。

示例:SQLite 存储文件名

CREATE TABLE videos (
    id INTEGER PRIMARY KEY,
    fileName TEXT
);

查询示例(伪代码):

func fetchVideoFileName(id: Int) -> String? {
    // 执行查询
    // 返回对应 fileName
    return "localVideo.mp4" // 假设返回这个
}

五、注意事项

  • 播放本地文件,路径一定要正确且文件存在。
  • 在线视频需保证网络稳定,支持 HTTP/HTTPS。
  • 需在 Info.plist 添加权限:
    • 网络请求需配置 NSAppTransportSecurity 允许访问非 HTTPS (如需要)
  • AVPlayer 默认不会自动显示控制条,使用 AVPlayerViewController 可自动包含控制条。

六、完整示例整合(假设数据库返回文件名)

import UIKit
import AVKit

class VideoPlayerViewController: UIViewController {
    var player: AVPlayer?
    var playerViewController: AVPlayerViewController?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 假设从数据库获取文件名
        let fileName = fetchVideoFileName(id: 1) ?? ""
        
        if fileName.starts(with: "http") {
            playOnlineVideo(urlString: fileName)
        } else {
            playLocalVideo(fileName: fileName)
        }
    }
    
    func fetchVideoFileName(id: Int) -> String? {
        // 这里写数据库查询代码,返回路径或URL字符串
        return "localVideo.mp4" // 或返回网络视频地址
    }
    
    func playOnlineVideo(urlString: String) {
        guard let url = URL(string: urlString) else { return }
        player = AVPlayer(url: url)
        playerViewController = AVPlayerViewController()
        playerViewController?.player = player
        present(playerViewController!, animated: true) {
            self.player?.play()
        }
    }
    
    func playLocalVideo(fileName: String) {
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let filePath = (documentsPath as NSString).appendingPathComponent(fileName)
        let fileURL = URL(fileURLWithPath: filePath)
        
        player = AVPlayer(url: fileURL)
        playerViewController = AVPlayerViewController()
        playerViewController?.player = player
        present(playerViewController!, animated: true) {
            self.player?.play()
        }
    }
}