ios - AVMutableComposition 视频开始时为黑色

标签 ios swift video avfoundation

我正在使用 AVMutableCompositionAVAssetExportSession 来剪辑视频。随机地,我的意思是随机地(我无法始终如一地重现)用户的视频在修剪视频的开头有几个黑框。音频不受影响。我可以 100% 确认被修剪的视频与它没有任何关系,因为来自所有不同来源的各种视频都会发生这种情况。

如果您能深入了解为什么这些视频一开始就带有黑框,我们将非常欢迎。谢谢!

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

// 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 { ... }

最佳答案

我们的解决方案是不要尝试在同一操作中裁剪和修剪视频。我仍然不知道为什么会发生这种情况,但我们能够通过首先修剪视频时间来解决这个问题,然后在我们获得具有适当持续时间的视频后对其执行裁剪操作。

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

关于ios - AVMutableComposition 视频开始时为黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32345115/

相关文章:

ruby-on-rails - 使用 Rails 和 HAML video_tag 循环播放 HTML5 视频

python - 在 python 中使用 OpenCV 2.4.0 创建视频

ios - 在 objective-c 中在哪里声明静态变量?

python - 尝试在 iOS 设备上使用 ReportLab 创建 PDF 时出现权限错误

ios - 当我添加 self.init(url : url)?

此视频中的 iOS 动画

android - 如何使用 MediaCodec 类解码 H.264 流

ios - Xcode 7.3 自动布局问题

ios - 重用 UITableViewCell 移动 subview 框架

objective-c - 在 iOS 8 中使用 UISearchController 自定义搜索栏