bs2b

doc

https://ffmpeg.org/ffmpeg-filters.html#bs2b

The base of bs2b filter is Bauer stereophonic-to-binaural DSP.

bs2b is available on ffmpeg 3.x if --enable-bs2b, and the official Windows version build of ffmpeg 3.x contains it, but for some reason, it doesn’t seem to be included in 4.x of Windows version build. Since the fact that it can be used by building with --enable-bs2b does not change in 4.x, the author’s thinking of the Windows version build may have changed. (Bauer stereophonic-to-binaural DSP itself has own Windows version build, so if really want to try this and you don’t have ffmpeg 3.x, you can use that.)

BTW, I think the ffmpeg’s documentation tells multiple lies. According to the description of Bauer stereophonic-to-binaural DSP itself and its library’s header file:

  1. 700 Hz, 4.5 dB - default.

    This setting is closest to the virtual speaker placement with azimuth 30 degrees and the removal of about 3 meters, while listening by headphones.

  2. 700 Hz, 6 dB - most popular.

    This setting is close to the parameters of a Chu Moy’s [3] crossfeeder.

  3. 650 Hz, 9.5 dB - making the smallest changes in the original signal only for relaxing listening by headphones.

    This setting is close to the parameters of a crossfeeder implemented in Jan Meier’s CORDA amplifiers.

bs2b.h
/* ... */

/* Default crossfeed levels */
/* bs2b_set_level() */
#define BS2B_DEFAULT_CLEVEL  ( ( uint32_t )700 | ( ( uint32_t )45 << 16 ) )
#define BS2B_CMOY_CLEVEL     ( ( uint32_t )700 | ( ( uint32_t )60 << 16 ) )
#define BS2B_JMEIER_CLEVEL   ( ( uint32_t )650 | ( ( uint32_t )95 << 16 ) )

/* ... */

/* Sets a new coefficients by new cut frecuency value (Hz). */
void bs2b_set_level_fcut( t_bs2bdp bs2bdp, int fcut );

/* ... */

/* Sets a new coefficients by new crossfeeding level value (dB * 10). */
void bs2b_set_level_feed( t_bs2bdp bs2bdp, int feed );

So, the documentation of ffmpeg should be:

  • profile

    Pre-defined crossfeed level.

    • default

      Default level (fcut=700, feed= 45).

    • cmoy

      Chu Moy circuit (fcut=700, feed=60).

    • jmeier

      Jan Meier circuit (fcut=650, feed=95).

  • fcut

    Cut frequency (in Hz).

  • feed

    Feed level (in 10*dB).

Anyway, the purpose of this filter is to “improve headphone listening of stereo audio records”. For the rationales and implementation methods, see the documentation of Bauer stereophonic-to-binaural DSP. Usage is easy:

[me@host: ~]$ # omit params -> fcut=7000, feed=45
[me@host: ~]$ ffplay snd.wav -af bs2b
[me@host: ~]$ # use profile=cmoy -> fcut=7000, feed=60
[me@host: ~]$ ffplay snd.wav -af bs2b=profile=cmoy
[me@host: ~]$ # use profile=cmoy and set fcut explicitly
[me@host: ~]$ # -> fcut=6000, feed=60
[me@host: ~]$ ffplay snd.wav -af bs2b=profile=cmoy:fcut=6000

However, it is quite difficult to determine the effect of this with your own ears. Probably the most effective if you want to target something like a product disc that is supposed to be played on loudspeakers, but in the case of free audio that is readily available, the effect is not apparent too much (because they do not care about such serious mixing for professional-use).

The way to know “sure, this is doing something” is visualizing, after all:

[me@host: ~]$ # show differences between unmodified and
[me@host: ~]$ # bs2b (pixel-wise diff of two showfreqs)
[me@host: ~]$ ffplay -f lavfi "
> amovie=wolframtones_02.wav
> ,asplit[a1][a2];
> [a1]aformat=channel_layouts=stereo[unmo];
> [a2]bs2b,aformat=channel_layouts=stereo[fapp];
> [unmo]showfreqs=s=960x540:fscale=log,format=yuv420p[v1];
> [fapp]asplit[out1],showfreqs=s=960x540:fscale=log,format=yuv420p[v2];
> [v1][v2]
> lut2='
> abs(x-y):
> 128+(x-y):
> 128+(x-y)'
> [out0]"
see also

crossfeed, stereowiden, extrastereo

see also

Using FFMPEG on Docker