feat: Add extra-low and extra-high bit-rate options (#2225)

This commit is contained in:
Marc Rousavy 2023-11-27 17:29:25 +01:00 committed by GitHub
parent d7f7095d1a
commit a28135da20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 13 deletions

View File

@ -127,13 +127,18 @@ export class Camera extends React.PureComponent<CameraProps> {
} }
private getBitRateMultiplier(bitRate: RecordVideoOptions['videoBitRate']): number { private getBitRateMultiplier(bitRate: RecordVideoOptions['videoBitRate']): number {
if (typeof bitRate === 'number' || bitRate == null) return 1
switch (bitRate) { switch (bitRate) {
case 'extra-low':
return 0.6
case 'low': case 'low':
return 0.8 return 0.8
case 'normal':
return 1
case 'high': case 'high':
return 1.2 return 1.2
default: case 'extra-high':
return 1 return 1.4
} }
} }
@ -159,14 +164,12 @@ export class Camera extends React.PureComponent<CameraProps> {
throw new CameraRuntimeError('parameter/invalid-parameter', 'The onRecordingError or onRecordingFinished functions were not set!') throw new CameraRuntimeError('parameter/invalid-parameter', 'The onRecordingError or onRecordingFinished functions were not set!')
const nativeOptions: NativeRecordVideoOptions = passThruOptions const nativeOptions: NativeRecordVideoOptions = passThruOptions
if (typeof videoBitRate === 'string') { if (typeof videoBitRate === 'number') {
// If the user passed 'low'/'normal'/'high', we need to apply this as a multiplier to the native bitrate instead of absolutely setting it
delete nativeOptions.videoBitRateOverride
nativeOptions.videoBitRateMultiplier = this.getBitRateMultiplier(videoBitRate)
} else {
// If the user passed an absolute number as a bit-rate, we just use this as a full override. // If the user passed an absolute number as a bit-rate, we just use this as a full override.
delete nativeOptions.videoBitRateOverride
nativeOptions.videoBitRateOverride = videoBitRate nativeOptions.videoBitRateOverride = videoBitRate
} else if (typeof videoBitRate === 'string' && videoBitRate !== 'normal') {
// If the user passed 'low'/'normal'/'high', we need to apply this as a multiplier to the native bitrate instead of absolutely setting it
nativeOptions.videoBitRateMultiplier = this.getBitRateMultiplier(videoBitRate)
} }
const onRecordCallback = (video?: VideoFile, error?: CameraCaptureError): void => { const onRecordCallback = (video?: VideoFile, error?: CameraCaptureError): void => {

View File

@ -21,20 +21,26 @@ export interface RecordVideoOptions {
/** /**
* The Video Codec to record in. * The Video Codec to record in.
* - `h264`: Widely supported, but might be less efficient, especially with larger sizes or framerates. * - `h264`: Widely supported, but might be less efficient, especially with larger sizes or framerates.
* - `h265`: The HEVC (High-Efficient-Video-Codec) for higher efficient video recordings. * - `h265`: The HEVC (High-Efficient-Video-Codec) for higher efficient video recordings. Results in up to 50% smaller file-sizes.
*/ */
videoCodec?: 'h264' | 'h265' videoCodec?: 'h264' | 'h265'
/** /**
* The bit-rate for encoding the video into a file, in Mbps (Megabits per second). * The bit-rate for encoding the video into a file, in Mbps (Megabits per second).
* *
* Bit-rate is dependant on various factors such as resolution, FPS, pixel format (whether it's 10 bit HDR or not), and codec. * Bit-rate is dependant on various factors such as resolution, FPS, pixel format (whether it's 10 bit HDR or not), and video codec.
* *
* By default, it will be calculated using those factors. * By default, it will be calculated by the hardware encoder, which takes all those factors into account.
* For example, at 1080p, 30 FPS, H.264 codec, without HDR it will result to 10 Mbps. *
* * `extra-low`: 40% lower than whatever the hardware encoder recommends.
* * `low`: 20% lower than whatever the hardware encoder recommends.
* * `normal`: The recommended value by the hardware encoder.
* * `high`: 20% higher than whatever the hardware encoder recommends.
* * `extra-high`: 40% higher than whatever the hardware encoder recommends.
* * `number`: Any custom number for the bit-rate, in Mbps.
* *
* @default 'normal' * @default 'normal'
*/ */
videoBitRate?: 'low' | 'normal' | 'high' | number videoBitRate?: 'extra-low' | 'low' | 'normal' | 'high' | 'extra-high' | number
} }
/** /**