【问题标题】:CALayer not properly set as per dragged position on Video when export导出时,CALayer 未根据视频上的拖动位置正确设置
【发布时间】:2018-04-07 11:57:48
【问题描述】:

我正在尝试使用 CALayer 将文本放在视频上,我有一个可拖动的视图,所以我想根据视频分辨率导出带有精确位置和文本大小的文本的视频,

现在,当我用这个位置导出视频时,结果视频看起来像这样

    let parentLayer = CALayer()
    let videoLayer = CALayer()

    parentLayer.frame = CGRect(x:0, y:0, width:clipVideoTrack.naturalSize.width,height: clipVideoTrack.naturalSize.height)
    videoLayer.frame = CGRect(x:0, y:0, width:clipVideoTrack.naturalSize.width, height:clipVideoTrack.naturalSize.height)


    let backgroundLayer = CALayer()
    backgroundLayer.bounds = CGRect(x: 0, y: 0, width: clipVideoTrack.naturalSize.width, height: clipVideoTrack.naturalSize.height)
    backgroundLayer.position = CGPointMake(clipVideoTrack.naturalSize.width / 2.0, clipVideoTrack.naturalSize.height / 2.0)

    backgroundLayer.addSublayer(supplyView.layer)
    backgroundLayer.masksToBounds = true

    for (index, view) in views.enumerate(){
        var layer = CALayer()
        layer = view.layer
        layer.frame = CGRect(x: supplyView.frame.origin.x, y: supplyView.frame.origin.y, width: supplyView.frame.size.width, height: supplyView.frame.size.height)

        layer.beginTime = CFTimeInterval(Float(startingDurations[index]))
        layer.duration = CFTimeInterval(Float(endingDurations[index]))
        layer.setAffineTransform(view.transform)
        layer.addAnimation(fadeAnimation, forKey: "scale")
        backgroundLayer.addSublayer(layer)
        print(index)
    }
    backgroundLayer.geometryFlipped = true
    parentLayer.addSublayer(backgroundLayer)

    let mainInstruction = AVMutableVideoCompositionInstruction()
    mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, mixComposition.duration)
    let videoLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack)
    let videoAssetTrack = mixComposition.tracksWithMediaType(AVMediaTypeVideo).first

    videoLayerInstruction.setTransform((videoAssetTrack?.preferredTransform)!, atTime: kCMTimeZero)
    videoLayerInstruction.setOpacity(0.0, atTime: videoAsset.duration)
    mainInstruction.layerInstructions = [videoLayerInstruction]

【问题讨论】:

    标签: ios swift avfoundation calayer


    【解决方案1】:

    您应该将文本标签的坐标转换为视频帧坐标系。

    例如你的 videoLayer 帧是 (0, 0, 200, 200)

    真实视频帧可以是(0,0,640,...)

    在这种情况下,坐标为 (100,100) 的文本标签将在您的视频中向上和向左移动。标签坐标应为 (300,300) 以保持与视图中相同的位置

    【讨论】:

    • 但是我如何从 videoLayer 计算 textlabel 位置的坐标? @Evgeniy Gushchin
    • @VivekGoswami 这取决于您如何获取视频。如果您使用 AVCaptureSession 拍摄视频,您可以将 SampleBufferDelegate 设置为视频输出,并在委托方法 captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) 中从 CMSampleBuffer 获取视频帧的尺寸如果您通过 url 获取视频作为资产,您可以使用下一个代码 guard let track = AVURLAsset(url: url).tracks(withMediaType: AVMediaTypeVideo).first else { return nil } let size = track.naturalSize.applying(track.preferredTransform)
    • 实际上我是从预先录制或捕获的照片中选择一个视频,我在视图中添加了这个文本标签,并且我在 videoview 上拖动该视图,我得到了 AVAssets 视频大小但是如何设置此文本标签 x,y 位置及其在视频上的大小,因为此标签可调整大小。 @Evgeniy Gushchin
    • @VivekGoswami 您应该计算视频大小和视图大小之间的比例。然后使用比例来变换文本标签的坐标和大小。例如,视频大小比视图大小大几倍。所以 scale = 2. 在这种情况下,您应该将坐标和大小值乘以 2
    • 好的,谢谢,让我试试这个,我会乘以要设置的视图大小。 @Evgeniy Gushchin
    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多