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

AVPlayerView调用beginTrimming无效,canBeginTrimming为false的原因

问题:AVPlayerView无法进入修剪模式,canBeginTrimming始终为false

我在用AVPlayerView调用beginTrimming方法时,死活进不了修剪模式,查了下发现canBeginTrimming属性一直是false。用的是本地MOV文件,通过URL加载后能正常播放,但就是不能修剪——同一个文件在QuickTime Player里完全可以修剪。

查资料知道,下面几种情况会导致这个属性为false:

  • 控件样式不支持修剪
  • 媒体受内容保护
  • 播放的是HTTP直播媒体

我已经在视图控制器里给AVPlayerView建了IBOutlet,控件样式设的默认,“显示按钮”选了Frame Stepping,只在Storyboard里设了初始属性,代码里没额外配置。

相关代码

加载文件并尝试修剪的代码

func tableViewSelectionDidChange(_ notification: Notification) {
    let row = movTableView.selectedRow
    guard row != -1 else { return }
    let selectedURL = movDict[allFilenames[row]]
    print(selectedURL)
    if let selectedURL {
        let player = AVPlayer(url: selectedURL)
        movPlayerView.player = player
        if movPlayerView.canBeginTrimming {
            print("medial player supports trimming")
        } else {
            print("media player does NOT support trimming")
        }
        movPlayerView.beginTrimming { result in
            if result == .okButton {
                print("trimming ended. ok pressed")
            } else {
                print("cancel pressed.")
            }
        }
    }
}

IBOutlet声明

@IBOutlet weak var movPlayerView: AVPlayerView!

为啥我的播放器不让修剪啊?


解决办法
  • 检查控件样式:虽说你设了默认样式,但还是确认下Storyboard里AVPlayerView的controlsStyle是不是.full——只有这个样式支持修剪,要是不小心改成.minimal之类的,肯定用不了修剪功能。
  • 等媒体加载完再操作:你设置完AVPlayer就立刻查canBeginTrimming,这时候媒体可能还没加载好,元数据都没就绪,判断肯定不准。得监听AVPlayerItem的status,等状态变成.readyToPlay之后再检查修剪权限,代码可以改成这样:
    func tableViewSelectionDidChange(_ notification: Notification) {
        let row = movTableView.selectedRow
        guard row != -1 else { return }
        let selectedURL = movDict[allFilenames[row]]
        print(selectedURL)
        if let selectedURL {
            let playerItem = AVPlayerItem(url: selectedURL)
            let player = AVPlayer(playerItem: playerItem)
            movPlayerView.player = player
            
            // 监听媒体加载状态
            playerItem.addObserver(self, forKeyPath: "status", options: [.new], context: nil)
        }
    }
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        guard keyPath == "status", let playerItem = object as? AVPlayerItem else { return }
        if playerItem.status == .readyToPlay {
            if movPlayerView.canBeginTrimming {
                print("medial player supports trimming")
                movPlayerView.beginTrimming { result in
                    if result == .okButton {
                        print("trimming ended. ok pressed")
                    } else {
                        print("cancel pressed.")
                    }
                }
            } else {
                print("media player does NOT support trimming")
            }
            // 记得移除监听,防止内存泄漏
            playerItem.removeObserver(self, forKeyPath: "status")
        }
    }
    
  • 检查文件编码:QuickTime支持的编码比AVPlayerView修剪功能支持的要多,说不定你的MOV用了小众编码。可以用QuickTime的“显示检查器”看看文件的编码是不是H.264、AAC这类AVFoundation修剪支持的类型。
  • 确认文件可写:就算是本地文件,如果所在路径没写入权限,AVPlayerView也会禁用修剪(毕竟修剪完要保存修改)。检查下文件URL的路径有没有读写权限,比如要是从iCloud导的文件,得确保已经下载到本地,而且有读写权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:43:38