fix: Fix Video Recording delay and improve startRecording() performance (#2192)

* fix: Add more logs

* perf: Init audio AVAssetWriter in parallel

* chore: Log Audio Session activation

* perf: Init Audio Session asynchronously

* chore: Log when category changed

* fix: Revert lazy audio initialization

* Update Podfile.lock

* Pass `sourceFormatHint` to video and audio AVAssetWriter

* fix: Remove `sourceFormatHint` from Video Asset Writer

* Use default options for Audio Asset Writer

* Update Podfile.lock

* Revert "Use default options for Audio Asset Writer"

This reverts commit e575a14c5342ddc7f9db557d5e3915328ed9e798.

* Add time logs

* fix: Don't synchronize audio buffers, they are already in sync

* shouldOptimizeForNetworkUse = false

* fix: Only update `latestTimestamp` once video buffer has been written

* perf: Use `AVAssetWriterInput` instead of `AVAssetWriterInputPixelBufferAdaptor`

* fix: Fix Audio not being synchronized with Video

* Remove logs add comments

* Format

* feat: Set `.videoRecording` AVAudioSession mode

* Refactor `startRecording()` a bit

* Format

* chore: Throw error directly instead of double-checking
This commit is contained in:
Marc Rousavy
2023-11-22 17:53:10 +01:00
committed by GitHub
parent 49d58d0d0c
commit cf8f3d05e3
11 changed files with 155 additions and 110 deletions

View File

@@ -21,24 +21,15 @@ struct RecordVideoOptions {
init(fromJSValue dictionary: NSDictionary) throws {
// File Type (.mov or .mp4)
if let fileTypeOption = dictionary["fileType"] as? String {
guard let parsed = try? AVFileType(withString: fileTypeOption) else {
throw CameraError.parameter(.invalid(unionName: "fileType", receivedValue: fileTypeOption))
}
fileType = parsed
fileType = try AVFileType(withString: fileTypeOption)
}
// Flash
if let flashOption = dictionary["flash"] as? String {
guard let parsed = try? Torch(jsValue: flashOption) else {
throw CameraError.parameter(.invalid(unionName: "flash", receivedValue: flashOption))
}
flash = parsed
flash = try Torch(jsValue: flashOption)
}
// Codec
if let codecOption = dictionary["codec"] as? String {
guard let parsed = try? AVVideoCodecType(withString: codecOption) else {
throw CameraError.parameter(.invalid(unionName: "codec", receivedValue: codecOption))
}
codec = parsed
codec = try AVVideoCodecType(withString: codecOption)
}
// BitRate
if let parsed = dictionary["bitRate"] as? Double {