2015-09-02 25 views
6

azından ben bir video aşağı trim AVMutableComposition ve AVAssetExportSession kullanıyorum. Rastgele, ve (sürekli olarak yeniden üretemiyorum) kullanıcıların videolarının kırpılmış videonun başında birkaç siyah karesi var. Ses etkilenmez. Tüm farklı kaynaklardan gelen çok çeşitli videolar için olduğu gibi, kırpılan videoların onunla hiçbir ilgisi olmadığını% 100 onaylayabilirim.AVMutableComposition Video Siyah Başlat

bu videolar çok çok hoş olurdu başından siyah çerçeveli ihraç ediliyor niçin içine Herhangi bir fikir. Teşekkürler!

Bazı alakalı kodu (uzunluk için üzgün): Bizim için bu kadar

// AVURLAssetPreferPreciseDurationAndTimingKey added in attempt to solve issue 
let videoAsset = AVURLAsset(URL: url, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true]) 
var mixComposition = AVMutableComposition() 

let compositionVideoTrack = mixComposition.addMutableTrackWithMediaType(
    AVMediaTypeVideo, 
    preferredTrackID: Int32(kCMPersistentTrackID_Invalid) 
) 
let clipVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0] as! AVAssetTrack 
let videoSize = clipVideoTrack.naturalSize 
// startTime and duration are NSTimeInterval types 
let start = startTime == 0 ? kCMTimeZero : CMTimeMakeWithSeconds(startTime, videoAsset.duration.timescale) 
var dur = CMTimeMakeWithSeconds(duration, videoAsset.duration.timescale) 
if dur.value >= videoAsset.duration.value { 

    dur = videoAsset.duration 

} 
compositionVideoTrack.insertTimeRange(
    CMTimeRange(start: start, duration: dur), 
    ofTrack:clipVideoTrack, 
    atTime: kCMTimeZero, 
    error:nil 
) 

compositionVideoTrack.preferredTransform = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0].preferredTransform 

let compositionAudioTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) 
let clipAudioTrack = videoAsset.tracksWithMediaType(AVMediaTypeAudio)[0] as! AVAssetTrack 
compositionAudioTrack.insertTimeRange(
    CMTimeRange(start: start, duration: dur), 
    ofTrack: clipAudioTrack, 
    atTime: kCMTimeZero, 
    error: nil 
) 

let parentLayer = CALayer() 
parentLayer.backgroundColor = UIColor.blackColor().CGColor 
let videoLayer = CALayer() 
videoLayer.backgroundColor = UIColor.blackColor().CGColor 
var parentFrame = CGRect(
    x: 0, 
    y: 0, 
    width: videoSize.width, 
    height: videoSize.height 
) 
if parentFrame.width % 2 > 0 { 
    parentFrame.size.width = parentFrame.size.width - 1 
} 
// Fix crop frame height 
if parentFrame.size.height % 2 > 0 { 
    parentFrame.size.height = parentFrame.size.height - 1 
} 
parentLayer.frame = parentFrame 
videoLayer.frame = CGRect(
    x: 0, 
    y: 0, 
    width: videoSize.width, 
    height: videoSize.height 
) 
parentLayer.addSublayer(videoLayer) 

let videoComp = AVMutableVideoComposition() 
videoComp.renderSize = parentLayer.frame.size 
videoComp.frameDuration = CMTimeMake(1, Int32(clipVideoTrack.nominalFrameRate)) 
videoComp.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer) 

let instruction = AVMutableVideoCompositionInstruction() 
instruction.timeRange = CMTimeRange(start: kCMTimeZero, duration: mixComposition.duration) 
let videoTrack = mixComposition.tracksWithMediaType(AVMediaTypeVideo)[0] as! AVAssetTrack 
let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack) 

layerInstruction.setTransform(CGAffineTransformMakeScale(parentLayer.frame.size.width/videoSize.width, parentLayer.frame.size.height/videoSize.height), atTime: kCMTimeZero) 
instruction.layerInstructions = [layerInstruction] 
videoComp.instructions = [instruction] 

// Export 
let exportSession = AVAssetExportSession(
    asset: mixComposition, 
    presetName: AVAssetExportPresetHighestQuality 
) 
exportSession.videoComposition = videoComp 
let renderFileName = "video.mp4" 
let renderURL = NSURL(fileURLWithPath: NSTemporaryDirectory().stringByAppendingPathComponent(renderFileName)) 
exportSession.outputURL = renderURL 
exportSession.outputFileType = AVFileTypeQuickTimeMovie 
exportSession.exportAsynchronouslyWithCompletionHandler { ... } 
+0

Bir çözüm buldunuz mu? –

cevap

0

çözüm kırpmak ve aynı operasyonda videoyu kırpmak etmeye etmekti. Bunun neden olduğuna dair hala bir cevabım yok, ancak önce videoyu kırparak zamanla çözebildik, sonra videonun düzgün bir şekilde ürün üzerinde çalışmasını sağladıktan sonra.

Ne yazık ki bu sadece çerçevesinde bir hata olduğunu düşünüyoruz, ancak bizim durumumuzda en azından her operasyonda az yapıyor ve sadece birlikte operasyonlar çekimi ile bunu çözmek başardık.