Cabbage
Cabbage copied to clipboard
Exported video appears to be darker (colour shifting)
I noticed that while exporting video using AVAssetExportSession, the result appears to be darker. Attached below are the original and exported screenshot of the videos.
Is this expected? Any suggestions/workarounds to preserve as much of the visual quality of the original videos in the exported?
Original:

Exported:

The code:
let timeline = Timeline()
var videoChannels = [TrackItem]()
var audioChannels = [TrackItem]()
var currentTime = CMTime.zero
for asset in self.assets {
let resource = AVAssetTrackResource(asset: asset)
let trackItem = TrackItem(resource: resource)
trackItem.videoConfiguration.contentMode = .aspectFit
trackItem.startTime = currentTime
currentTime = CMTimeAdd(currentTime, asset.duration)
videoChannels.append(trackItem)
audioChannels.append(trackItem)
}
timeline.videoChannel = videoChannels
timeline.audioChannel = audioChannels
timeline.renderSize = CGSize(width: 1080, height: 1920)
let compositionGenerator = CompositionGenerator(timeline: timeline)
let exportSession = compositionGenerator.buildExportSession(presetName: AVAssetExportPresetHighestQuality)
exportSession?.outputFileType = .mov
let outputURL = URL(fileURLWithPath: NSTemporaryDirectory().appending("test.mov"))
exportSession?.outputURL = outputURL
exportSession?.exportAsynchronously {
if let error = exportSession?.error {
print("Failed to export: \(error)")
} else {
print("Movie file generated: \(outputURL)")
}
}
Upon further digging, this appears to be HDR related issue.
The original is an HDR video, and it looks like the exported video did not preserve the HDR format. Per Apple's WWDC sessions for exporting HDR, AVAssetExportSession will preserve HDR without extra code if default compositor is used (and the chosen preset is set to one of the AVAssetExportPresetHEVC* options).
When using custom compositor though (which is the case for Cabbage), it must be updated to be HDR aware.
I have tried rewriting the code above to use AVFoundation APIs directly, the video is exported correctly when HEVC preset is used.
I add a demo to show how to support HDR video, you can pull the latest code.
https://github.com/VideoFlint/Cabbage/commit/41c78700c32b3814eaa242a3b4fe9323e14d63fc#diff-2dc4dc28f7aa306658725e96363ac9a93d6e8642d3435f0b5a15407b463ed796R128
HDR could be supported by subclass VideoCompositor
预览正常,导出存在偏色,我这边测试的视频是偏红😭