voctomix

Voctomix

Voctomix ist ein Softwaremischer der es uns erlaubt auf Konferenzen HD-Recording und -Streaming anbieten zu können. Voctomix wird aktuell von mazdermind fürs VOC entwicklet und ist gst-switch's kleine Schwester. Sie lebt im Git unter git@c3voc.de:voctomix und Read-Only auf Github.

The Installation on VOC Machines (Encoder-Cubes and Mixer-Notebooks) is managed through Ansible. The Ansible Deployment creates the following Things on the Encoder-Cubes:

  • Source of last Release in /opt/voctomix/release
  • Config-File for Voctocore in /opt/voctomix/voctocore-config.ini
  • Scripts to source/sink/playout Video-Content into/out of the Voctocore in /opt/voctomix/scripts
  • Systemd-Units in /etc/systemd/system/*.service
  • A System-Status-Script in /usr/bin/voctomix-status

Ansible always resetd the Setup to a default configuration, where all SDI-Ports are used as Campera-INs, no Playout is active and all Supporting-Scripts are enabled. Ansible generated the following Systemd-Units for Voctomix:

Systemd-Unit Description
bgloop-source.service Source the Background-Loop from /opt/voc/share/bgloop.ts
decklink-source-[NAME].service Such a Unit is generated for each Decklink-Input-Device present at the time of the ansible-run. Source Video- and Audio from this Decklink-Input
grabber-source.service Source Video-Input from the Epiphan Framegrabber via Ethernet
grabber-to-[NAME]-playout.service Such a Unit is generated for each Decklink-Output-Device present at the time of the ansible-run. Playout Video- and Silence from the Framegrabber-Input to the Decklink-Output
grabber-to-framebuffer-playout.service Playout Video from the Framegrabber-Input to the HDMI/DVI/VGA Output on the Mainboard
music-source.service Source Music from /opt/voc/share/pause-music/ into the Pause-Loop
pause-source.service Souece Pause-Loop from /opt/voc/share/pause.ts
program-to-[NAME]-playout.service Such a Unit is generated for each Decklink-Output-Device present at the time of the ansible-run. Playout Video- and Audio from the Program-Output (=what is being recorded; before the Stream-Blanker) to the Decklink-Output
program-to-framebuffer-playout.service Playout Video from the Program-Output (=what is being recorded; before the Stream-Blanker) to the HDMI/DVI/VGA Output on the Mainboard
recording-sink.service Record the Program-Output to Segmented .ts-Files in /video
streaming-hd-sink.service Encode and Stream the Streamblanker-Output to rtmp://127.0.0.1:1935/stream/sroom_numbernativehd
streaming-sd-sink.service Encode and Stream the Streamblanker-Output to rtmp://127.0.0.1:1935/stream/sroom_numbernativesd
stream-to-[NAME]-playout.service Such a Unit is generated for each Decklink-Output-Device present at the time of the ansible-run. Playout Video- and Audio from the Stream-Output (=what is being streamed; after the Stream-Blanker) to the Decklink-Output
stream-to-framebuffer-playout.service Playout Video from the Stream-Output (=what is being streamed; after the Stream-Blanker) to the HDMI/DVI/VGA Output on the Mainboard
voctocore.service The Voctocore

All Supporting Units are WantedBy=voctocore.service as well as the request Requires=voctocore.service and After=voctocore.service. This means:

  • The Supporting Units only start up when the Core has successfully started up first
  • When enabled, the Supporting Units automatically start up when the Core is up
  • The Supporting Units go down when the Core goes down

In practice this means, that to restart the whole chain, you can do:

sudo systemctl restart voctocore.service

Similar to stop or start everything you can use

sudo systemctl stop voctocore.service

and

sudo systemctl start voctocore.service

To see which units are actually started, you can call

voctomix-status

To Reconfigure a Decklink-Duo Port as Playout, in order for it to survive a restart/reboot, you can do:

sudo systemctl disable decklink-source-decklink-sdi-2.service                                                                                                     sudo systemctl stop decklink-source-decklink-sdi-2.service                                                                                                        

sudo systemctl enable stream-to-decklink-sdi-2-playout.service                                                                                                   
sudo systemctl start stream-to-decklink-sdi-2-playout.service  

If you leave out the enable/disable the change will be temporary and restarting the voctocore-Unit or the encoder-Cube will reset the change.

Similar to enable Playout to the Framebuffer, you can do:

sudo systemctl start stream-to-framebuffer-playout.service                                                                                                        sudo systemctl enable stream-to-framebuffer-playout.service

Leaving out the enable/disable the change will also here be temporary.

Playout to the Framebuffer can always be interrupted by funny tty0 printouts at any time :) Also think about whether you want to playout the Program-Output (before the Streamblanker) or the Streaming-Output (after the Streamblanker).

Creating a background for the supersource from an image file

ffmpeg -loop 1 -i background.png -f s16le -i /dev/zero -ar 48000 -ac 1 -r 25 -t 00:01:00 -s 1920x1080 -c:v mpeg2video -q:v 0 -aspect 16:9 -f mpegts bgloop.ts

Creating a background for the supersource from a MP4 file in correct resolution

ffmpeg -i bgloop.mp4 -filter:v fps=25 -c:v mpeg2video -q:v 0 -aspect 16:9 -f mpegts bgloop.ts

To see the Output of the various Units, you can use a command like this:

journalctl -au decklink-source-decklink-sdi-2.service  

Alternative version:

journalctl -a -f -u  grabber-source.service

Some Useful Control-Commands when you only have a Shell (see also example-scripts/control-server:

echo set_audio cam1 | nc -q0 localhost 9999
echo set_audio cam2 | nc -q0 localhost 9999

echo set_composite_mode fullscreen | nc -q0 localhost 9999
echo set_composite_mode picture_in_picture | nc -q0 localhost 9999
echo set_composite_mode side_by_side_equal | nc -q0 localhost 9999
echo set_composite_mode side_by_side_preview | nc -q0 localhost 9999

echo set_stream_blank pause | nc -q0 localhost 9999
echo set_stream_live | nc -q0 localhost 9999

echo set_video_a cam1 | nc -q0 localhost 9999
echo set_video_a cam2 | nc -q0 localhost 9999
echo set_video_a grabber | nc -q0 localhost 9999

echo set_video_b cam1 | nc -q0 localhost 9999
echo set_video_b cam2 | nc -q0 localhost 9999
echo set_video_b grabber | nc -q0 localhost 9999

if you want to interact with voctocore here are some commands and the replays from the core. For more details see https://github.com/voc/voctomix/blob/voctopanel/voctocore/lib/commands.py

=> set_video_a cam1
<= video_status cam1 cam2

=> set_composite_mode fullscreen 
<= composite_mode fullscreen
<= video_status cam1 cam2

=> set_composite_mode side_by_side_equal
<= composite_mode side_by_side_equal
<= video_status cam1 cam2

=> get_config
<= server_config {"stream-blanker": {"sources": "pause,nostream", "enabled": "true"}, "DEFAULT": {}, "side-by-side-equal": {}, "fullscreen": {}, "side-by-side-preview": {}, "mix": {"sources": "cam1,cam2,grabber", "videocaps": "video/x-raw,format=I420,width=1920,height=1080,framerate=25/1,pixel-aspect-ratio=1/1", "audiocaps": "audio/x-raw,format=S16LE,channels=2,layout=interleaved,rate=48000"}, "previews": {"deinterlace": "false", "enabled": "false"}, "output-buffers": {"mix_out": "10000"}, "picture-in-picture": {}}

=> get_video
<= video_status cam1 cam2

=> get_composite_mode
<= composite_mode side_by_side_equal
  • voctomix.1478513414.txt.gz
  • Last modified: 2016/11/07 11:10
  • by derpeter