HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 拍摄AVCaptureVideoPreviewLayer视图的快照大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用WebRTC在两个用户之间建立视频聊天.我想拍摄localView视图的快照,其中显示了其中一个人.

这是我的类configureLocalPreview方法,它将视频流与UIViews连接起来:

@IBOutlet var remoteView: RTCEAGLVideoView!
@IBOutlet var localView: UIView!

var captureSession: AVCaptureSession?
var videosource: RTCAVFoundationVideosource?
var videoTrack: RTCVideoTrack?

func configureLocalPreview() {
    self.videoTrack = self.signaling.localMediaStream.self.videoTracks.first as! RTCVideoTrack?
    self.videosource = (self.videoTrack?.source as? RTCAVFoundationVideosourcE)
    self.captureSession = self.videosource?.self.captureSession

    self.previewLayer = AVCaptureVideoPreviewLayer.init(session: self.captureSession)
    self.previewLayer.frame = self.localView.bounds
    self.localView.layer.addSublayer(self.previewLayer)
    self.localView.isUserInteractionEnabled = true
    //self.localView.layer.position = CGPointMake(100,100);
}

在我想要访问快照的地方,我打电话给:

self.localView.pb_takeSnapshot()

pb_takeSnapshot来自UIView扩展,我在另一篇文章中找到了它.它的定义如下:

extension UIView {
    func pb_takeSnapshot() -> UIImage {
    UIGraphicsBeginImageContextWithOptions(bounds.size,false,UIScreen.main.scalE)

    drawHierarchy(in: self.bounds,afterScreenupdates: truE)

    let image = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return image
    }
}

当我看一下Xcode调试器中的图像时,它看起来完全是绿色的,而我在iphone屏幕上(在该视图内)可以看到的人不在那里:

ios – 拍摄AVCaptureVideoPreviewLayer视图的快照

这个人不可见的原因是什么?难道不知道是不可能制作一个流的快照?谢谢你看看!

解决方法

您应该使用RTCEAGLVideoView而不是UIView创建localView.我使用相同的localView,并使用您的帖子中提到的相同代码片段拍摄快照.

下面是示例代码,它将启动您的相机并显示本地预览:

class ViewController: UIViewController,RTCEAGLVideoViewDelegate {

var captureSession: AVCaptureSession?
var previewLayer :AVCaptureVideoPreviewLayer?
var peerConnectionFactory: RTCPeerConnectionFactory!
var videosource:rTCAVFoundationVideosource!
var localTrack :rTCVideoTrack!

@IBOutlet var myView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()
    /*myView = UIView(frame: CGRect(x: 0,y: 0,width: UIScreen.main.bounds.size.width,height: UIScreen.main.bounds.size.height))*/
    startCamera()
    // Do any additional setup after loading the view,typically from a nib.
}

fileprivate func startCamera() {

    peerConnectionFactory = RTCPeerConnectionFactory()
    RTCInitializeSSL();
    RTCSetupInternalTracer();
    RTCSetMinDebugLogLevel(RTCLoggingSeverity.info)

    videosource = peerConnectionFactory.avFoundationVideosource(with: nil);


    localTrack  = peerConnectionFactory.videoTrack(with: videosource,trackId: "ARDAMSv0")



    let localScaleX = CGFloat(1.0)
    let localView : RTCEAGLVideoView = RTCEAGLVideoView(frame: self.view.bounds)
    self.view.insertSubview(localView,at: 1)
    localView.frame = self.view.bounds;
    localView.transform = CGAffineTransform(scaleX: localScaleX,y: 1)

    localTrack.add(localView)
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewDidAppear(_ animated: Bool) {
    //previewLayer?.frame.size = myView.frame.size
}

func videoView(_ videoView: RTCEAGLVideoView,didChangeVideoSize size: CGSizE) {
    print("Inside didChangeVideoSize")
}

}

大佬总结

以上是大佬教程为你收集整理的ios – 拍摄AVCaptureVideoPreviewLayer视图的快照全部内容,希望文章能够帮你解决ios – 拍摄AVCaptureVideoPreviewLayer视图的快照所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。