Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

A Linux/GStreamer-Based AES67 Multitrack Audio Recording Solution

Given you have an AES67 based Audio-over-IP Device or -Network and want to contiously record a given set of tracks uncompressed, then this might be for you.

AES67 Recorder GUI

On 34C3 we used tascam SSD-recorder to record all audio-tracks from all sub-groups to SSDs. this had some major drawbacks;

  • the recorder did record all 128 tracks and did not name them; so finding the ones of interest was quite hard
  • the recorder did not have NTP and their clocks were not set correctly
  • Someone had to unload the SSDs when they were full, carry them to an unloading-station, unload them and carry them back
  • The 120GB+ had do be copyied at-once every hours (whenever the SSDs were full) to the storage, spiking the network load
  • The backup files were hours long of multi-GB .wav-Files, so seeking in them (via network) was quite a challenge

On 35C3 we plan to fix these issues by capturing the Audio via AES67 and gstreamer to chunked, nicely named .wav-files, constantly syncing them to a storage-server.


For the time being, just take a look at config.yaml.


# for the main recording application
apt-get install gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-tools libgstreamer1.0-0 gir1.2-gstreamer-1.0 gir1.2-gst-plugins-base-1.0
apt-get install python3 python3-yaml python3-paho-mqtt python3-gi

# for the web-gui application
sudo apt-get install python3-socketio-client python3-flask


The recorder itself is a headless application. It publishes status information via tcp on localhost port 9999.

./ -i my-config.yaml

nc 9999

A second application connects to this status-stream and serves a Web-UI on port 9998.

./ -i my-config.yaml

The reason fo this split is, that a Web-UI with Websockets for live level-graphs does not fit nicely with the main recorder, built around GObject/GStreamer.


Error-Message from gst_element_request_pad

gst_element_request_pad: assertion 'templ != NULL' failed
WARNING: erroneous pipeline: could not link audiotestsrc0 to mux_0, mux_0 can't handle caps audio/x-raw, format=(string)S24LE, rate=(int)48000, channels=(int)1

Known Bug in GStreamer, a Problem with the splitmuxsink not able to handle simple audio-only codecy, like wavenc a Patch has been merged to master which fixes this problem. Until it landed in your Distribution, you probably need to build your own Version of GStreamer.