connect onChunkReady from ChunkedRecorder to react native
This commit is contained in:
parent
89ecb35616
commit
a2ce4df663
@ -62,6 +62,7 @@ public final class CameraView: UIView, CameraSessionDelegate {
|
|||||||
@objc var onStarted: RCTDirectEventBlock?
|
@objc var onStarted: RCTDirectEventBlock?
|
||||||
@objc var onStopped: RCTDirectEventBlock?
|
@objc var onStopped: RCTDirectEventBlock?
|
||||||
@objc var onViewReady: RCTDirectEventBlock?
|
@objc var onViewReady: RCTDirectEventBlock?
|
||||||
|
@objc var onVideoChunkReady: RCTDirectEventBlock?
|
||||||
@objc var onCodeScanned: RCTDirectEventBlock?
|
@objc var onCodeScanned: RCTDirectEventBlock?
|
||||||
// zoom
|
// zoom
|
||||||
@objc var enableZoomGesture = false {
|
@objc var enableZoomGesture = false {
|
||||||
@ -335,6 +336,25 @@ public final class CameraView: UIView, CameraSessionDelegate {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func onVideoChunkReady(chunk: ChunkedRecorder.Chunk) {
|
||||||
|
ReactLogger.log(level: .info, message: "Chunk ready: \(chunk)")
|
||||||
|
|
||||||
|
guard let onVideoChunkReady = onVideoChunkReady else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
switch chunk.type {
|
||||||
|
case .initialization:
|
||||||
|
// FIXME: send initialization segment
|
||||||
|
return
|
||||||
|
case .data(index: let index):
|
||||||
|
onVideoChunkReady([
|
||||||
|
"filepath": chunk.url.path,
|
||||||
|
"index": index,
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func onCodeScanned(codes: [CameraSession.Code], scannerFrame: CameraSession.CodeScannerFrame) {
|
func onCodeScanned(codes: [CameraSession.Code], scannerFrame: CameraSession.CodeScannerFrame) {
|
||||||
guard let onCodeScanned = onCodeScanned else {
|
guard let onCodeScanned = onCodeScanned else {
|
||||||
|
@ -55,6 +55,7 @@ RCT_EXPORT_VIEW_PROPERTY(onInitialized, RCTDirectEventBlock);
|
|||||||
RCT_EXPORT_VIEW_PROPERTY(onStarted, RCTDirectEventBlock);
|
RCT_EXPORT_VIEW_PROPERTY(onStarted, RCTDirectEventBlock);
|
||||||
RCT_EXPORT_VIEW_PROPERTY(onStopped, RCTDirectEventBlock);
|
RCT_EXPORT_VIEW_PROPERTY(onStopped, RCTDirectEventBlock);
|
||||||
RCT_EXPORT_VIEW_PROPERTY(onViewReady, RCTDirectEventBlock);
|
RCT_EXPORT_VIEW_PROPERTY(onViewReady, RCTDirectEventBlock);
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(onVideoChunkReady, RCTDirectEventBlock);
|
||||||
// Code Scanner
|
// Code Scanner
|
||||||
RCT_EXPORT_VIEW_PROPERTY(codeScannerOptions, NSDictionary);
|
RCT_EXPORT_VIEW_PROPERTY(codeScannerOptions, NSDictionary);
|
||||||
RCT_EXPORT_VIEW_PROPERTY(onCodeScanned, RCTDirectEventBlock);
|
RCT_EXPORT_VIEW_PROPERTY(onCodeScanned, RCTDirectEventBlock);
|
||||||
|
@ -33,6 +33,14 @@ extension CameraSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let enableAudio = self.configuration?.audio != .disabled
|
let enableAudio = self.configuration?.audio != .disabled
|
||||||
|
|
||||||
|
// Callback for when new chunks are ready
|
||||||
|
let onChunkReady: (ChunkedRecorder.Chunk) -> Void = { chunk in
|
||||||
|
guard let delegate = self.delegate else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
delegate.onVideoChunkReady(chunk: chunk)
|
||||||
|
}
|
||||||
|
|
||||||
// Callback for when the recording ends
|
// Callback for when the recording ends
|
||||||
let onFinish = { (recordingSession: RecordingSession, status: AVAssetWriter.Status, error: Error?) in
|
let onFinish = { (recordingSession: RecordingSession, status: AVAssetWriter.Status, error: Error?) in
|
||||||
@ -89,6 +97,7 @@ extension CameraSession {
|
|||||||
// Create RecordingSession for the temp file
|
// Create RecordingSession for the temp file
|
||||||
let recordingSession = try RecordingSession(url: tempURL,
|
let recordingSession = try RecordingSession(url: tempURL,
|
||||||
fileType: options.fileType,
|
fileType: options.fileType,
|
||||||
|
onChunkReady: onChunkReady,
|
||||||
completion: onFinish)
|
completion: onFinish)
|
||||||
|
|
||||||
// Init Audio + Activate Audio Session (optional)
|
// Init Audio + Activate Audio Session (optional)
|
||||||
|
@ -33,6 +33,10 @@ protocol CameraSessionDelegate: AnyObject {
|
|||||||
Called for every frame (if video or frameProcessor is enabled)
|
Called for every frame (if video or frameProcessor is enabled)
|
||||||
*/
|
*/
|
||||||
func onFrame(sampleBuffer: CMSampleBuffer)
|
func onFrame(sampleBuffer: CMSampleBuffer)
|
||||||
|
/**
|
||||||
|
Called whenever a new video chunk is available
|
||||||
|
*/
|
||||||
|
func onVideoChunkReady(chunk: ChunkedRecorder.Chunk)
|
||||||
/**
|
/**
|
||||||
Called whenever a QR/Barcode has been scanned. Only if the CodeScanner Output is enabled
|
Called whenever a QR/Barcode has been scanned. Only if the CodeScanner Output is enabled
|
||||||
*/
|
*/
|
||||||
|
@ -74,13 +74,12 @@ class RecordingSession {
|
|||||||
|
|
||||||
init(url: URL,
|
init(url: URL,
|
||||||
fileType: AVFileType,
|
fileType: AVFileType,
|
||||||
|
onChunkReady: @escaping ((ChunkedRecorder.Chunk) -> Void),
|
||||||
completion: @escaping (RecordingSession, AVAssetWriter.Status, Error?) -> Void) throws {
|
completion: @escaping (RecordingSession, AVAssetWriter.Status, Error?) -> Void) throws {
|
||||||
completionHandler = completion
|
completionHandler = completion
|
||||||
|
|
||||||
do {
|
do {
|
||||||
recorder = try ChunkedRecorder(url: url.deletingLastPathComponent()) { segment in
|
recorder = try ChunkedRecorder(url: url.deletingLastPathComponent(), onChunkReady: onChunkReady)
|
||||||
ReactLogger.log(level: .info, message: "Chunk ready: \(segment)")
|
|
||||||
}
|
|
||||||
assetWriter = AVAssetWriter(contentType: UTType(fileType.rawValue)!)
|
assetWriter = AVAssetWriter(contentType: UTType(fileType.rawValue)!)
|
||||||
assetWriter.shouldOptimizeForNetworkUse = false
|
assetWriter.shouldOptimizeForNetworkUse = false
|
||||||
assetWriter.outputFileTypeProfile = .mpeg4AppleHLS
|
assetWriter.outputFileTypeProfile = .mpeg4AppleHLS
|
||||||
|
Loading…
Reference in New Issue
Block a user