2015-09-02 49 views
6

我使用AVMutableCompositionAVAssetExportSession來裁剪視頻。隨機地,我的意思是隨機(我無法一直重現)用戶的視頻在剪輯視頻的開始處有一些黑色框架。音頻不受影響。我可以100%確認所剪輯的視頻與它沒有任何關係,因爲這種情況適用於來自所有不同來源的各種視頻。AVMutableComposition Video Black開始

深入瞭解爲什麼這些視頻以黑框出口的原因非常受歡迎。謝謝!

一些相關的代碼(遺憾的長度):

// 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

您是否找到解決方案? –

回答

0

解決這個對我們來說是不嘗試裁剪和修剪視頻在相同的操作。我仍然無法回答爲什麼會發生這種情況,但我們能夠通過首先剪輯視頻一段時間,然後在視頻合適的時間對剪輯進行剪裁操作之後解決。

不幸的是我相信這只是框架中的一個錯誤,但至少在我們的案例中,我們能夠通過在每個操作中少花錢,並且只是將操作串在一起來解決它。