voctomix

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
voctomix [2026/07/26 21:08] – external edit 127.0.0.1voctomix [2026/07/26 22:26] (current) – old revision restored (2026/06/21 09:52) andi
Line 1: Line 1:
 # Voctomix # Voctomix
  
----- dataentry project ---- name : Voctomix project-owner : Mazdermind +---- dataentry project ---- 
-git-url_url : <https://github.com/voc/voctomixproject-description : +name : Voctomix  
-project-members : project-status\_ : running+project-owner : Mazdermind 
 +git-url_url : https://github.com/voc/voctomix 
 +project-description :  
 +project-members :  
 +project-status_ : running 
 +----
  
-------------------------------------------------------------------------+<WRAP center round alert 80%> 
 +This wiki page contains documentation about the first release of voctomix (version 1.x). The current second version is documented at https://voc.github.io/voctomix/ 
 +</WRAP>
  
-\<WRAP center round alert 80%\> This wiki page contains documentation 
-about the first release of voctomix (version 1.x). The current second 
-version is documented at <https://voc.github.io/voctomix/> \</WRAP\> 
  
-Voctomix ist ein Softwaremischer der es uns erlaubt auf Konferenzen +Voctomix ist ein Softwaremischer der es uns erlaubt auf Konferenzen HD-Recording und -Streaming anbieten zu können.  Voctomix wird aktuell von [[people:Mazdermind]fürs VOC entwickelt und ist [[https://github.com/timvideos/gst-switch|gst-switch]]'s kleine Schwester. Sie lebt im [[intern:git|Git]] unter git@c3voc.de:voctomix und read-only [[https://github.com/voc/voctomix|auf Github]].
-HD-Recording und -Streaming anbieten zu können. Voctomix wird aktuell +
-von [people:Mazdermind](people:Mazdermind) fürs VOC entwickelt und ist +
-[gst-switch](https://github.com/timvideos/gst-switch)'s kleine +
-Schwester. Sie lebt im [Git](intern:gitunter git@c3voc.de:voctomix und +
-read-only [auf Github](https://github.com/voc/voctomix).+
  
-\- + - [[https://media.ccc.de/v/froscon2016-1696-voctomix|Voctomix Lecture at FROSCON12]] by Mazdermind 
-[Voctomix Lecture at FROSCON12](https://media.ccc.de/v/froscon2016-1696-voctomix+ - [[http://slides.com/mazdermind/froscon12-voctomix|slides]]
-by Mazdermind - +
-[slides](http://slides.com/mazdermind/froscon12-voctomix)+
  
-## Resources +### Resources 
- +<WRAP group> 
-\<WRAP group\\<WRAP half column\>+<WRAP half column>
  
 **Documentation** **Documentation**
 +  * [[https://github.com/voc/voctomix/blob/master/README.md|Installation]]
 +  * [[https://github.com/voc/voctomix/blob/master/README_DOCKER.md|"Installation" mit Docker]]
 +  * [[https://github.com/voc/voctomix/blob/master/voctocore/README.md|Voctocore, Protokoll und Ports]]
 +  * [[https://github.com/voc/voctomix/blob/master/voctogui/README.md|Voctogui]]
 +  * [[software:voctomix-hardware-examples]]
  
-- [Installation](https://github.com/voc/voctomix/blob/master/README.md) +</WRAP> 
-- ["Installation" mit Docker](https://github.com/voc/voctomix/blob/master/README_DOCKER.md) +<WRAP half column> 
-- [Voctocore, Protokoll und Ports](https://github.com/voc/voctomix/blob/master/voctocore/README.md) +**Subprojects** 
-- [Voctogui](https://github.com/voc/voctomix/blob/master/voctogui/README.md) +  * [[projects:tallycom]] 
-- [software:voctomix-hardware-examples](software:voctomix-hardware-examples) +  * [[voctomix:voctopanel]] 
- +  * [[voctomix:voctomidi]]
-\</WRAP\\<WRAP half column\> **Subprojects** +
- +
-[projects:tallycom](projects:tallycom) +
-[voctomix:voctopanel](voctomix:voctopanel) +
-[voctomix:voctomidi](voctomix:voctomidi)+
  
 ** related projects** ** related projects**
 +  * [[https://github.com/crossan007/PiCamFleetMapper | PiCamFleetMapper]]
 +  * [[https://github.com/CarlFK/voctomix-outcasts | vocotmix-outcasts]]
  
-- [ PiCamFleetMapper](https://github.com/crossan007/PiCamFleetMapper ) 
-- [ vocotmix-outcasts](https://github.com/CarlFK/voctomix-outcasts ) 
  
-\</WRAP\\</WRAP\>+</WRAP> 
 +</WRAP>
  
-## Installation on VOC hardware+### Installation on VOC hardware 
 +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''
  
-The installation on VOC machines (encoder cubes and mixer notebooks) is +Ansible always resets the setup to a default configuration, where all SDI-ports are used as camera INs, no playout is active and all supporting scripts are enabled. Ansible generated the following Systemd units for Voctomix: 
-managed through [Ansible](Ansible). The Ansible deployment creates the +^ Systemd-Unit ^ Description ^ 
-following things on the encoder-cubes:+| music-source.service | Source Music from ''/opt/voc/share/pause-music/'' into the pause loop | 
 +| pause-source.service | Source 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-blankerto 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 stream-blanker output to <code>rtmp://127.0.0.1:1935/stream/s{{ room_number }}_native_hd</code>
 +| streaming-sd-sink.service | Encode and stream the stream-blanker output to <code>rtmp://127.0.0.1:1935/stream/s{{ room_number }}_native_sd</code>
 +| 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 |
  
-- Source of last release in ''/opt/voctomix/release'' +All supporting units are ''WantedBy=voctocore.service'' as well as the request ''Requires=voctocore.service'' and ''After=voctocore.service''.
-- 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 resets the setup to a default configuration, where all +
-SDI-ports are used as camera INs, no playout is active and all +
-supporting scripts are enabled. Ansible generated the following Systemd +
-units for Voctomix: ^ Systemd-Unit ^ Description ^ +
- +
-|                                        |                                                                                                                                                                                                                               | +
-|----------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +
-| music-source.service                   | Source Music from ''/opt/voc/share/pause-music/'' into the pause loop                                                                                                                                                         | +
-| pause-source.service                   | Source 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 stream-blanker output to \<code\><rtmp://127.0.0.1:1935/stream/s>![]( room_number )\_native_hd\</code\>                                                                                                 | +
-| streaming-sd-sink.service              | Encode and stream the stream-blanker output to \<code\><rtmp://127.0.0.1:1935/stream/s>![]( room_number )\_native_sd\</code\>                                                                                                 | +
-| 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: 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
  
-- 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 
- 
-## Practical tips 
  
 +### Practical tips
 In practice this means, that to restart the whole chain, you can do: In practice this means, that to restart the whole chain, you can do:
-\<code\> sudo systemctl restart voctocore.service \</code\>+<code> 
 +sudo systemctl restart voctocore.service 
 +</code>
  
-Stop recording at night and schedule re-start in the morning: \<code\+Stop recording at night and schedule re-start in the morning: 
-for i in 1 2 3 4 5 6 41 42; do echo "10.73.\${i}.3"; ssh 10.73.\${i}.3 +<code> 
-'sudo systemctl stop recording-sink.service'; done for i in 1 2 3 4 5 6 +for i in 1 2 3 4 5 6 41 42; do echo "10.73.${i}.3"; ssh 10.73.${i}.3 'sudo systemctl stop recording-sink.service'; done 
-41 42; do echo "10.73.\${i}.3"; ssh 10.73.\${i}.3 'echo "sudo systemctl +for i in 1 2 3 4 5 6 41 42; do echo "10.73.${i}.3"; ssh 10.73.${i}.3 'echo "sudo systemctl restart voctocore.service" | at 09:00'; done 
-restart voctocore.service" \| at 09:00'; done \</code\>+</code>
  
-Similar to stop or start everything you can use \<code\> sudo systemctl +Similar to stop or start everything you can use 
-stop voctocore.service \</code\> and \<code\> sudo systemctl start +<code> 
-voctocore.service \</code\>+sudo systemctl stop voctocore.service 
 +</code> 
 +and 
 +<code> 
 +sudo systemctl start voctocore.service 
 +</code>
  
-To see which units are actually started, you can call \<code\+To see which units are actually started, you can call 
-voctomix-status \</code\>+<code> 
 +voctomix-status 
 +</code>
  
-To Reconfigure a Decklink-Duo Port as Playout, in order for it to +To Reconfigure a Decklink-Duo Port as Playout, in order for it to survive a restart/reboot, you can do: 
-survive a restart/reboot, you can do: \<code\> sudo systemctl disable +<code> 
-decklink-source-decklink-sdi-2.service sudo systemctl stop +sudo systemctl disable decklink-source-decklink-sdi-2.service                                                                                                     sudo systemctl stop decklink-source-decklink-sdi-2.service                                                                                                        
-decklink-source-decklink-sdi-2.service+
  
-sudo systemctl enable stream-to-decklink-sdi-2-playout.service sudo +sudo systemctl enable stream-to-decklink-sdi-2-playout.service                                                                                                    
-systemctl start stream-to-decklink-sdi-2-playout.service \</code\>+sudo systemctl start stream-to-decklink-sdi-2-playout.service   
 +</code>
  
-If you leave out the enable/disable the change will be temporary and +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.
-restarting the voctocore unit or the encoder cube will reset the change.+
  
-Similar to enable playout to the Framebuffer, you can do: \<code\sudo +Similar to enable playout to the Framebuffer, you can do: 
-systemctl start stream-to-framebuffer-playout.service sudo systemctl +<code> 
-enable stream-to-framebuffer-playout.service \</code\>+sudo systemctl start stream-to-framebuffer-playout.service                                                                                                        sudo systemctl enable stream-to-framebuffer-playout.service 
 +</code>
  
 Leaving out the enable/disable the change will also here be temporary. Leaving out the enable/disable the change will also here be temporary.
  
-Playout to the framebuffer can always be interrupted by funny tty0 +Playout to the framebuffer can always be interrupted by funny tty0 printouts at any time :) 
-printouts at any time :) Also think about whether you want to playout +Also think about whether you want to playout the program output (before the stream-blanker) or the streaming output (after the stream-blanker).
-the program output (before the stream-blanker) or the streaming output +
-(after the stream-blanker).+
  
-## Debugging 
  
 +### Debugging
 To see the output of the various units, you can use a command like this: To see the output of the various units, you can use a command like this:
-\<code\> journalctl -au decklink-source-decklink-sdi-2.service \</code\>+<code> 
 +journalctl -au decklink-source-decklink-sdi-2.service   
 +</code>
  
-Alternative version: journalctl -a -f -u grabber-source.service+Alternative version: 
 +  journalctl -a -f -u  grabber-source.service
  
-## Control Commands 
  
-Some useful control commands when you only have a shell (see also +### Control Commands 
-[example-scripts/control-server](https://github.com/voc/voctomix/tree/master/example-scripts/control-server)+Some useful control commands when you only have a shell (see also [[https://github.com/voc/voctomix/tree/master/example-scripts/control-server|example-scripts/control-server]]
-For more details see +For more details see https://github.com/voc/voctomix/blob/voctopanel/voctocore/lib/commands.py 
-<https://github.com/voc/voctomix/blob/voctopanel/voctocore/lib/commands.py> +<code> 
-\<code\> echo set_audio cam1 \| nc -q0 localhost 9999 echo set_audio +echo set_audio cam1 | nc -q0 localhost 9999 
-cam2 \| nc -q0 localhost 9999+echo set_audio cam2 | nc -q0 localhost 9999
  
-echo set_composite_mode fullscreen \| nc -q0 localhost 9999 echo +echo set_composite_mode fullscreen | nc -q0 localhost 9999 
-set_composite_mode picture_in_picture \| nc -q0 localhost 9999 echo +echo set_composite_mode picture_in_picture | nc -q0 localhost 9999 
-set_composite_mode side_by_side_equal \| nc -q0 localhost 9999 echo +echo set_composite_mode side_by_side_equal | nc -q0 localhost 9999 
-set_composite_mode side_by_side_preview \| 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 +echo set_stream_blank pause | nc -q0 localhost 9999 
-set_stream_live \| 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 \| +echo set_video_a cam1 | nc -q0 localhost 9999 
-nc -q0 localhost 9999 echo set_video_a grabber \| 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 \| +echo set_video_b cam1 | nc -q0 localhost 9999 
-nc -q0 localhost 9999 echo set_video_b grabber \| nc -q0 localhost 9999 +echo set_video_b cam2 | nc -q0 localhost 9999 
-\</code\>+echo set_video_b grabber | nc -q0 localhost 9999 
 +</code>
  
 here you can see the commands together with replays from the core here you can see the commands together with replays from the core
  
-\<code\+<code> 
- +=> set_video_a cam1 
-# \> set_video_a cam1 +<= video_status cam1 cam2
- +
-\<= 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+=set_composite_mode fullscreen  
 +<= composite_mode fullscreen 
 +<= video_status cam1 cam2
  
-\<= video_status cam1 cam2+=> set_composite_mode side_by_side_equal 
 +<= composite_mode side_by_side_equal 
 +<= video_status cam1 cam2
  
-# \get_composite_mode+=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": {}}
  
-\<composite_mode side_by_side_equal \</code\>+=> get_video 
 +<= video_status cam1 cam2
  
 +=> get_composite_mode
 +<= composite_mode side_by_side_equal
 +</code>
  • voctomix.1785100105.txt.gz
  • Last modified: 2026/07/26 21:08
  • by 127.0.0.1