WebRTC - Enabling FFmpeg Dynaudnorm Instead of AGC for Audio Processing

150 views
Skip to first unread message

Manimaran K

unread,
Mar 24, 2025, 4:53:37 AMMar 24
to discuss-webrtc

Hi WebRTC Team,

I am working with WebRTC for Android, plan to use FFmpeg's dynaudnorm, instead of AGC (both AGC1 and AGC2) for audio gain process, as AGC does not sufficiently amplify quiet parts of the audio. I intend to integrate dynaudnorm directly into the WebRTC layer using FFmpeg. To achieve this, I have disabled AGC via configuration and process audio data using FFmpeg’s dynaudnorm algorithm.

I first verified dynaudnorm separately by processing audio through FFmpeg’s command-line tools, converting PCM audio data with float*, and applying dynaudnorm. The results were significantly better than AGC—quiet parts were effectively amplified, and overall loudness was more balanced.

When integrating same into WebRTC layer, 

My Implementation Details are,
  • Extracting audio from WebRTC's AudioBuffer* audio_data

  • Converting to AVFrame* frame using float* audio_data from AudioBuffer

  • Applying dynaudnorm for gain adjustment

  • Integrating FFmpeg's avfilter in WebRTC

Modifications were made for WebRTC FFmpeg Integration

#1 - Enabled avfilter in FFmpeg build by modifying:
third_party/ffmpeg/chromium/scripts/build_ffmpeg.py

configure_flags['Common'].extend([
    '--enable-avcodec',
    '--enable-avformat',
    '--enable-avfilter',  # Added this line
    '--enable-avutil',
])

#2 - Added FFmpeg avfilter sources
third_party/ffmpeg/ffmpeg_generated.gni

ffmpeg_c_sources += [
    "libavcodec/xiph.c",
    # Added Lib AVFilter files
    "libavfilter/af_volume.c", # Start
    "libavfilter/allfilters.c",
    "libavfilter/avfilter.c",
    "libavfilter/buffersrc.c",
    "libavfilter/buffersink.c",
    "libavfilter/graphparser.c",
    "libavfilter/formats.c",
    "libavfilter/graphdump.c",
    "libavfilter/af_dynaudnorm.c",
    "libavfilter/avfiltergraph.c", # End
    "libavformat/allformats.c",
]

#3 - FFmpeg Build Process
python3 chromium/scripts/build_ffmpeg.py android arm64

Successfully built FFmpeg
Now, I can see libavfilter files in:
ffmpeg/build.arm64.android/Chrome/libavfilter/

Issue Faced in WebRTC Build

gn gen out/arm64-v8a --args='is_debug=false is_component_build=false rtc_include_tests=false target_os="android" target_cpu="arm64"'

When building WebRTC after FFmpeg integration, I get this error:


third_party/ffmpeg/libavfilter/allfilters.c:617:10: fatal error: 'libavfilter/filter_list.c' file not found 617 | #include "libavfilter/filter_list.c"

However, I have verified that filter_list.c exists in the FFmpeg build files, but WebRTC does not seem to find it.

Questions:
  1. How to fix this filter_list.c missing issue in WebRTC build? Any steps missed?

  2. Are there additional changes required to integrate avfilter properly?

  3. Any alternative suggestions for implementing dynaudnorm inside WebRTC?

Any guidance or suggestions would be highly appreciated!

Thanks,
Manimaran K

Manimaran K

unread,
Apr 1, 2025, 11:59:03 AMApr 1
to discuss-webrtc
Hello, can anyone help with this? I'm still looking for insights on implementing the FFmpeg avfilter in WebRTC. Any guidance would be greatly appreciated!"

Reply all
Reply to author
Forward
0 new messages