From 35b84d219f8c06c714e0ab9f7e645253b3ea408d Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 2 Apr 2024 14:10:36 +0200 Subject: [PATCH] webrtc: webrtcsink: set perfect-timestamp=true on audio encoders Chrome audio decoder doesn't cope well with not perfect ts, generating noises in the audio. Part-of: --- Cargo.lock | 2 ++ net/webrtc/Cargo.toml | 1 + net/webrtc/README.md | 2 +- net/webrtc/src/webrtcsink/imp.rs | 6 ++++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 99236951..b4cbd654 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2930,6 +2930,7 @@ dependencies = [ "gst-plugin-webrtc-signalling-protocol", "gstreamer", "gstreamer-app", + "gstreamer-audio", "gstreamer-base", "gstreamer-rtp", "gstreamer-sdp", @@ -3071,6 +3072,7 @@ dependencies = [ "gstreamer-base", "libc", "once_cell", + "serde", "smallvec", ] diff --git a/net/webrtc/Cargo.toml b/net/webrtc/Cargo.toml index 9fc73b64..c5ef0379 100644 --- a/net/webrtc/Cargo.toml +++ b/net/webrtc/Cargo.toml @@ -11,6 +11,7 @@ rust-version.workspace = true [dependencies] gst = { workspace = true, features = ["v1_20", "serde"] } gst-app = { workspace = true, features = ["v1_20"] } +gst-audio = { workspace = true, features = ["v1_20", "serde"] } gst-video = { workspace = true, features = ["v1_20", "serde"] } gst-webrtc = { workspace = true, features = ["v1_20"] } gst-sdp = { workspace = true, features = ["v1_20"] } diff --git a/net/webrtc/README.md b/net/webrtc/README.md index 175f0808..bc3179d8 100644 --- a/net/webrtc/README.md +++ b/net/webrtc/README.md @@ -319,7 +319,7 @@ b. In the second tab start the `simple-whip-client` as shown in the below comman ``` shell ./whip-client --url http://127.0.0.1:8190/whip/endpoint \ - -A "audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay pt=100 ssrc=1 ! queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload=100" \ + -A "audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc perfect-timestamp=true ! rtpopuspay pt=100 ssrc=1 ! queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload=100" \ -V "videotestsrc is-live=true pattern=ball ! videoconvert ! queue ! vp8enc deadline=1 ! rtpvp8pay pt=96 ssrc=2 ! queue ! application/x-rtp,media=video,encoding-name=VP8,payload=96" \ -S stun://stun.l.google.com:19302 \ -l 7 \ diff --git a/net/webrtc/src/webrtcsink/imp.rs b/net/webrtc/src/webrtcsink/imp.rs index cac00ede..15c2e8cb 100644 --- a/net/webrtc/src/webrtcsink/imp.rs +++ b/net/webrtc/src/webrtcsink/imp.rs @@ -693,6 +693,12 @@ fn add_nv4l2enc_force_keyunit_workaround(enc: &gst::Element) { /// Default configuration for known encoders, can be disabled /// by returning True from an encoder-setup handler. fn configure_encoder(enc: &gst::Element, start_bitrate: u32) { + let audio_encoder = enc.is::(); + if audio_encoder { + // Chrome audio decoder expects perfect timestamps + enc.set_property("perfect-timestamp", true); + } + if let Some(factory) = enc.factory() { match factory.name().as_str() { "vp8enc" | "vp9enc" => {