2016-09-15 2 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

Там нет ничего плохого с вашей Swift интерпретация и, скорее, проблема с движком рендеринга симулятора.Я пробовал свой код на симуляторе, и он действительно выглядел искаженным и искаженным, но при компиляции на устройство он работал красиво.

Смежные вопросы