Video Decoding Methods
You have to initialize DynamsoftCameraEnhancer
or implement protocol ImageSource
to get access to the video decoding methods.
Method | Description |
---|---|
setCameraEnhancer |
Bind a DynamsoftCameraEnhancer object. Set CameraEnhancer as the video source. |
setImageSource |
Bind a ImageSource object. Set ImageSource as the video source. |
startScanning |
Start the barcode reading thread. |
stopScanning |
Stop the barcode reading thread. |
setDBRTextResultListener |
Set callback function to process text results generated during frame decoding. |
setDBRIntermediateResultListener |
Set callback function to process intermediate results generated during frame decoding. |
minImageReadingInterval |
The property indicates the minimum interval between two barcode decoding. |
enableResultVerification |
Enable Result Verification feature to improve the accuracy of barcode results for video streaming barcode decoding. |
enableDuplicateFilter |
Enable Duplicate Filter feature to filter out the duplicate results in the period of duplicateForgetTime for video barcode decoding. |
duplicateForgetTime |
The property of duplicateForgetTime , Default value is 3000(ms). |
setCameraEnhancer
Bind a DynamsoftCameraEnhancer
instance to the Barcode Reader.
- Objective-C
- Swift
- (void)setCameraEnhancer:(DynamsoftCameraEnhancer* _Nonnull)cameraInstance;
func setCameraEnhancer(_ cameraInstance: DynamsoftCameraEnhancer)
Parameters
cameraInstance
: An instance of Dynamsoft Camera Enhancer
.
Code Snippet
This code snippet displays a complete code on how to add DynamsoftCameraEnhancer to your project and start to use Video Decoding Methods to decode and get barcode results from the video streaming.
- Objective-C
- Swift
/* Be sure that you have import the following headers when using video decoding methods */ #import <DynamsoftBarcodeReader/DynamsoftBarcodeReader.h> #import <DynamsoftCameraEnhancer/DynamsoftCameraEnhancer.h> /* You have to add DBRTextResultListener to your interface. */ @interface ViewController ()<DBRTextResultListener> @property(nonatomic, strong) DynamsoftBarcodeReader *barcodeReader; @property(nonatomic, strong) DynamsoftCameraEnhancer *dce; @property(nonatomic, strong) DCECameraView *dceView; @end @implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; [self configurationDBR]; } - (void)configurationDBR{ _barcodeReader = [[DynamsoftBarcodeReader alloc] init]; _dceView = [DCECameraView cameraWithFrame:self.view.bounds]; [self.view addSubview:_dceView]; _dce = [[DynamsoftCameraEnhancer alloc] initWithView:_dceView]; [_dce open]; [_barcodeReader setCameraEnhancer:_dce]; [_barcodeReader startScanning]; [_barcodeReader setDBRTextResultListener:self]; } - (void)textResultCallback:(NSInteger)frameId imageData:(iImageData *)imageData results:(NSArray<iTextResult *> *)results{ // Add your code to do when barcode result is returned. }
// Be sure that you have import the following headers when using video decoding methods import DynamsoftBarcodeReader import DynamsoftCameraEnhancer // You have to add setDBRTextResultListener to your class. class ViewController: UIViewController, DBRTextResultListener{ var SafeAreaBottomHeight:CGFloat = UIApplication.shared.statusBarFrame.size.height > 20 ? 34 : 0 var mainHeight = UIScreen.main.bounds.height var mainWidth = UIScreen.main.bounds.width var dce:DynamsoftCameraEnhancer! = nil var dceView:DCECameraView! = nil var barcodeReader:DynamsoftBarcodeReader! = nil override func viewDidLoad(){ super.viewDidLoad() configurationDBR() } override func viewWillAppear(_ animated: Bool) { barcodeReader.startScanning() } override func viewWillDisappear(_ animated: Bool) { barcodeReader.stopScanning() } func configurationDBR(){ barcodeReader = DynamsoftBarcodeReader.init() var barHeight = self.navigationController?.navigationBar.frame.height if UIApplication.shared.statusBarFrame.size.height <= 20 { barHeight = 20 } dceView = DCECameraView.init(frame: CGRect(x: 0, y: barHeight!, width: mainWidth, height: mainHeight - SafeAreaBottomHeight - barHeight!)) self.view.addSubview(dceView) dce = DynamsoftCameraEnhancer.init(view: dceView) dce.open() barcodeReader.setCameraEnhancer(dce) barcodeReader.setDBRTextResultListener(self) } func textResultCallback(_ frameId: Int, imageData: iImageData, results: [iTextResult]?){ // Add your code } }
setImageSource
Set the ImageSource
as the source of video streaming.
- Objective-C
- Swift
- (void)setImageSource:(nonnull id<ImageSource>)source;
func setImageSource(_ source: ImageSource)
Parameters
[in] source
The protocol of ImageSource.
Code Snippet
Here we use AVFoundation as the example of the image source. The following code displays how to use AVFoundation to capture video frames and tranfer the video frames into iImageData
.
- Objective-C
- Swift
// Add property imageData in your project to receive the image data. @property (nonatomic, strong) iImageData *imageData; //Start barcode decoding when the view appears. - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.barcodeReader startScanning]; } //Stop barcode decoding when the view disappears. - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.barcodeReader stopScanning]; } - (void)configurationDBR { self.barcodeReader = [[DynamsoftBarcodeReader alloc] init]; // Set image source [self.barcodeReader setImageSource:self]; [self.barcodeReader setDBRTextResultListener:self]; } ... // Get the buffer image from AVCaptureOutput and generate the image into iImageData. - (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); if (imageBuffer == nil) { return; } CVPixelBufferLockBaseAddress(imageBuffer, 0); void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer); size_t width = CVPixelBufferGetWidth(imageBuffer); size_t height = CVPixelBufferGetHeight(imageBuffer); size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); CVPixelBufferUnlockBaseAddress(imageBuffer,0); NSData *buffer = [NSData dataWithBytes:baseAddress length:bufferSize]; // Initialize the image data and allocate the value. if (self.imageData == nil) { self.imageData = [[iImageData alloc] init]; } self.imageData.bytes = buffer; self.imageData.width = width; self.imageData.height = height; self.imageData.stride = bytesPerRow; self.imageData.format = EnumImagePixelFormatARGB_8888; } // Configure the getImage method. - (iImageData *)getImage { return self.imageData; } - (void)textResultCallback:(NSInteger)frameId imageData:(iImageData *)imageData results:(NSArray<iTextResult *> *)results { // Add your code to execute when iTextResult is received. }
class CamerViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate, ImageSource, DBRTextResultListener{ // Add property imageData in your project to receive the image data. var imageData:iImageData! = nil //Start barcode decoding when the view appears. override func viewWillAppear(_ animated: Bool) { barcodeReader.startScanning() } //Stop barcode decoding when the view disappears. override func viewWillDisappear(_ animated: Bool) { barcodeReader.stopScanning() } func setDBR() { barcodeReader = DynamsoftBarcodeReader.init() // Set image source barcodeReader.setImageSource(self) barcodeReader.setDBRTextResultListener(self) } // Get the buffer image from AVCaptureOutput and generate the image into iImageData. func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { let imageBuffer:CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! CVPixelBufferLockBaseAddress(imageBuffer, .readOnly) let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer) let bufferSize = CVPixelBufferGetDataSize(imageBuffer) let width = CVPixelBufferGetWidth(imageBuffer) let height = CVPixelBufferGetHeight(imageBuffer) let bpr = CVPixelBufferGetBytesPerRow(imageBuffer) CVPixelBufferUnlockBaseAddress(imageBuffer, .readOnly) let buffer = Data(bytes: baseAddress!, count: bufferSize) // Initialize the image data and allocate the value if (imageData == nil) { imageData = iImageData.init() } imageData.bytes = buffer imageData.width = width imageData.height = height imageData.stride = bpr imageData.format = .ARGB_8888 } // Configure the getImage method. func getImage() -> iImageData? { return imageData } func textResultCallback(_ frameId: Int, imageData: iImageData, results: [iTextResult]?){ // Add your code to execute when iTextResult is received. } }
startScanning
Start the video streaming barcode decoding thread. Please be sure that you have bound a DynamsoftCameraEnhacner
or ImageSource
to the barcode reader before you trigger startScanning
.
- Objective-C
- Swift
-(void)startScanning;
func startScanning()
Code Snippet
You can view detailed code snippet in setCameraEnhancer
stopScanning
Stop the video streaming barcode decoding thread.
- Objective-C
- Swift
-(void)stopScanning;
func stopScanning()
Code Snippet
- Objective-C
- Swift
[_barcodeReader stopScanning];
barcodeReader.stopScanning()
setDBRTextResultListener
Set callback function to process text results generated during frame decoding.
- Objective-C
- Swift
-(void)setDBRTextResultListener:(id _Nullable)textResultListener;
func setDBRTextResultListener(_ textResultDelegate: DBRTextResultListener?)
Parameters
[in] textResultListener
: Callback function.
Code Snippet
You can view detailed code snippet in setCameraEnhancer
setDBRIntermediateResultListener
Set callback function to process intermediate results generated during frame decoding.
- Objective-C
- Swift
-(void)setDBRIntermediateResultListener:(id _Nullable)intermediateResultListener;
func setDBRIntermediateResultListener(_ intermediateResultDelegate: DBRIntermediateResultListener?)
Parameters
[in] intermediateResultListener
: Callback function.
Code Snippet
The usage of intermediateResultListener
is similar to the textResultListener
. You can view detailed code snippet in setCameraEnhancer
and replace the textResultListener
code with the intermediateResultListener
code.
- Objective-C
- Swift
// You have to add DBRIntermediateResultListener to your interface. @interface ViewController ()<DBRIntermediateResultListener> - (void)configurationDBR{ _barcodeReader = [[DynamsoftBarcodeReader alloc] init]; [_barcodeReader setDBRIntermediateResultListener:self]; } - (void)intermediateResultCallback:(NSInteger)frameId imageData:(iImageData *)imageData results:(NSArray<iTextResult *> *)results{ // Add your code to execute when intermediate result is returned. }
// You have to add DBRIntermediateResultListener to your class. class ViewController: UIViewController, DBRIntermediateResultListener{ func configurationDBR(){ barcodeReader = DynamsoftBarcodeReader.init() barcodeReader.setDBRIntermediateResultListener(self) } func intermediateResultCallback(_ frameId: Int, imageData: iImageData, results: [iTextResult]?){ // Add your code to execute when intermediate result is returned. } }
minImageReadingInterval
The property indicates the minimum interval between two barcode decoding processes. This property is measured in milliseconds. If the previous barcode decoding process is finished in n
milliseconds (n
< minImageReadingInterval
), the barcode decoding thread will be paused by minImageReadingInterval
- n
milliseconds.
- Objective-C
- Swift
@property NSInteger minImageReadingInterval;
var minImageReadingInterval: Int { get set }
Code Snippet
- Objective-C
- Swift
[barcodeReader setMinImageReadingInterval:true]; // To get the value of minImageReadingInterval bool interval = [barcodeReader minImageReadingInterval]
barcodeReader.minImageReadingInterval = true // To get the value of minImageReadingInterval let interval = barcodeReader.minImageReadingInterval
enableResultVerification
Enable Result Verification feature to improve the accuracy of barcode results for video streaming barcode decoding. This feature is not enabled by default.
There are 2 way for you to get barcode results:
- From the return value of
decode
methods when processing a single image. - From the
textResultCallback
when processing the video streaming.
Result verification feature only effects on the OneD barcode results you get from textResultCallback
.
- Objective-C
- Swift
@property (nonatomic, assign) BOOL enableResultVerification;
var enableResultVerification: Bool { get set }
Parameters
boolean
value which stands for the target status of result verification mode.
Code Snippet
- Objective-C
- Swift
[barcodeReader setEnableResultVerification:true]; // To check the status of this mode bool resultVerification = [barcodeReader enableResultVerification]
barcodeReader.enableResultVerification = true // To check the status of this mode let resultVerification = barcodeReader.enableResultVerification
enableDuplicateFilter
Enable Duplicate Filter feature to filter out the duplicate results in the period of duplicateForgetTime
for video barcode decoding. Barcode results with the same text and format will be returned only once during the period. The default value of duplicateForgetTime
is 3000ms.
There are 2 way for you to get barcode results:
- From the return value of
decode
methods when processing a single image. - From the
textResultCallback
when processing the video streaming.
Duplicate filter only effects on the duplicate results that output by textResultCallback
.
- Objective-C
- Swift
@property (nonatomic, assign) BOOL enableDuplicateFilter;
var enableDuplicateFilter: Bool { get set }
Parameters
boolean
value which stands for the target status of result duplicate filter mode.
Code Snippet
- Objective-C
- Swift
// You can set a duplicate forget time for the duplicate filter [barcodeReader setDuplicateForgetTime:500]; [barcodeReader setEnableDuplicateFilter:true]; // To check the status of this mode bool duplicateFilter = [barcodeReader enableDuplicateFilter]
// You can set a duplicate forget time for the duplicate filter barcodeReader.duplicateForgetTime = 500 barcodeReader.enableDuplicateFilter = true // To check the status of this mode let resultVerification = barcodeReader.enableDuplicateFilter
duplicateForgetTime
The property of duplicateForgetTime
, Default value is 3000(ms). Please view enableDuplicateFilter
for more information.
- Objective-C
- Swift
@property (nonatomic, assign) NSInteger duplicateForgetTime;
var duplicateForgetTime: Int { get set }