在自定义视图中 iOS 中播放视频
Playback Video in iOS inside a custom view
我正在尝试构建一个简单的应用程序,让我可以录制视频然后观看。我使用了两个视图,屏幕左侧的 AVCamPreviewView
(显示来自 iPhone 摄像头的实时视频流)和屏幕右侧的 AVPlayerLayerView
(一旦我录制并将其保存到应用程序的文档文件夹中,它应该会显示视频。
虽然第一部分(显示直播)很有魅力(我使用了 Apple 的 AVCam-tutorial 作为参考),但后者没有:我可以开始播放我录制的视频:音频开始正在播放,但我什么也看不到,我也不知道为什么会这样。
这是我的 AVPlayerLayerView
-class:
//
// AVPlayerLayerView.swift
// AVCamSwift
//
import UIKit
import AVFoundation
class AVPlayerLayerView: UIView {
var player: AVPlayer = AVPlayer()
var avPlayerLayer: AVPlayerLayer!
override init(frame: CGRect) {
super.init(frame: frame)
print("AVPlayerLayerView -> init with frame")
inits()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
print("AVPlayerLayerView -> init with coder")
inits()
}
private func inits() {
let rootLayer: CALayer = self.layer
rootLayer.masksToBounds = true
avPlayerLayer = AVPlayerLayer(player: player)
rootLayer.insertSublayer(avPlayerLayer, atIndex: 0)
}
func setContentUrl(url: NSURL) {
print("Setting up item: \(url)")
let item = AVPlayerItem(URL: url)
player.replaceCurrentItemWithPlayerItem(item)
}
func play() {
if (player.currentItem != nil) {
print("Starting playback!")
player.play()
}
}
func pause() {
player.pause()
}
func rewind() {
player.seekToTime(CMTime(seconds: 0, preferredTimescale: 1))
}
func stop() {
pause()
rewind()
}
}
当点击相应的按钮时,视频播放应该开始,这里是开始播放的代码:
@IBAction func playVideoTap(sender: AnyObject) {
if let rfp = recordingFilePath {
playbackView.setContentUrl(rfp)
playbackView.play()
}
}
如前所述:音频播放有效,但我看不到任何东西,因此我假设我必须在我的 AVPlayerLayerView-Class 或类似的东西中重新定位 AVPlayerLayer。有什么想法吗?
这里是布局的一个片段,以防万一它有帮助...
编辑:
感谢 Rajesh 的回复,我终于可以播放视频了。然而,录制的视频并没有显示在屏幕右侧的灰色区域内,而是显示在屏幕顶部中间的一个小方块内(见屏幕截图)。任何想法如何解决这个问题?此外,宽高比与 "recording view"...
中的不同
您忘记为 avplayer 层设置边界。
private func inits() {
//let rootLayer: CALayer = self.layer
// rootLayer.masksToBounds = true
avPlayerLayer = AVPlayerLayer(player: player)
avPlayerLayer.bounds = self.bounds
// avPlayerLayer.backgroundColor = UIColor.yellowColor().CGColor
self.layer.insertSublayer(avPlayerLayer, atIndex: 0)
}
太棒了,找到了解决方案。首先,Rajesh 的回答对我帮助很大,这就是为什么他会得到我的复选标记,其次,添加
avPlayerLayer.bounds = self.layer.bounds
avPlayerLayer.frame = CGRectMake(0, 0, self.layer.frame.width, self.layer.frame.height)
我的 play() 方法成功了。如 Rajesh 所示,在 inits() 方法中设置边界会给您带来问题,边界是在视图出现之前设置的,因此值可能是错误的。按照上面的建议设置框架有助于正确定位 CAPlayerLayer 并按预期设置纵横比!
我正在尝试构建一个简单的应用程序,让我可以录制视频然后观看。我使用了两个视图,屏幕左侧的 AVCamPreviewView
(显示来自 iPhone 摄像头的实时视频流)和屏幕右侧的 AVPlayerLayerView
(一旦我录制并将其保存到应用程序的文档文件夹中,它应该会显示视频。
虽然第一部分(显示直播)很有魅力(我使用了 Apple 的 AVCam-tutorial 作为参考),但后者没有:我可以开始播放我录制的视频:音频开始正在播放,但我什么也看不到,我也不知道为什么会这样。
这是我的 AVPlayerLayerView
-class:
//
// AVPlayerLayerView.swift
// AVCamSwift
//
import UIKit
import AVFoundation
class AVPlayerLayerView: UIView {
var player: AVPlayer = AVPlayer()
var avPlayerLayer: AVPlayerLayer!
override init(frame: CGRect) {
super.init(frame: frame)
print("AVPlayerLayerView -> init with frame")
inits()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
print("AVPlayerLayerView -> init with coder")
inits()
}
private func inits() {
let rootLayer: CALayer = self.layer
rootLayer.masksToBounds = true
avPlayerLayer = AVPlayerLayer(player: player)
rootLayer.insertSublayer(avPlayerLayer, atIndex: 0)
}
func setContentUrl(url: NSURL) {
print("Setting up item: \(url)")
let item = AVPlayerItem(URL: url)
player.replaceCurrentItemWithPlayerItem(item)
}
func play() {
if (player.currentItem != nil) {
print("Starting playback!")
player.play()
}
}
func pause() {
player.pause()
}
func rewind() {
player.seekToTime(CMTime(seconds: 0, preferredTimescale: 1))
}
func stop() {
pause()
rewind()
}
}
当点击相应的按钮时,视频播放应该开始,这里是开始播放的代码:
@IBAction func playVideoTap(sender: AnyObject) {
if let rfp = recordingFilePath {
playbackView.setContentUrl(rfp)
playbackView.play()
}
}
如前所述:音频播放有效,但我看不到任何东西,因此我假设我必须在我的 AVPlayerLayerView-Class 或类似的东西中重新定位 AVPlayerLayer。有什么想法吗?
这里是布局的一个片段,以防万一它有帮助...
编辑:
感谢 Rajesh 的回复,我终于可以播放视频了。然而,录制的视频并没有显示在屏幕右侧的灰色区域内,而是显示在屏幕顶部中间的一个小方块内(见屏幕截图)。任何想法如何解决这个问题?此外,宽高比与 "recording view"...
中的不同您忘记为 avplayer 层设置边界。
private func inits() {
//let rootLayer: CALayer = self.layer
// rootLayer.masksToBounds = true
avPlayerLayer = AVPlayerLayer(player: player)
avPlayerLayer.bounds = self.bounds
// avPlayerLayer.backgroundColor = UIColor.yellowColor().CGColor
self.layer.insertSublayer(avPlayerLayer, atIndex: 0)
}
太棒了,找到了解决方案。首先,Rajesh 的回答对我帮助很大,这就是为什么他会得到我的复选标记,其次,添加
avPlayerLayer.bounds = self.layer.bounds
avPlayerLayer.frame = CGRectMake(0, 0, self.layer.frame.width, self.layer.frame.height)
我的 play() 方法成功了。如 Rajesh 所示,在 inits() 方法中设置边界会给您带来问题,边界是在视图出现之前设置的,因此值可能是错误的。按照上面的建议设置框架有助于正确定位 CAPlayerLayer 并按预期设置纵横比!