feat: Add customizable Video Bit Rate (videoBitRate
) (#1882)
* feat: Add `videoBitRate` option to `RecordVideoOptions` * feat: Implement `videoBitRate` on iOS * feat: Implement `videoBitRate` on Android * chore: Format * docs: Separate recording and photo docs * docs: Fix links * docs: Add docs about bitrate and quality * docs: Add blob * fix: Don't use inline style for CI * fix: Correctly log default bitRate * fix: Fix typo * fix: Calculate default bit-rate on Android depending on resolution * Update RecordingSession.kt
This commit is contained in:
@@ -114,6 +114,32 @@ export class Camera extends React.PureComponent<CameraProps> {
|
||||
}
|
||||
}
|
||||
|
||||
private calculateBitRate(bitRate: 'low' | 'normal' | 'high', codec: 'h264' | 'h265' = 'h264'): number {
|
||||
const format = this.props.format
|
||||
if (format == null) {
|
||||
throw new CameraRuntimeError(
|
||||
'parameter/invalid-combination',
|
||||
`A videoBitRate of '${bitRate}' can only be used in combination with a 'format'!`,
|
||||
)
|
||||
}
|
||||
|
||||
const factor = {
|
||||
low: 0.8,
|
||||
normal: 1,
|
||||
high: 1.2,
|
||||
}[bitRate]
|
||||
let result = (30 / (3840 * 2160 * 0.75)) * (format.videoWidth * format.videoHeight)
|
||||
// FPS - 30 is default, 60 would be 2x, 120 would be 4x
|
||||
const fps = this.props.fps ?? Math.min(format.maxFps, 30)
|
||||
result = (result / 30) * fps
|
||||
// H.265 (HEVC) codec is 20% more efficient
|
||||
if (codec === 'h265') result = result * 0.8
|
||||
// HDR (10-bit) instead of SDR (8-bit) takes up 20% more pixels
|
||||
if (this.props.hdr) result = result * 1.2
|
||||
// Return overall result
|
||||
return result * factor
|
||||
}
|
||||
|
||||
/**
|
||||
* Start a new video recording.
|
||||
*
|
||||
@@ -135,6 +161,9 @@ export class Camera extends React.PureComponent<CameraProps> {
|
||||
if (typeof onRecordingError !== 'function' || typeof onRecordingFinished !== 'function')
|
||||
throw new CameraRuntimeError('parameter/invalid-parameter', 'The onRecordingError or onRecordingFinished functions were not set!')
|
||||
|
||||
const videoBitRate = passThroughOptions.videoBitRate
|
||||
if (typeof videoBitRate === 'string') passThroughOptions.videoBitRate = this.calculateBitRate(videoBitRate, options.videoCodec)
|
||||
|
||||
const onRecordCallback = (video?: VideoFile, error?: CameraCaptureError): void => {
|
||||
if (error != null) return onRecordingError(error)
|
||||
if (video != null) return onRecordingFinished(video)
|
||||
|
@@ -46,17 +46,17 @@ export interface CameraProps extends ViewProps {
|
||||
|
||||
//#region Use-cases
|
||||
/**
|
||||
* Enables **photo capture** with the `takePhoto` function (see ["Taking Photos"](https://react-native-vision-camera.com/docs/guides/capturing#taking-photos))
|
||||
* Enables **photo capture** with the `takePhoto` function (see ["Taking Photos"](https://react-native-vision-camera.com/docs/guides/taking-photos))
|
||||
*/
|
||||
photo?: boolean
|
||||
/**
|
||||
* Enables **video capture** with the `startRecording` function (see ["Recording Videos"](https://react-native-vision-camera.com/docs/guides/capturing/#recording-videos))
|
||||
* Enables **video capture** with the `startRecording` function (see ["Recording Videos"](https://react-native-vision-camera.com/docs/guides/recording-videos))
|
||||
*
|
||||
* Note: If both the `photo` and `video` properties are enabled at the same time and the device is running at a `hardwareLevel` of `'legacy'` or `'limited'`, VisionCamera _might_ use a lower resolution for video capture due to hardware constraints.
|
||||
*/
|
||||
video?: boolean
|
||||
/**
|
||||
* Enables **audio capture** for video recordings (see ["Recording Videos"](https://react-native-vision-camera.com/docs/guides/capturing/#recording-videos))
|
||||
* Enables **audio capture** for video recordings (see ["Recording Videos"](https://react-native-vision-camera.com/docs/guides/recording-videos))
|
||||
*/
|
||||
audio?: boolean
|
||||
/**
|
||||
|
@@ -24,6 +24,17 @@ export interface RecordVideoOptions {
|
||||
* - `h265`: The HEVC (High-Efficient-Video-Codec) for higher efficient video recordings.
|
||||
*/
|
||||
videoCodec?: 'h264' | 'h265'
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* By default, it will be calculated using those factors.
|
||||
* For example, at 1080p, 30 FPS, H.264 codec, without HDR it will result to 10 Mbps.
|
||||
*
|
||||
* @default 'normal'
|
||||
*/
|
||||
videoBitRate?: 'low' | 'normal' | 'high' | number
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user