के साथ पूर्ण स्क्रीन में वीडियो निर्यात करना मैं एक वीडियो (रिकॉर्डिंग के बाद) में कुछ एनिमेशन करने की कोशिश कर रहा हूं और फिर इसे निर्यात करता हूं। लेकिन किसी एनीमेशन से पहले मुझे अभिविन्यास के साथ समस्या थी जो परिदृश्य बन गया (बिना निर्यात के यह चित्र था) और इसे हल नहीं किया गया है, लेकिन अब मुझे इसे पूर्ण स्क्रीन बनाने में समस्या है। Iphone 6,7 प्लस इसकी पूर्ण स्क्रीन कैसे आईपैड यह नहीं है।AVAssetExportSession
func export(_ url : URL) {
let composition = AVMutableComposition()
let asset = AVURLAsset(url: url, options: nil)
let track = asset.tracks(withMediaType : AVMediaTypeVideo)
let videoTrack:AVAssetTrack = track[0] as AVAssetTrack
let timerange = CMTimeRangeMake(kCMTimeZero, asset.duration)
let compositionVideoTrack:AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID())
do {
try compositionVideoTrack.insertTimeRange(timerange, of: videoTrack, at: kCMTimeZero)
} catch {
print(error)
}
let compositionAudioTrack:AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID())
for audioTrack in asset.tracks(withMediaType: AVMediaTypeAudio) {
do {
try compositionAudioTrack.insertTimeRange(audioTrack.timeRange, of: audioTrack, at: kCMTimeZero)
} catch {
print(error)
}
}
let size = self.view.bounds.size
let videolayer = CALayer()
videolayer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
let parentlayer = CALayer()
parentlayer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
parentlayer.addSublayer(videolayer)
let layercomposition = AVMutableVideoComposition()
layercomposition.frameDuration = CMTimeMake(1, 30)
layercomposition.renderSize = self.view.bounds.size
layercomposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videolayer, in: parentlayer)
let instruction = AVMutableVideoCompositionInstruction()
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration)
let videotrack = composition.tracks(withMediaType: AVMediaTypeVideo)[0] as AVAssetTrack
let layerinstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videotrack)
let ratio = size.height/videoTrack.naturalSize.width
composition.naturalSize = videoTrack.naturalSize
layerinstruction.setTransform(videoTrack.preferredTransform.scaledBy(x: 0.645 , y: ratio).translatedBy(x: self.view.bounds.height, y: 0), at: kCMTimeZero)
instruction.layerInstructions = [layerinstruction]
layercomposition.instructions = [instruction]
let filePath = self.fileName()
let movieUrl = URL(fileURLWithPath: filePath)
guard let assetExport = AVAssetExportSession(asset: composition, presetName:AVAssetExportPresetHighestQuality) else {return}
assetExport.videoComposition = layercomposition
assetExport.outputFileType = AVFileTypeMPEG4
assetExport.outputURL = movieUrl
assetExport.exportAsynchronously(completionHandler: {
switch assetExport.status {
case .completed:
print("success")
let player = AVPlayer(url: movieUrl)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.present(playerViewController, animated: true) {
playerViewController.player!.play()
}
break
case .cancelled:
print("cancelled")
break
case .exporting:
print("exporting")
break
case .failed:
print("failed: \(String(describing: assetExport.error))")
break
case .unknown:
print("unknown")
break
case .waiting:
print("waiting")
break
}
})
}
क्या आपने 'AVAssetExportPreset' के अलावा किसी अन्य प्रीसेट को आजमाया था? – Bluewings
मुझे लगता है कि इसमें आपके 'layercomposition.renderSize' के साथ कुछ करना है, आप इसे वर्तमान दृश्य के लिए सेट कर रहे हैं ताकि यदि आप इसे फ़ोन पर चलाते हैं तो आउटपुट वीडियो आईपैड पर छोटा होगा। क्या आप मूल वीडियो के आकार में रेंडर आकार सेट कर सकते हैं? वह चाल हो सकता है। – Chris
शायद यह वह जगह है जहां अनुपात की ऊंचाई/चौड़ाई से गणना की जाती है: अनुपात = आकार। हाइट/वीडियोट्रैक.न्योरिक साइज.विड्थ – xxtesaxx