Commit d8b0a276 authored by CZ1004's avatar CZ1004

【优化】压缩图片方法+视频静音

parent ab343dc0
...@@ -156,31 +156,101 @@ class CompressViewModel{ ...@@ -156,31 +156,101 @@ class CompressViewModel{
} }
} }
private func compressData(_ data: Data, compressionQuality: CGFloat, progress: @escaping (Float) -> Void, completion: @escaping (Data?, Error?) -> Void) { private func compressData(_ data: Data,
guard let originalImage = UIImage(data: data) else { compressionQuality: CGFloat,
completion(nil, nil) progress: @escaping (Float) -> Void,
return completion: @escaping (Data?, Error?) -> Void) {
} DispatchQueue.global(qos: .userInitiated).async {
// 错误处理闭包
DispatchQueue.global().async { func completeOnMain(error: Error? = nil, data: Data? = nil) {
var progressValue: Float = 0 DispatchQueue.main.async {
let step = 0.1 completion(data, error)
while progressValue < 1 { }
progress(progressValue)
progressValue += Float(step)
Thread.sleep(forTimeInterval: 0.1)
} }
if let compressedData = originalImage.jpegData(compressionQuality: compressionQuality) { // 验证输入数据
DispatchQueue.main.async { guard let image = UIImage(data: data) else {
progress(1.0) completeOnMain(error: NSError(domain: "ImageError", code: -1,
completion(compressedData, nil) userInfo: [NSLocalizedDescriptionKey: "Invalid image data"]))
return
}
let originalSize = data.count
let targetSize = max(Int(CGFloat(originalSize) * compressionQuality), 1024)
var currentImage = image
var currentBestData: Data?
// 进度配置
let maxIterations = 5
let qualitySteps: [CGFloat] = [0.9, 0.7, 0.5, 0.3, 0.2]
var currentIteration = 0
// 递归压缩方法
func tryCompress() {
guard currentIteration < maxIterations else {
// 最终返回最佳结果或最后一次尝试
completeOnMain(data: currentBestData ?? currentImage.jpegData(compressionQuality: 0.1))
return
} }
} else {
// 当前轮次的压缩质量
let currentQuality = qualitySteps[currentIteration]
var compressedData: Data?
// 尝试生成压缩数据
autoreleasepool {
compressedData = currentImage.jpegData(compressionQuality: currentQuality)
}
guard let validData = compressedData else {
completeOnMain(error: NSError(domain: "CompressionError", code: -2,
userInfo: [NSLocalizedDescriptionKey: "Compression failed"]))
return
}
// 更新最佳结果
if validData.count <= targetSize && validData.count > (currentBestData?.count ?? 0) {
currentBestData = validData
}
// 更新进度(每轮20%)
DispatchQueue.main.async { DispatchQueue.main.async {
completion(nil, nil) progress(Float(currentIteration + 1) / Float(maxIterations))
} }
// 检查是否达标
if validData.count <= targetSize {
completeOnMain(data: validData)
return
}
// 未达标时调整尺寸
let scaleFactor = sqrt(Double(targetSize) / Double(validData.count))
currentImage = self.resizeImage(currentImage, scaleFactor: CGFloat(scaleFactor))
currentIteration += 1
// 继续下一轮压缩
tryCompress()
} }
// 开始压缩流程
tryCompress()
}
}
// 图片尺寸调整方法保持不变
private func resizeImage(_ image: UIImage, scaleFactor: CGFloat) -> UIImage {
let newSize = CGSize(
width: max(image.size.width * scaleFactor, 1),
height: max(image.size.height * scaleFactor, 1)
)
let format = UIGraphicsImageRendererFormat()
format.scale = 1.0
format.opaque = true
let renderer = UIGraphicsImageRenderer(size: newSize, format: format)
return renderer.image { _ in
image.draw(in: CGRect(origin: .zero, size: newSize))
} }
} }
......
...@@ -30,23 +30,18 @@ class VideoViewController: UIViewController { ...@@ -30,23 +30,18 @@ class VideoViewController: UIViewController {
if let url = self.url { if let url = self.url {
self.player = AVPlayer(url: url) self.player = AVPlayer(url: url)
self.player?.isMuted = true self.player?.isMuted = true
self.player?.volume = 0 // 2. 配置播放器控制器
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.playerViewController.player = self.player
// 2. 配置播放器控制器 self.playerViewController.delegate = self
self.playerViewController.player = self.player self.playerViewController.showsPlaybackControls = true
self.playerViewController.delegate = self // 3. 添加到当前视图
self.playerViewController.showsPlaybackControls = true self.addChild(self.playerViewController)
self.playerViewController.player?.isMuted = true self.view.addSubview(self.playerViewController.view)
// 3. 添加到当前视图 self.playerViewController.view.frame = self.view.bounds
self.addChild(self.playerViewController) self.playerViewController.didMove(toParent: self)
self.view.addSubview(self.playerViewController.view) // 4. 自动播放
self.playerViewController.view.frame = self.view.bounds if self.isAutoPlay {
self.playerViewController.didMove(toParent: self) self.player?.play()
// 4. 自动播放
if self.isAutoPlay {
self.player?.play()
self.player?.isMuted = true
}
} }
} }
} }
......
...@@ -26,18 +26,13 @@ class PhotosRemoveBaseView: UIView { ...@@ -26,18 +26,13 @@ class PhotosRemoveBaseView: UIView {
vc.isAutoPlay = index == 0 vc.isAutoPlay = index == 0
vc.url = url vc.url = url
self.imageView.removeFromSuperview() self.imageView.removeFromSuperview()
self.responderViewController()?.addChild(vc)
self.addSubview(vc.view) self.addSubview(vc.view)
vc.view.snp.makeConstraints { make in vc.view.snp.makeConstraints { make in
make.left.top.bottom.right.equalToSuperview() make.left.top.bottom.right.equalToSuperview()
} }
vc.setupPlayer() vc.setupPlayer()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { vc.didMove(toParent: self.responderViewController())
vc.playerViewController.player?.isMuted = true
vc.playerViewController.player?.volume = 0
vc.player?.isMuted = true
vc.player?.volume = 0
}
} }
}else { }else {
self.innerVideoController?.playerViewController.player?.play() self.innerVideoController?.playerViewController.player?.play()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment