AVPlayer 是 iOS 和 macOS 中用于播放音视频内容的一个非常强大的框架,它支持流媒体播放和本地文件播放,常常被用于处理在线视频和本地文件的播放。下面将介绍如何使用 AVPlayer 来播放在线视频和本地文件,涉及如何从数据库中获取本地文件路径并进行播放。

1. AVPlayer 播放在线视频

播放在线视频的核心是使用 AVPlayerAVPlayerViewControllerAVPlayer 用于控制媒体播放,而 AVPlayerViewController 用于提供媒体播放的界面。

步骤 1:导入 AVKit 和 AVFoundation

在项目中使用 AVPlayer 时,需要导入相关框架:

import AVKit
import AVFoundation

步骤 2:创建 AVPlayer 播放在线视频

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {
    var playerViewController: AVPlayerViewController?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 创建 AVPlayer
        if let url = URL(string: "https://path_to_video/video.mp4") {
            let player = AVPlayer(url: url)
            playerViewController = AVPlayerViewController()
            playerViewController?.player = player
            
            // 播放视频
            present(playerViewController!, animated: true) {
                player.play() // 开始播放
            }
        }
    }
}
  • AVPlayer:负责播放视频,使用 AVPlayer(url:) 来创建播放器对象,并传入视频的 URL。
  • AVPlayerViewController:提供标准的播放器界面,用户可以控制播放、暂停、快进等操作。
  • present(playerViewController!, animated: true) 用来显示播放器界面。

步骤 3:处理视频播放的生命周期

在合适的时机开始和停止播放器:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    playerViewController?.player?.pause()  // 停止播放
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    playerViewController?.player?.play()  // 恢复播放
}

2. AVPlayer 播放本地文件(数据库存储路径)

如果你想播放存储在本地的文件,首先需要从数据库中获取文件路径,然后使用 AVPlayer 播放该文件。

步骤 1:从数据库中获取文件路径

假设你已经有一个数据库(例如 SQLite 或 CoreData),存储了本地文件的路径。你可以使用以下代码从数据库中查询并获取文件路径。

示例(从 CoreData 获取文件路径):

import CoreData

func fetchFilePathFromDatabase() -> String? {
    let fetchRequest: NSFetchRequest<File> = File.fetchRequest()
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    do {
        let files = try context.fetch(fetchRequest)
        if let file = files.first {
            return file.path  // 假设 "path" 是存储文件路径的属性
        }
    } catch {
        print("Error fetching data from database")
    }
    return nil
}

步骤 2:使用 AVPlayer 播放本地文件

从数据库中获取到文件路径后,你可以创建一个 AVPlayer 来播放该本地文件。

import AVKit
import AVFoundation

class ViewController: UIViewController {
    var playerViewController: AVPlayerViewController?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 从数据库中获取文件路径
        if let filePath = fetchFilePathFromDatabase() {
            let url = URL(fileURLWithPath: filePath) // 转换为 URL
            
            let player = AVPlayer(url: url)
            playerViewController = AVPlayerViewController()
            playerViewController?.player = player
            
            // 播放视频
            present(playerViewController!, animated: true) {
                player.play() // 开始播放
            }
        }
    }
    
    func fetchFilePathFromDatabase() -> String? {
        // 返回文件路径,示例中假设为本地路径
        return "/path/to/your/local/file.mp4"
    }
}
  • URL(fileURLWithPath:):根据本地文件路径创建一个 URL 对象。
  • AVPlayer:使用该 URL 创建 AVPlayer 对象并进行播放。

步骤 3:处理播放控制

你可以在播放器控制器上进行一些额外的控制操作。例如,暂停、恢复播放等:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    playerViewController?.player?.pause()  // 停止播放
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    playerViewController?.player?.play()  // 恢复播放
}

3. 处理视频播放控制(暂停、恢复等)

通过 AVPlayer,你可以控制视频的暂停、播放、跳转等操作。

暂停播放:

playerViewController?.player?.pause()

恢复播放:

playerViewController?.player?.play()

跳转到特定时间点:

let time = CMTimeMake(value: 30, timescale: 1)  // 跳转到 30 秒的位置
playerViewController?.player?.seek(to: time)

4. AVPlayer 错误处理

播放视频时,可能会出现一些错误(例如,无法加载视频文件或网络问题)。你可以通过 AVPlayerItemerror 属性来检查播放是否成功。

错误处理示例:

let playerItem = AVPlayerItem(url: videoURL)
let player = AVPlayer(playerItem: playerItem)

playerItem.observe(\.status, options: [.new]) { item, change in
    switch item.status {
    case .failed:
        print("Error loading video: \(item.error?.localizedDescription ?? "Unknown error")")
    case .readyToPlay:
        print("Video is ready to play")
        player.play()
    case .unknown:
        print("Video status is unknown")
    @unknown default:
        break
    }
}

总结

  1. 播放在线视频:使用 AVPlayerAVPlayerViewController,通过 URL 来播放在线视频。
  2. 播放本地文件:从数据库中获取文件路径后,使用 AVPlayer 播放本地文件。
  3. 播放控制:可以控制播放、暂停、跳转等操作。
  4. 错误处理:通过观察 AVPlayerItem 的状态来处理播放过程中的错误。

AVPlayer 提供了强大的视频播放能力,可以灵活处理在线视频和本地文件的播放需求。