使用 AVAssetWriter 将 UIImages 转换为视频会为 < 800 张图像生成黑帧闪烁
UIImages to Video with AVAssetWriter produces black frames flickering for < 800 images
我被困了几个星期!
我在 Whosebug 上尝试了所有解决方案,它们在大约 0 到 500 张图像或 12 fps 的 50 秒内工作正常,但对于较长的视频,大约 50 秒后会出现黑色闪烁,具体取决于 iphone,
iphone 6 发生在 iphone 50 秒后 8 它发生在 1:30
之后
我尝试了 this link writeImagesAsMovie()
函数接受的答案
有时我会遇到内存分配问题,有时不会,
但是黑色闪烁仍然存在。
// MARK: - Fill Pixel Buffer -
private func fillPixelBufferFromImage(image: UIImage, pixelBuffer: CVPixelBuffer) {
CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer)
let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
// Create CGBitmapContext
let context = CGContext(
data: pixelData,
width: Int(720),
height: Int(720),
bitsPerComponent: 8,
bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer),
space: rgbColorSpace,
bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue
)
// Draw image into context"
context?.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: 720, height: 720))
CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
//UIGraphicsEndImageContext()
}
有助于获得预期结果的事情...
使用 UIImageJPEGRepresentation 而不是 PNG,尺寸必须是 16 的倍数...
:) 和更新的 iPhone 可以处理更多图像
我被困了几个星期!
我在 Whosebug 上尝试了所有解决方案,它们在大约 0 到 500 张图像或 12 fps 的 50 秒内工作正常,但对于较长的视频,大约 50 秒后会出现黑色闪烁,具体取决于 iphone, iphone 6 发生在 iphone 50 秒后 8 它发生在 1:30
之后我尝试了 this link writeImagesAsMovie()
函数接受的答案
有时我会遇到内存分配问题,有时不会, 但是黑色闪烁仍然存在。
// MARK: - Fill Pixel Buffer -
private func fillPixelBufferFromImage(image: UIImage, pixelBuffer: CVPixelBuffer) {
CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer)
let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
// Create CGBitmapContext
let context = CGContext(
data: pixelData,
width: Int(720),
height: Int(720),
bitsPerComponent: 8,
bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer),
space: rgbColorSpace,
bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue
)
// Draw image into context"
context?.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: 720, height: 720))
CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
//UIGraphicsEndImageContext()
}
有助于获得预期结果的事情... 使用 UIImageJPEGRepresentation 而不是 PNG,尺寸必须是 16 的倍数... :) 和更新的 iPhone 可以处理更多图像