【问题标题】:Playback Video in iOS inside a custom view在自定义视图中播放 iOS 中的视频
【发布时间】:2016-01-02 18:48:14
【问题描述】:

我正在尝试构建一个简单的应用程序,让我可以录制视频然后观看。我正在使用两个视图,屏幕左侧的AVCamPreviewView(显示来自iPhone 摄像头的实时视频流)和屏幕右侧的AVPlayerLayerView(一旦我有了它就应该显示视频记录并保存到应用程序的文件夹中)。

虽然第一部分(显示直播)很有效(我使用了 Apple 的 AVCam 教程作为参考),但后者没有:我可以开始播放我录制的视频:音频开始播放,但我什么都看不到,我也不知道为什么会这样。

这是我的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。有什么想法吗?

这是一个布局的 sn-p,以防万一它有帮助......

编辑:

感谢 Rajesh 的回复,我终于可以播放视频了。但是,录制的视频不会显示在屏幕右侧的灰色区域内,而是显示在屏幕中上方的一个小方块内(见截图)。任何想法如何解决这个问题?此外,纵横比与“录制视图”中的不同...

【问题讨论】:

    标签: ios swift video avfoundation avplayerlayer


    【解决方案1】:

    您忘记为 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,这个答案有很大帮助,但行为并不符合预期。请参阅上面我的问题的编辑。你知道如何走上正轨吗?
    【解决方案2】:

    太棒了,找到了解决方案。首先,Rajesh的回答对我帮助很大,这就是为什么他会得到我的复选标记,其次,添加

    avPlayerLayer.bounds = self.layer.bounds
    avPlayerLayer.frame = CGRectMake(0, 0, self.layer.frame.width,     self.layer.frame.height)
    

    我的 play() 方法成功了。如 Rajesh 所示,在 inits() 方法中设置边界会给您带来问题,即边界是在视图出现之前设置的,因此值可能是错误的。如上所述设置框架有助于正确定位 CAPlayerLayer 并按预期设置纵横比!

    【讨论】:

      猜你喜欢
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 2016-03-16
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多