首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVMutableComposition视频黑启动

AVMutableComposition视频黑启动
EN

Stack Overflow用户
提问于 2015-09-02 05:16:53
回答 1查看 623关注 0票数 6

我正在使用AVMutableCompositionAVAssetExportSession来修剪一个视频。随机的,我的意思是随机的(我不能始终如一地复制)用户的视频在修剪视频的开始有一些黑色的帧。音频不受影响。我可以确认100%的视频被裁剪与它没有任何关系,因为这发生在各种不同来源的视频中。

任何洞察为什么这些视频被输出与黑色帧在一开始是非常受欢迎的。谢谢!

一些相关代码(对长度表示抱歉):

代码语言:javascript
复制
// 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 { ... }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-28 16:09:22

对我们来说,解决这个问题的方法是不要试图在相同的操作中裁剪视频。我仍然没有答案,为什么会发生这种情况,但我们能够解决它的第一次修剪视频的时间,然后我们得到的视频,适当的时间执行它的作物操作。

不幸的是,我认为这只是框架中的一个bug,但至少在我们的例子中,我们能够通过在每个操作中少做几个操作并将操作串在一起来解决它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32345115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档