Forward Traktor output to Shoutcast / Icecast using Transcoder on MacOS

0

I'm trying to forward my local icecast stream to an external icecast / shoutcast stream. Traktor only supports icecast, so the recommended setup is streaming to a local icecast server and the using a Stream Transcoder to forward the music to the destination where people are listening to it.

Setting up the local icecast server was the easy part

brew install icecast

and then just configuring it.

One suggested solution instead of using a Transcoder is to use something like BUTT or LadioCast to stream all audio on a certain audio channel. I tried these as a last resort out of desperation - BUTT I get it to connect and stream, but (no pun intended) can't open the stream in the browser to listen, it just shows 404. LadioCast on the other hand streams, the stream opens, but I'm only hearing silence even if I'm selecting all 4 my soundcards. Besides these solutions not working, they are not exactly what I'm looking for since any other alert output on the computer will be broadcasted as well.

Liquidsoap was the recommended solution in one article.

brew tap drfill/liquidsoap
brew install liquidsoap --with-all

Error: Calling Hardware.is_64_bit? is disabled! Use Hardware::CPU.is_64_bit? instead. /usr/local/Homebrew/Library/Taps/drfill/homebrew-liquidsoap/Formula/liquidsoap.rb:66:in `mp3?' Please report this to the drfill/liquidsoap tap! Or, even better, submit a PR to fix it!

brew install liquidsoap

==> Installing liquidsoap from drfill/liquidsoap
==> Installing dependencies for drfill/liquidsoap/liquidsoap: objective-caml, ocaml, ocaml-syslog, ocaml-dtools, ocaml-pcre, ocaml-duppy, ocaml-camomile, libmagic, ocaml-magic, ocaml-easy-format, ocaml-biniou, ocaml-cppo, ocaml-yojson, ocaml-ogg, ocaml-vorbis, libzip, ocaml-gd4o, ocaml-mm
==> Installing drfill/liquidsoap/liquidsoap dependency: objective-caml
==> Downloading https://homebrew.bintray.com/bottles/ocaml-4.06.1.high_sierra.bottle.tar.gz
Already downloaded: /Users/vlad/Library/Caches/Homebrew/ocaml-4.06.1.high_sierra.bottle.tar.gz
==> Pouring ocaml-4.06.1.high_sierra.bottle.tar.gz
  /usr/local/Cellar/ocaml/4.06.1: 1,989 files, 225.8MB

Once it's done, there's no liquidsoap anywhere, let's retry ...

brew install liquidsoap
==> Installing liquidsoap from drfill/liquidsoap
==> Installing dependencies for drfill/liquidsoap/liquidsoap: ocaml-syslog, ocaml-dtools, ocaml-pcre, ocaml-duppy, ocaml-camomile, libmagic, ocaml-magic, ocaml-easy-format, ocaml-biniou, ocaml-cppo, ocaml-yojson, ocaml-ogg, ocaml-vorbis, libzip, ocaml-gd4o, ocaml-mm
==> Installing drfill/liquidsoap/liquidsoap dependency: ocaml-syslog
==> Downloading http://ftp.de.debian.org/debian/pool/main/s/syslog-ocaml/syslog-ocaml_1.4.orig.tar.gz
Already downloaded: /Users/vlad/Library/Caches/Homebrew/ocaml-syslog-1.4.tar.gz
Warning: Calling ENV.j1 is deprecated!
Use ENV.deparallelize instead.
/usr/local/Homebrew/Library/Taps/drfill/homebrew-liquidsoap/Formula/ocaml-syslog.rb:13:in `install'
Please report this to the drfill/liquidsoap tap!

==> make
Last 15 lines from /Users/vlad/Library/Logs/Homebrew/ocaml-syslog/01.make:

make

making ._bcdi/syslog.di from syslog.mli
making ._d/syslog.d from syslog.ml
ocamlfind ocamlc -package unix -c syslog.mli
ocamlfind ocamlc -package unix -c syslog.ml
File "syslog.ml", line 47, characters 8-24:
Warning 3: deprecated: String.lowercase
Use String.lowercase_ascii instead.
File "syslog.ml", line 196, characters 50-53:
Error: This expression has type bytes but an expression was expected of type
         string
make[1]: *** [syslog.cmo] Error 2
make: *** [byte-code-library] Error 2

If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):
https://github.com/drfill/homebrew-liquidsoap/issues

Going to github, somebody already reported the issue with the following response: https://github.com/drfill/homebrew-liquidsoap/issues/32

Am currently have no time and interest to support this tap. Sorry! If You know how to deal with this, PR the fix.

Another option has in install on macOS, see #26

So now opam is required to do this:

brew install opam
opam install liquidsoap

opam complains about my ocaml version being 4.06.1 instead of < 4.06.0 a manual downgrade of the ocaml version and more things just bomb out. So I've logged a bug here for that: https://github.com/savonet/liquidsoap/issues/538

So liquidsoap doesn't work on MacOS at the moment

Somebody suggested using Nicecast, their homepage literally says the following: https://rogueamoeba.com/nicecast/

On February 28th, 2018, Nicecast was retired from active development. Nicecast will be supported through the end of 2018, but we no longer have plans for any further updates.

Existing customers can continue to use Nicecast on supported systems, but unfortunately, we expect that changes in future MacOS updates will render Nicecast wholly incompatible. As such, you should be cautious about updating any production environments.

Longer term, we encourage users to find alternate solutions for broadcasting. We're also considering future solutions to help users broadcast to more modern streaming options. We hope to have more to discuss in the future.

So nicecast is dead as well.

Using Loopback (https://rogueamoeba.com/loopback/) which creates a virtual sound card, I can tell BUTT to broadcast the virtual soundcard (which works brilliantly), but I can't find a way to tell Traktor to split the main and monitor output. As a result, when I'm busy premixing and listening to the second deck, that gets played over the virtual soundcard as well which means it gets broadcasted as well.

Any other suggestions for broadcasting my icecast stream to an external shoutcast server ? I seem to have found many half-working solutions, none of them working 100%.

Jan Vladimir Mostert

Posted 2018-03-26T18:08:33.907

Reputation: 153

Answers

0

Ok, after more digging, I found an insanely complex solution, but it works!

First things first, let's setup a virtual soundcard first using Loopback ...

(Loopback is not free and cost about the same as Traktor Pro does, but at least it works)

enter image description here

If you want to play your output through a set of large speakers as well, you would add some routing rules here to route the audio to your external speakers as well under monitor audio through, but for now, only make sure it's ticked and leave it exactly as in the screenshot.

Next, we're going to create an Aggregate Soundcard, something which I didn't even know was possible on MacOS! Under Utilities, select the Audio MIDI Setup ...

enter image description here

enter image description here

This will bring up a list of Audio Devices. Click the + bottom left and select Create Aggregate Device. Double click on the name and rename it to something more useful.

enter image description here

Make sure to select your headphone output as well as the Loopback Audio which we setup earlier in Loopback.

Next, in Traktor, make sure to change your audio output to the new aggregate soundcard that we called Traktor Output

enter image description here

Under output routing is where the magic is going to happen! Since we added two soundcards under the Aggregate Soundcard, those outputs can now be selected individually under Output Monitor and Output Master

enter image description here

Next we're going to make use of butt to pickup the audio from the Loopback Soundcard and broadcast it.

enter image description here

enter image description here

So to sum up, Traktor is outputting audio via an Aggregate Soundcard which contains a headphones output as well as a virtual soundcard provided by Loopback. butt is then used to pickup the sound from the virtual soundcard and broadcast it to shoutcast or icecast streams. All stream switching will then be happening directly inside butt.

Finally, your tunes can now be picked up on the stream, hopefully there's an easier solution some day that doesn't require 2 additional pieces of software.

enter image description here

Jan Vladimir Mostert

Posted 2018-03-26T18:08:33.907

Reputation: 153