2016-09-15 8 views
1

誰か助言してください。 AVFoundationを使用して作成しているビデオにテキストオーバーレイ(タイトル)を追加しようとしています。私はいくつかのオンラインリソースを見つけました(http://stackoverflow.com/questions/21684549/add-a-text-overlay-with-avmutablevideocomposition-to-a-specific-timerangeを参照) しかし、これらのリソースはすべてObjective-Cにあります。 私のプロジェクトはSwiftにあり、Swiftで関連するリソースを見つけることができません。 テキストを正しくオーバレイすることができません。レンダリングされるフレームが歪んでいるかのように歪んでいるようです。 Distorted text in AVPlayer 私が見つけたObjective-CコードをSwiftに変換しようとしましたが、私は何かが足りない。 以下は私が使用しているコードです。 (私はからのプレーヤーとビデオファイルのためのいくつかのコードを使用:あなたのスウィフトは何も問題はありませんwww.raywenderlich.com/90488/calayer-in-ios-with-swift-10-examplesiOS AVMutableCompositionテキストオーバーレイを追加

func MergeUnWeldedVideoByUserPref(showInBounds: CGRect) -> (AVMutableComposition, AVMutableVideoComposition) 
{ 
    let fps: Int32 = 30 

    // 1 - Create AVMutableComposition object. This object will hold your AVMutableCompositionTrack instances. 
    let mixComposition = AVMutableComposition() 
    // 2 - Create a video track for each of the video assests. Add your media data to the appropriate tracks 
    //let url = NSBundle.mainBundle().URLForResource("colorfulStreak", withExtension: "m4v")! 
    let url = NSBundle.mainBundle().URLForResource("colorfulStreak", withExtension: "m4v")! 
    let avAsset = AVAsset(URL: url) 
    let track = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) 
    let segmentInMovie = CMTimeRangeMake(kCMTimeZero, avAsset.duration) 
    let videoTrack = avAsset.tracksWithMediaType(AVMediaTypeVideo)[0] 
    do 
    { 
     try track.insertTimeRange(segmentInMovie, ofTrack: videoTrack, atTime: kCMTimeZero) 

    } catch{ 
     print("Failed to load track") 
    } 

    let mainInstruction = AVMutableVideoCompositionInstruction() 
    mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, avAsset.duration) 
    let instruction = videoCompositionInstructionForTrack(showInBounds, track: track, asset: avAsset) 
    mainInstruction.layerInstructions.append(instruction) 

    let mainComposition = AVMutableVideoComposition() 
    mainComposition.instructions = [mainInstruction] 
    mainComposition.frameDuration = CMTimeMake(1, fps) 
    mainComposition.renderSize = CGSize(width: showInBounds.width, height: showInBounds.height) 

    let textLayer = CATextLayer() 
    textLayer.backgroundColor = UIColor.clearColor().CGColor 
    textLayer.foregroundColor = UIColor.whiteColor().CGColor 
    textLayer.string = "T E S T" 
    textLayer.font = UIFont(name: "Arial", size: 18) 
    textLayer.shadowOpacity = 0.5 
    textLayer.alignmentMode = kCAAlignmentCenter 
    textLayer.frame = CGRectMake(5, 5, 100, 50) 
    textLayer.shouldRasterize = true 
    textLayer.rasterizationScale = showInBounds.width/videoTrack.naturalSize.width 

    let parentLayer = CALayer() 
    let videoLayer = CALayer() 
    parentLayer.frame = CGRectMake(0, 0, showInBounds.width, showInBounds.height); 
    videoLayer.frame = CGRectMake(0, 0, showInBounds.width, showInBounds.height); 
    parentLayer.addSublayer(videoLayer) 
    parentLayer.addSublayer(textLayer) 

    mainComposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer) 
    return (mixComposition, mainComposition) 
} 
+0

'showInBounds'の幅と高さは何ですか? ? –

+1

あなたがシミュレータを試しているなら、シミュレータでやってはいけません。 –

答えて

0

私はあなたのコードをシミュレータで試してみましたが、歪んで見えましたが、デバイスにコンパイルするときれいに動作しました。

関連する問題