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

