2017-10-26 2 views
0

CALayerを使用してビデオにテキストを挿入しようとしていますが、ドラッグ可能なビューが1つあります。私はこの位置でビデオをエクスポートするときにビデオの解像度、今エクスポート時にビデオのドラッグ位置ごとにCALayerが正しく設定されていない

enter image description here

ごとに、結果のビデオはこの1

enter image description here

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] 
のように見えています

答えて

0

テキストラベルの座標をビデオフレームの座標系に変換する必要があります。

たとえば、あなたのvideoLayerフレームは(0、0、200、200)

リアルタイムビデオフレームは座標で、この場合のテキストラベルでは(0,0、640、...)

可能です(100,100)があなたのビデオの上に移動され、左に移動します。表示と同じ位置を保つにはラベル座標は(300,300)にする必要があります

+0

しかし、私はvideoLayerからこのテキスト座標の座標をどのように計算しますか? @Evgeniy Gushchin –

+0

@VivekGoswamiそれはあなたがビデオをどのように取得するかによって異なります。 AVCaptureSessionを使用してビデオを撮影する場合、ビデオ出力用にSampleBufferDelegateを設定し、デリゲートメソッド 'captureOutput(_output:AVCaptureOutput、didOutput sampleBuffer:CMSampleBuffer、接続:AVCaptureConnection)でCMSampleBufferからビデオフレームの寸法を取得できます ' ビデオURLでアセットとして次のコードを使うことができます 'guard let track = AVURLAsset(url:url).tracks(withMediaType:AVMediaTypeVideo).first else {return nil} let size = track.naturalSize.applying(track.preferredTransform) ' –

+0

実際に私は、事前に記録された、またはキャプチャされた写真からビデオを選択しています。このテキストラベルは、ビューとそのビューで追加しました。私はvideoviewでドラッグしています。AVAssetsビデオサイズ、このラベルはサイズ変更可能であるため、ビデオのサイズも変更する必要があります。 @Evgeniy Gushchin –

関連する問題