Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | |||
| voctomix [2026/07/26 21:08] – external edit 127.0.0.1 | voctomix [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:// | + | name : Voctomix |
| - | project-members : project-status\_ | + | project-owner : Mazdermind |
| + | git-url_url : https:// | ||
| + | project-description : | ||
| + | project-members : | ||
| + | project-status_ | ||
| + | ---- | ||
| - | ------------------------------------------------------------------------ | + | <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:// | ||
| + | </ | ||
| - | \<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 < | ||
| - | 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. |
| - | HD-Recording und -Streaming anbieten zu können. Voctomix wird aktuell | + | |
| - | von [people: | + | |
| - | [gst-switch](https:// | + | |
| - | Schwester. Sie lebt im [Git](intern:git) unter git@c3voc.de: | + | |
| - | read-only [auf Github](https:// | + | |
| - | \- | + | - [[https:// |
| - | [Voctomix Lecture at FROSCON12](https:// | + | - [[http:// |
| - | by Mazdermind | + | |
| - | [slides](http:// | + | |
| - | ## Resources | + | ### Resources |
| - | + | <WRAP group> | |
| - | \<WRAP group\> \<WRAP half column\> | + | <WRAP half column> |
| **Documentation** | **Documentation** | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[software: | ||
| - | - [Installation](https:// | + | </ |
| - | - [" | + | <WRAP half column> |
| - | - [Voctocore, Protokoll und Ports](https:// | + | **Subprojects** |
| - | - [Voctogui](https:// | + | * [[projects: |
| - | - [software: | + | * [[voctomix: |
| - | + | * [[voctomix: | |
| - | \</WRAP\> \<WRAP half column\> **Subprojects** | + | |
| - | + | ||
| - | - [projects: | + | |
| - | - [voctomix: | + | |
| - | - [voctomix: | + | |
| ** related projects** | ** related projects** | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| - | - [ PiCamFleetMapper](https:// | ||
| - | - [ vocotmix-outcasts](https:// | ||
| - | \</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 ''/ | ||
| + | * Config file for voctocore in ''/ | ||
| + | * Scripts to source/ | ||
| + | * Systemd units in ''/ | ||
| + | * A system status script in ''/ | ||
| - | The installation on VOC machines (encoder cubes and mixer notebooks) | + | Ansible always resets the setup to a default configuration, |
| - | managed through | + | ^ Systemd-Unit ^ Description ^ |
| - | following things | + | | music-source.service | Source Music from ''/ |
| + | | pause-source.service | Source pause loop from ''/ | ||
| + | | 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 | ||
| + | | program-to-framebuffer-playout.service | Playout video from the program output (=what is being recorded; before the stream-blanker) to the HDMI/ | ||
| + | | recording-sink.service | Record the program output to segmented .ts-files in ''/ | ||
| + | | streaming-hd-sink.service | Encode and stream the stream-blanker output to < | ||
| + | | streaming-sd-sink.service | Encode and stream the stream-blanker output to < | ||
| + | | 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/ | ||
| + | | voctocore.service | The Voctocore | | ||
| - | - Source of last release in ''/ | + | All supporting units are '' |
| - | - Config file for voctocore in ''/ | + | |
| - | - Scripts to source/ | + | |
| - | voctocore in ''/ | + | |
| - | - Systemd units in ''/ | + | |
| - | - A system status script in ''/ | + | |
| - | + | ||
| - | Ansible always resets the setup to a default configuration, | + | |
| - | 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 | + | |
| - | | pause-source.service | + | |
| - | | program-to-\[NAME\]-playout.service | + | |
| - | | program-to-framebuffer-playout.service | Playout video from the program output (=what is being recorded; before the stream-blanker) to the HDMI/ | + | |
| - | | recording-sink.service | + | |
| - | | streaming-hd-sink.service | + | |
| - | | streaming-sd-sink.service | + | |
| - | | stream-to-\[NAME\]-playout.service | + | |
| - | | stream-to-framebuffer-playout.service | + | |
| - | | voctocore.service | + | |
| - | + | ||
| - | All supporting units are '' | + | |
| - | request '' | + | |
| 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 | + | < |
| + | sudo systemctl restart voctocore.service | ||
| + | </ | ||
| - | Stop recording at night and schedule re-start in the morning: | + | Stop recording at night and schedule re-start in the morning: |
| - | for i in 1 2 3 4 5 6 41 42; do echo " | + | < |
| - | 'sudo systemctl stop recording-sink.service'; | + | for i in 1 2 3 4 5 6 41 42; do echo " |
| - | 41 42; do echo " | + | for i in 1 2 3 4 5 6 41 42; do echo " |
| - | restart voctocore.service" | + | </ |
| - | Similar to stop or start everything you can use \<code\> sudo systemctl | + | Similar to stop or start everything you can use |
| - | stop voctocore.service | + | < |
| - | voctocore.service | + | sudo systemctl stop voctocore.service |
| + | </ | ||
| + | and | ||
| + | < | ||
| + | sudo systemctl start voctocore.service | ||
| + | </ | ||
| - | To see which units are actually started, you can call \<code\> | + | To see which units are actually started, you can call |
| - | voctomix-status | + | < |
| + | voctomix-status | ||
| + | </ | ||
| - | 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/ |
| - | survive a restart/ | + | < |
| - | decklink-source-decklink-sdi-2.service sudo systemctl stop | + | sudo systemctl disable decklink-source-decklink-sdi-2.service |
| - | decklink-source-decklink-sdi-2.service | + | |
| - | sudo systemctl enable stream-to-decklink-sdi-2-playout.service | + | sudo systemctl enable stream-to-decklink-sdi-2-playout.service |
| - | systemctl start stream-to-decklink-sdi-2-playout.service | + | sudo systemctl start stream-to-decklink-sdi-2-playout.service |
| + | </ | ||
| - | If you leave out the enable/ | + | If you leave out the enable/ |
| - | restarting the voctocore unit or the encoder cube will reset the change. | + | |
| - | Similar to enable playout to the Framebuffer, | + | Similar to enable playout to the Framebuffer, |
| - | systemctl start stream-to-framebuffer-playout.service sudo systemctl | + | < |
| - | enable stream-to-framebuffer-playout.service | + | sudo systemctl start stream-to-framebuffer-playout.service |
| + | </ | ||
| Leaving out the enable/ | Leaving out the enable/ | ||
| - | 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 | + | < |
| + | journalctl -au decklink-source-decklink-sdi-2.service | ||
| + | </ | ||
| - | Alternative version: journalctl -a -f -u grabber-source.service | + | Alternative version: |
| + | | ||
| - | ## Control Commands | ||
| - | Some useful control commands when you only have a shell (see also | + | ### Control Commands |
| - | [example-scripts/ | + | Some useful control commands when you only have a shell (see also [[https:// |
| - | For more details see | + | For more details see https:// |
| - | <https:// | + | < |
| - | \<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 | + | echo set_composite_mode fullscreen | nc -q0 localhost 9999 |
| - | set_composite_mode picture_in_picture | + | echo set_composite_mode picture_in_picture | nc -q0 localhost 9999 |
| - | set_composite_mode side_by_side_equal | + | echo set_composite_mode side_by_side_equal | nc -q0 localhost 9999 |
| - | set_composite_mode side_by_side_preview | + | 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 | + | 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 | + | 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 | + | echo set_video_b cam2 | nc -q0 localhost 9999 |
| - | \</code\> | + | echo set_video_b grabber | nc -q0 localhost 9999 |
| + | </ | ||
| 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\> | + | < |
| - | + | => 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 {" | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | # \> 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 {" | ||
| - | \<= composite_mode side_by_side_equal \</code\> | + | => get_video |
| + | <= video_status cam1 cam2 | ||
| + | => get_composite_mode | ||
| + | <= composite_mode side_by_side_equal | ||
| + | </ | ||