On Mon, 21 Mar 2022 at 09:36, Romain Beauxis <romain.beau...@gmail.com>
wrote:
I'm making the assumption that metadata mostly matters for audio streams
where they may hold track title/artist/album etc.
>>>>
> Curiously, the metadata sometimes flicks into life, but most of the time
my player reports "Unknown".

> Do you have a script I could use to try & reproduce this?

Thanks for asking Romain,

By adding my own metadata handler, the problem went away. The metadata
handler was called before any crossfade.

But on testing the script at the end of this email, which uses crossfade
before an FFmpeg filter for audio processing, the metadata stays the same
as the first track in the stream, no matter how many more tracks are
crossfaded afterwards.

Incidentally, when putting an FFmpeg filter into the stream, do I still
need to change from stream to raw, thus, and back again afterwards with
ffmpeg.raw.decode.audio(s)?

s = ffmpeg.raw.encode.audio(%ffmpeg(%audio.raw), s)
...

with best wishes,
John

#!/usr/local/bin/liquidsoap

set("log.level", 5)
settings.server.telnet.set(true)
settings.server.telnet.bind_addr.set("0.0.0.0")
settings.server.telnet.port.set(1235)
settings.server.timeout.set(-1.0)
settings.request.metadata_decoders.set(["FFMPEG"])
settings.decoder.decoders.set(["FFMPEG"])
settings.decoder.file_extensions.wav.set([])
settings.decoder.file_extensions.taglib.set([])
settings.decoder.file_extensions.id3v2.set([])
settings.decoder.file_extensions.ffmpeg.set(["mka"])
settings.frame.audio.samplerate.set(48000)

def audio_process(s) =
  def mkfilter(graph) =
    s = ffmpeg.filter.audio.input(graph, pass_metadata=true, s)
    s = ffmpeg.filter.dynaudnorm(graph, s, gausssize=23, correctdc=true,
altboundary=true, maxgain=80., b=true, targetrms=1.)
    s = ffmpeg.filter.aresample(graph, s, sample_rate=192000)
    s = ffmpeg.filter.alimiter(graph, s, limit=0.95, attack=3.,
release=50., asc=true, asc_level=1.)
    s = ffmpeg.filter.aresample(graph, s, sample_rate=48000)
    ffmpeg.filter.audio.output(graph, pass_metadata=true, s)
  end
  ffmpeg.filter.create(mkfilter)
end

def audio_process_wrap(s) =
  a = ffmpeg.raw.encode.audio(%ffmpeg(%audio.raw), s)
  a = audio_process(a)
  ffmpeg.raw.decode.audio(a)
end

def audio_process_multi(s) =
  def mkfilter_multi(graph) =
    s = ffmpeg.filter.audio.input(graph, pass_metadata=true, s)
    s = ffmpeg.filter.dynaudnorm(graph, s, gausssize=7, correctdc=true,
altboundary=true, maxgain=80., b=true, targetrms=1.)
    s = ffmpeg.filter.volume(graph, s, volume="-18dB", precision=2,
replaygain=0)
    s = ffmpeg.filter.aexciter(graph, s, freq=6000.)
    s = ffmpeg.filter.mcompand(graph, s, args="0.005,0.1 6
-47/-37,-34/-34,-17/-33 90 | 0.003,0.05 6 -47/-40,-34/-34,-17/-33 180 |
0.003,0.05 6 -47/-40,-34/-34,-17/-33 360 | 0.000625,0.03 6
-47/-40,-34/-34,-17/-33 1600 | 0.000625,0.03 6 -47/-40,-34/-34,-17/-33 2800
| 0.0001,0.025 6 -47/-35,-34/-34,-17/-33 5000 | 0,0.025 6
-47/-35,-34/-34,-17/-33 8192 | 0,0.025 6 -47/-40,-34/-34,-17/-33 23999")
    s = ffmpeg.filter.volume(graph, s, volume="+20dB", precision=2,
replaygain=0)
    s = ffmpeg.filter.aresample(graph, s, sample_rate=192000)
    s = ffmpeg.filter.alimiter(graph, s, limit=0.8, attack=3., release=50.,
asc=false, asc_level=0., level=true)
    s = ffmpeg.filter.aresample(graph, s, sample_rate=48000)
    ffmpeg.filter.audio.output(graph, pass_metadata=true, s)
  end
  ffmpeg.filter.create(mkfilter_multi)
end

def audio_process_multi_wrap(s) =
  a = ffmpeg.raw.encode.audio(%ffmpeg(%audio.raw), buffer(s))
  a = audio_process_multi(a)
  ffmpeg.raw.decode.audio(a)
end

security = single("/home/john/src/radio/fault.mka")

# Here's the playlist, annotated as per our Python pre-production program
dictates
myplaylist = playlist(reload_mode="watch",
mime_type="application/x-mpegURL",
"/home/john/src/radio/bc2-30DEC2020-complete.m3u8")

# Cut off any silent starts
myplaylist = cue_cut(myplaylist)

# Amplify each track according to our own EBU R.128 volume data
myplaylist = amplify(override="liq_amplify", 1.0, myplaylist)

# Add the news
myplaylist = fallback(track_sensitive=true, transition_length=30.0,
[request.queue(id="override"), myplaylist])

# Do the crossfades
myplaylist = crossfade(duration=30.0, smart=false, fade_out=0.0,
fade_in=0.0, minimum=-1.0, default=(fun(a,b)->add(normalize=false,([b,
a]))), conservative=true,  myplaylist)

radio = fallback(track_sensitive=false, [audio_process_wrap(myplaylist),
security])
radio_comp = fallback(track_sensitive=false,
[audio_process_multi_wrap(myplaylist), security])

output.icecast(icy_metadata="true", description="Music Too (hifi)",
genre="Freeform", name="Music Too", host="127.0.0.1", port=8001,
mount="audio-hifi.aac", public=true, url="
http://warblefly.sytes.net:8001/audio-hifi.aac";, timeout=240.0,
format="audio/aac", password="[REDACTED]", %fdkaac(channels=2,
samplerate=48000, bandwidth="auto", vbr=5, afterburner=true,
aot="mpeg2_aac_lc"), radio)

output.icecast(icy_metadata="true", description="Music Too (compressed)",
genre="Freeform", name="Music Too", host="127.0.0.1", port=8001,
mount="audio-comp.aac", public=true, url="
http://warblefly.sytes.net:8001/audio-comp.aac";, timeout=240.0,
format="audio/aac", password="[REDACTED]", %fdkaac(channels=2,
samplerate=48000, bandwidth="auto", vbr=5, afterburner=true,
aot="mpeg2_aac_lc"), radio_comp)

output.icecast(icy_metadata="true", description="Music Too (comp, low bw)",
genre="Freeform", name="Music Too", host="127.0.0.1", port=8001,
mount="audio.aac", public=true, url="
http://warblefly.sytes.net:8001/audio.aac";, timeout=240.0,
format="audio/aac", password="REDACTED", %fdkaac(channels=2,
samplerate=32000, bandwidth="auto", vbr=1, afterburner=true,
aot="mpeg4_he_aac_v2"), radio_comp)
_______________________________________________
Savonet-users mailing list
Savonet-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/savonet-users

Reply via email to