Skip to content

Commit 0718512

Browse files
committed
[*] improve openh264 encoder efficiency
1 parent b80a36f commit 0718512

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

lib/recorder/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ env_logger.workspace = true
5353
default = ["wayland-wlr"]
5454
windows = ["openh264-video-encoder"]
5555
wayland-wlr = ["dep:screen-capture-wayland-wlr", "x264-video-encoder"]
56-
# wayland-wlr = ["dep:screen-capture-wayland-wlr", "openh264-video-encoder"] # For Debug on Linux
56+
# For Debug on Linux
57+
# wayland-wlr = ["dep:screen-capture-wayland-wlr", "openh264-video-encoder"]
5758
wayland-portal = ["dep:screen-capture-wayland-portal", "x264-video-encoder"]
5859

5960
x264-video-encoder = ["dep:x264"]

lib/recorder/src/video_encoder/ve_openh264.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use crate::{RecorderError, VideoEncoder, VideoEncoderConfig, recorder::ResizedIm
33
use image::{ImageBuffer, Rgb};
44
use openh264::{
55
OpenH264API,
6-
encoder::{Complexity, Encoder, EncoderConfig, FrameRate, Profile, RateControlMode, UsageType},
6+
encoder::{
7+
Complexity, Encoder, EncoderConfig, FrameRate, IntraFramePeriod, Profile, RateControlMode,
8+
UsageType,
9+
},
710
formats::{RgbSliceU8, YUVBuffer},
811
};
912
use std::time::Instant;
@@ -26,9 +29,12 @@ impl OpenH264VideoEncoder {
2629
.skip_frames(false)
2730
.profile(Profile::Baseline)
2831
.complexity(Complexity::Low)
29-
.rate_control_mode(RateControlMode::Quality)
30-
.usage_type(UsageType::CameraVideoRealTime)
31-
.max_frame_rate(FrameRate::from_hz(config.fps.to_u32() as f32));
32+
.background_detection(false)
33+
.adaptive_quantization(false)
34+
.rate_control_mode(RateControlMode::Timestamp)
35+
.usage_type(UsageType::ScreenContentRealTime)
36+
.max_frame_rate(FrameRate::from_hz(config.fps.to_u32() as f32))
37+
.intra_frame_period(IntraFramePeriod::from_num_frames(config.fps.to_u32()));
3238

3339
let encoder = Encoder::with_api_config(OpenH264API::from_source(), encoder_config)
3440
.map_err(|e| {
@@ -189,7 +195,6 @@ impl VideoEncoder for OpenH264VideoEncoder {
189195
let yuv_raw = rgb_to_i420_yuv(&img.as_raw(), self.width, self.height)?;
190196
let yuv_buffer = YUVBuffer::from_vec(yuv_raw, self.width as usize, self.height as usize);
191197

192-
// FIXME: low efficiency(~50ms)
193198
let now = Instant::now();
194199
let bitstream = self.encoder.encode(&yuv_buffer).map_err(|e| {
195200
RecorderError::VideoEncodingFailed(format!("OpenH264 encoding failed: {:?}", e))

0 commit comments

Comments
 (0)