iOS AVMutableComposition Добавить наложение текста

может кто-нибудь посоветуйте. Я пытаюсь добавить текстовое наложение (заголовок) к видео, которое я сочиняю с помощью AVFoundation. Я нашел несколько онлайн-ресурсов (см. http://i.stack.imgur.com/zK6e4.png) Однако все эти ресурсы находятся в Objective-C. Мой проект находится в Swift, и я не могу найти соответствующие ресурсы в Swift. Я не могу правильно наложить текст, он кажется искаженным, как будто кадр, в котором он отображается, перекошен... См. рисунок Искаженный текст в AVPlayer Я попытался преобразовать найденный мной код Objective-C в Swift, но, очевидно, что-то упустил. Ниже приведен код, который я использую. (Я использовал некоторый код для плеера и видеофайла с: www.raywenderlich.com/90488/calayer-in-ios-with-swift-10-examples.

    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)
}

person user6835197    schedule 15.09.2016    source источник
comment
Какова ширина и высота showInBounds?   -  person Rhythmic Fistman    schedule 18.09.2016
comment
Если вы пытаетесь в симуляторе, не делайте этого в симуляторе. Используйте устройство для лучших результатов.   -  person Gourav Joshi    schedule 11.02.2017


Ответы (1)


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

person simplexity    schedule 09.08.2017