Поддерживает ли AVMutableComposition сохранение прозрачного видео? - PullRequest
0 голосов
/ 06 мая 2019

Я пытался добавить прозрачное видео в UIImageView.UIImageView воспроизводит анимацию изображений из массива.Я могу этого добиться.Сейчас я пытаюсь сохранить это точное видео в галерее, используя AVMutableVideoComposition

Пытаясь сохранить видео из этого проекта Github MyTransparentVideoExample !

Я использовал createVideoComposition , чтобы получить AVVideoComposition , а затем предоставлял эту композицию AVMutableVideoCompostion .


var mainComposition : AVMutableVideoComposition!

func createVideoComposition(for playerItem: AVPlayerItem) -> AVVideoComposition
    {
        let videoSize = CGSize(width: playerItem.presentationSize.width / 2.0, height: playerItem.presentationSize.height)
        let composition = AVMutableVideoComposition(asset: playerItem.asset, applyingCIFiltersWithHandler: { request in
            let sourceRect = CGRect(origin: .zero, size: videoSize)
            let alphaRect = sourceRect.offsetBy(dx: 0, dy: 0)
            let filter = AlphaFrameFilter()
            filter.inputImage = request.sourceImage.cropped(to: alphaRect)
               .transformed(by: CGAffineTransform(translationX: 0, y:0))
            filter.maskImage = request.sourceImage.cropped(to: sourceRect)
            return request.finish(with: filter.outputImage!, context: nil)
        })
        composition.renderSize = videoSize
        mainComposition = composition
        return composition
    }



//function to create video

 func createVideo()
    {

        let path = Bundle.main.path(forResource: "template", ofType:"mp4")
        let fileURL = NSURL(fileURLWithPath: path!)
        let composition = AVMutableComposition()
        var vidAsset = AVURLAsset(url: fileURL as URL, options: nil)



        // get video track
        let vtrack =  vidAsset.tracks(withMediaType: AVMediaType.video)
        let videoTrack:AVAssetTrack = vtrack[0]
        let vid_duration = videoTrack.timeRange.duration
        let vid_timerange = CMTimeRangeMake(start: CMTime.zero, duration: vidAsset.duration)

        var error: NSError?
        let compositionvideoTrack:AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: CMPersistentTrackID())!
        do {
            try compositionvideoTrack.insertTimeRange(vid_timerange, of: videoTrack, at: CMTime.zero)
        }catch {

        }
        compositionvideoTrack.preferredTransform = videoTrack.preferredTransform



        var tempLayer = CALayer()
        let videolayer = CALayer()
        videolayer.frame = CGRect(x: 0,y:  0,width: videoSize.width,height: videoSize.height)
        videolayer.contentsGravity = CALayerContentsGravity.resize
        videolayer.backgroundColor = UIColor.clear.cgColor



        let parentlayer = CALayer()
        parentlayer.frame = CGRect(x: 0,y: 0,width: videoSize.width,height: videoSize.height)
        tempLayer.frame = parentlayer.bounds
        parentlayer.backgroundColor = UIColor.clear.cgColor
        parentlayer.addSublayer(videolayer)



       mainComposition.frameDuration = CMTimeMake(value: 1, timescale: 30)
       mainComposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videolayer, in: parentlayer)



        try? FileManager.default.removeItem(at: getPath())

        // use AVAssetExportSession to export video
        let assetExport = AVAssetExportSession(asset: composition, presetName:AVAssetExportPresetHighestQuality)
        assetExport?.videoComposition = mainComposition

        assetExport?.outputFileType = AVFileType.mp4
        assetExport?.outputURL = getPath()

        var exportProgressBarTimer = Timer() // initialize timer
        if #available(iOS 10.0, *)
        {
            exportProgressBarTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true)
            { timer in
                // Get Progress
                let progress = Float((assetExport!.progress));
                //print(progress)
                if (progress < 1.0)
                {
                    print(progress)

                    let dict:[String: Float] = ["progress": progress]
                    NotificationCenter.default.post(name: Notification.Name("ProgressBarPercentage"), object: nil, userInfo: dict)
                }else
                {
                    exportProgressBarTimer.invalidate()
                }
            }
        }




        assetExport?.exportAsynchronously(completionHandler:
            {
            switch assetExport!.status{
            case  AVAssetExportSession.Status.failed:
                //println("failed \(assetExport.error)")
                print()
            case AVAssetExportSession.Status.cancelled:
                print()  //println("cancelled \(assetExport.error)")
            default:
                PHPhotoLibrary.shared().saveVideo(url: self.getPath(), albumName: "TransparentVideo",completion: nil)


                DispatchQueue.main.async {
                }
            }
        })
    }



Приведенный выше код сохраняет видео, но оно не прозрачное и, как я хотел.Предварительный просмотр перед сохранением видео: Предварительный просмотр (https://imgur.com/lxeaR8O).). И после сохранения видео я не получаю анимацию фонового изображения в своем видео. SavedVideoSS (https://imgur.com/vF7lVCk)

Попытка сохранить видео из этого проекта Github MyTransparentVideoExample !

...