3

The FFmpeg documentation for the afftdn audio filter says for the -sn flag:

sample_noise, sn
Start or stop measuring noise profile. Syntax for the command is : "start" or "stop" string. After measuring noise profile is stopped it will be automatically applied in filtering.

It's a little unclear as to the basic implementation of the start/stop values in the sample_noise -sn flag. I tried:

ffmpeg -i inputfile.wav -af afftdn=nt=c:bn=sn=start=0=stop=1 noiseout.wav

as an attempt to sample the first second of sound as a noise profile, which errors with

[afftdn @ 0x7fefbb800000] Custom band noise must be integer.

So the questions are:

  1. What's the correct input format for sample_noise?

  2. Is there a way to sample the noise from a noise reference .wav file that I have, e.g. noiseprofile.wav?

2 Answers 2

2

Commands are instructions sent from an interface external to the filter, usually an external program using a ZMQ protocol. There is a filter that can execute commands which is what I'll use here.

Base syntax is

ffmpeg -i in -af "asendcmd=c='0.0 afftdn@n sn start; 1.0 afftdn@n sn stop',afftdn@n" noiseout.wav

To use another source for noise profile, you'll have to append it, measure noise, and then remove it.

ffmpeg -i in -i profile -filter_complex "[1][0]concat=n=2:v=0:a=1,asendcmd=c='0.0 afftdn@n sn start; 1.0 afftdn@n sn stop',afftdn@n,atrim=1,asetpts=PTS-STARTPTS" noiseout.wav

Above, I assume the profile is 1 second long, which is removed with atrim after denoising.

0
1

This worked beautifully, many thanks to @Gyan.

Just to add to the accepted answer, as I needed to do this for a large number of mp3 audio files with similar noise profiles and with a naming scheme of 001_somefile.mp3. I wrote myself a batch script to do so. The -y confirms overwrite and the || pause causes the script to halt if the command was bad. I don't know if there's any available constants to automagically obtain the length of the noise_profile.mp3 input, so I hard-coded the 0.89 seconds length:

@echo off

for /F "usebackq delims=" %%f in (`dir /B ???_*.mp3`) do (
   ffmpeg -y -i "%%f" -i noise_sample.mp3 -filter_complex "[1][0]concat=n=2:v=0:a=1,asendcmd=c='0.0 afftdn@n sn start; 0.89 afftdn@n sn stop',afftdn@n,atrim=0.89,asetpts=PTS-STARTPTS" "0%%f" || pause
)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.