Я только что сохранил выходное видео в Фото. Я пересмотрел некоторые из них в примере SimpleVideoRecorder, или вы можете просто скопировать / вставить следующие коды:
import UIKit
import GPUImage
import AVFoundation
import Photos
class ViewController: UIViewController {
@IBOutlet weak var renderView: RenderView!
var camera:Camera!
var filter:SaturationAdjustment!
var isRecording = false
var movieOutput:MovieOutput? = nil
var fileURL: URL!
override func viewDidLoad() {
super.viewDidLoad()
do {
camera = try Camera(sessionPreset:.vga640x480)
camera.runBenchmark = true
filter = SaturationAdjustment()
camera --> filter --> renderView
camera.startCapture()
} catch {
fatalError("Could not initialize rendering pipeline: \(error)")
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
@IBAction func capture(_ sender: AnyObject) {
if (!isRecording) {
do {
self.isRecording = true
let documentsDir = try FileManager.default.url(for:.documentDirectory, in:.userDomainMask, appropriateFor:nil, create:true)
fileURL = URL(string:"test.mp4", relativeTo:documentsDir)!
do {
try FileManager.default.removeItem(at:fileURL)
} catch {
}
movieOutput = try MovieOutput(URL:fileURL, size:Size(width:480, height:640), liveVideo:true)
// camera.audioEncodingTarget = movieOutput
filter --> movieOutput!
movieOutput!.startRecording()
DispatchQueue.main.async {
// Label not updating on the main thread, for some reason, so dispatching slightly after this
(sender as! UIButton).titleLabel!.text = "Stop"
}
} catch {
fatalError("Couldn't initialize movie, error: \(error)")
}
} else {
movieOutput?.finishRecording{
self.isRecording = false
DispatchQueue.main.async {
(sender as! UIButton).titleLabel!.text = "Record"
}
// self.camera.audioEncodingTarget = nil
self.movieOutput = nil
PHPhotoLibrary.shared().performChanges({() -> Void in
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: self.fileURL)
}, completionHandler: { _, error -> Void in
do {
// delete the caches.
try FileManager.default.removeItem(at: self.fileURL)
} catch {
print(error)
}
})
}
}
}
}
Тогда вы можете легко сказать, что почти каждый отдельный кадр поврежден. Это происходит на моем iPhone6S с iOS 13.3.1, а также в случае, когда я преобразую текстуру из фильтра в CVPixelBuffer.
Я думаю, что в BasicOperation может быть что-то не так. Я также публикую ту же проблему на GitHub БрэдЛарсона .