Archives for posts with tag: Script

Sometimes in meeting software screen sharing is needed but broken on linux somehow (thank you chrome) or you have to pay for it (slack …). This is, where sharing your screen by virtual WebCam comes in handy. You can do this via the video4linux loopback device. This will create a dummy camera device, that you can feed by ffmpeg grabbing your screen.

This might only work with kernel versions later then 6.8, at least this did not work on a Ubuntu with a kernel that old. You’ll need to install and enable v4l2loopback, install the linux-headers to if you haven’t done so, jet:

$ sudo apt install v4l2loobback-dkms linux-headers

Check your current video devices with ls -lha /dev/video* then load the module.

$ sudo modprobe v4l2loopback devices=1 max_buffers=2 exclusive_caps=1 card_label=VirtualCam

Check again which new device appeared, there should be a new one.

Make sure your user belongs to the group video. Add it by $ usermod -aG video $ME (log off and on!).

Now you can use ffmpeg to feed your screen into your virtual camera device:

$ ffmpeg -f x11grab -r 15 -s 1280×720 -i :0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video2

-r is the frame rate, -s the screens resolution, -i the screen shared. On my setup /dev/video2 is the virtual camera device, seen as VirtualCam in any WebCam software.

In complex display setups it is possible to share just part of the whole screen. In my case I’d like to share only my laptops native display. To get that part I ask xrandr for the current configuration.

$ xrandr
Screen 0: minimum 320 x 200, current 4320 x 1920, maximum 16384 x 16384
eDP-1 connected primary 1920×1080+2400+840 (normal left inverted right x axis y axis) 309mm x 174mm
1920×1080 60.05*+ 60.01 59.97 59.96 59.93 48.04
1680×1050 59.95 59.88
1400×1050 59.98
1600×900 59.99 59.94 59.95 59.82
1280×1024 60.02
1400×900 59.96 59.88
1280×960 60.00
1440×810 60.00 59.97
1368×768 59.88 59.85
1280×800 59.99 59.97 59.81 59.91
1280×720 60.00 59.99 59.86 59.74
1024×768 60.04 60.00
960×720 60.00
928×696 60.05
896×672 60.01
1024×576 59.95 59.96 59.90 59.82
960×600 59.93 60.00
960×540 59.96 59.99 59.63 59.82
800×600 60.00 60.32 56.25
840×525 60.01 59.88
864×486 59.92 59.57
700×525 59.98
800×450 59.95 59.82
640×512 60.02
700×450 59.96 59.88
640×480 60.00 59.94
720×405 59.51 58.99
684×384 59.88 59.85
640×400 59.88 59.98
640×360 59.86 59.83 59.84 59.32
512×384 60.00
512×288 60.00 59.92
480×270 59.63 59.82
400×300 60.32 56.34
432×243 59.92 59.57
320×240 60.05
360×202 59.51 59.13
320×180 59.84 59.32
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
DP-1-1 disconnected (normal left inverted right x axis y axis)
DP-1-2 connected 1200×1920+0+0 left (normal left inverted right x axis y axis) 518mm x 324mm
1920×1200 59.95*+
1920×1080 60.00 50.00 59.94 30.00 25.00 24.00 29.97 23.98
1600×1200 60.00
1280×1024 75.02 60.02
1152×864 75.00
1280×720 60.00 50.00 59.94
1024×768 75.03 60.00
800×600 75.00 60.32
720×576 50.00
720×480 60.00 59.94
640×480 75.00 60.00 59.94
720×400 70.08
DP-1-3 connected 1200×1920+1200+0 right (normal left inverted right x axis y axis) 518mm x 324mm
1920×1200 59.95*+
1920×1080 60.00 50.00 59.94 30.00 25.00 24.00 29.97 23.98
1600×1200 60.00
1280×1024 75.02 60.02
1152×864 75.00
1280×720 60.00 50.00 59.94

On my whole Screen 0, made of 3 displays (4320 x 1920), this is eDP-1, sitting at the coordinates 2400,840. I have to change the -i option to -i:0.0+2400,840 and the resolution of the video to -s 1920x1080.

The complete ffmpeg line is:

$ ffmpeg -f x11grab -r 15 -s 1920×1080 -i :0.0+2400,840 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video2

Now your virtual webcam should stream the screens content.

(swg>

Nachdem ich gestern den anderen Miix 320 repariert habe, ist mir aufgefallen, dass das Script fürs automatische Drehen des Bildschirms gar nicht im Blog ist. Gnome kann das unter Linux inzwischen zwar selbst, auf dem kleinen Lenovo nehm‘ ich aber doch lieber XFCE – da muss man das selber nachrüsten.

Beim Miix ist die Orientierung des Displays unter Xorg per Default im Hochformat mit den Knöpfen oben. Fürs korrekte Querformat müsste man den Bildschirm nach rechts drehen: xrandr -o right

Das soll natürlich auch beim Loginbildschirm schon alles richtig sein. Ich verwende auf meinem Miix 320 als Displaymanager lightdm. In der lightdm-Konfiguration legt man ein Startscript fest: In /etc/lightdm/lightdm.conf.d/ legen wir mit erhöhten Rechten eine Datei namens 80-display-setup.conf an:

[SeatDefault]
greeter-setup-script=/etc/lightdm/greeter_setup.sh

Dieses bash-script muss ebenfalls mit erhöhten Rechten angelegt und folgendermaßen befüllt werden:

#!/bin/bash
# Loginscreen auf querformat
xrandr -o right
xinput set-prop „FTSC1000:00 2808:1015“ „Coordinate Transformation Matrix“ 0 1 0 -1 0 1 0 0 1

Ausführbar gemacht chmod u+x /etc/lightdm/greeter_setup.sh erscheint der Login korrekt gedreht. Die xinput-Zeile sorgt dafür, dass der Touchscreen mit gedreht wird.

Jetzt stimmt zwar die Bildschirmausrichtung erstmal, von selber drehen tut sich aber nichts, das funktioniert nur unter Gnome von alleine. Ich verwende allerdings XFCE: beheben wir das mal! Ich bin nicht der erste mit dem Problem und einen guten Ansatz findet man bei Julien auf github, der das schonmal für sein Yoga gebastelt hat, und auch beim LinuxAppFinder.

Meine Variante besteht aus drei Scripten: einem zum Aktivieren der Dreherei, eines das die Dreherei selbst ausführt und einem zum Abschalten des Bildschirm drehens. Sinn ist, wie bei jedem Tablet ScreenRotate per Knöpfchen schalten zu können.

Das Script fürs eigentliche Bildschirmdrehen benötig das iio-sensor-proxy Package. Unter Ubuntu ist das mit sudo apt install iio-sensor-proxy schnell nachinstalliert.

Hier der Code vom Script autorotate.sh

#!/bin/bash
# Sensor pipe to get output from monitor-sensor
sensorpipe=/tmp/pivotsensor
# if pipe doesn’t exist, create it
if [[ ! -p $sensorpipe ]]; then
/usr/bin/mkfifo $sensorpipe
fi
/usr/bin/logger „autorotate started“
/usr/bin/monitor-sensor >> $sensorpipe 2>&1 &
monisenspid=$!
# Parse output or monitor sensor to get the new orientation whenever a line appaers in sensorpipe
# Possible are: normal, bottom-up, right-up, left-up, quit. Light data will be ignored
while true; do
if read line<$sensorpipe; then #echo $line # Read the last line that was added to the pipe and get the orientation ORIENTATION=$(/usr/bin/echo $line | /usr/bin/grep 'orientation' | /usr/bin/grep -oE '[^ ]+$') case "$ORIENTATION" in # Set the actions to be taken for each possible orientation normal) /usr/bin/xrandr -o normal /usr/bin/xinput set-prop "FTSC1000:00 2808:1015" "Coordinate Transformation Matrix" 1 0 0 0 1 0 0 0 1 ;; bottom-up) /usr/bin/xrandr -o inverted /usr/bin/xinput set-prop "FTSC1000:00 2808:1015" "Coordinate Transformation Matrix" -1 0 1 0 -1 1 0 0 1 ;; right-up) /usr/bin/xrandr -o right /usr/bin/xinput set-prop "FTSC1000:00 2808:1015" "Coordinate Transformation Matrix" 0 1 0 -1 0 1 0 0 1 ;; left-up) /usr/bin/xrandr -o left /usr/bin/xinput set-prop "FTSC1000:00 2808:1015" "Coordinate Transformation Matrix" 0 -1 1 1 0 0 0 0 1 ;; quit) # if you send "orientation quit" to the pipe, the script exits break ;; esac fi done /usr/bin/rm -f $sensorpipe /usr/bin/kill $monisenspid /usr/bin/logger "autorotate ended" exit 0

Das Script kümmert sich auch um das Drehen des Touchscreens, sodass das Tablet auch bedienbar bleibt. Jedes Mal, wenn der Sensor eine Drehung registriert, schreibt monitor-sensor die neue Orientierung des Displays in die pipe. Das read line liest die Zeile und das case führt die entsprechende Aktion aus. Ein orientation quit beendet das Script und die Bildschirm-Dreherei.

Ein Script für das Einschalten der Dreherei brauchen wir noch, das ist übersichtlich:

#!/bin/bash
~/.bin/autorotate.sh &

Wie ihr seht, gibt es in meinem home-Verzeichnis einen versteckten bin-ordner, der meine kleinen Helferlein beherbergt.
Kaum länger fällt das stop-script aus:

#!/bin/bash
# Sensor pipe to get output from monitor-sensor
sensorpipe=/tmp/pivotsensor
# if the pipe doesn’t exist the autorotate script does not run
if [[ ! -p $sensorpipe ]]; then
echo „$sensorpipe: no such pipe“
exit 0
fi
/usr/bin/logger „stopping autorotate“
/usr/bin/echo „orientation quit“ > $sensorpipe
exit 0

Herunterladen könnt ihr die drei auch einfach:

Alle drei Scripte müssen ausführbar sein! Das startautorotate.sh lasse ich beim login von XFCE starten – das lässt sich über „Sitzung und Startverhalten“ einstellen. Ansonsten kann man sich in eine beliebige Leiste die entsprechenden Symbole mit den hinterlegten Scripten nageln und das AutoRotate manuell ein- und ausschalten.

(swg)

Mein Miix 320 lässt sich herrlich als Tablet verwenden! Ich nehme es im Bus zum Lesen – Bücher, c’t, heise+, News. Für letztere brauch man Internet (sic!). Klar, das Miix  320 hat ein integriertes LTE-Modem. Leider zeigt sich auch hier ein Problem, dass ich schon auf meinem eee PC hatte: Wenn der Rechner aus dem S3 erwacht, funktioniert ab und an das Modem nicht. Das Ab- und wieder Anschalten im Networkmanager bringt nix, es bleibt dabei, er kriegt keine Verbindung. Im journal findet man dann endlos sowas:

Nov 27 21:48:34 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (registering -> home)
Nov 27 21:48:34 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (home -> idle)
Nov 27 21:48:35 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (idle -> registering)
Nov 27 21:48:35 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (registering -> home)
Nov 27 21:48:35 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (home -> idle)
Nov 27 21:48:36 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (idle -> registering)
Nov 27 21:48:36 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (registering -> home)
Nov 27 21:48:36 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (home -> idle)
Nov 27 21:48:37 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (idle -> registering)
Nov 27 21:48:37 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (registering -> home)
Nov 27 21:48:37 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (home -> idle)
Nov 27 21:48:38 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/24: 3GPP Registration state changed (idle -> registering)

Netz kriegt man aber nicht, irgendwann gibt der Networkmanager auf. Wahrscheinlich hat sich das Modem in irgendeiner Form aufgehängt. Bei einem internen Modem am USB ist rausziehen und wieder reinstecken irgendwie keine Option. Was macht man dann? Neustart des ganzen Rechners? Nicht sehr elegant. Eigentlich muss es doch möglich sein, einen Reset des USB-Gerätes zu erzwingen. Und das geht tatsächlich! Die Antwort habe ich auf askubuntu.com gefunden.

Man muss herausfinden, wo genau am USB das Modem hängt:

root@progress:/# lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/7p, 480M
|__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 4: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 4: Dev 4, If 1, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 3: Dev 3, If 0, Class=Wireless, Driver=btusb, 12M
|__ Port 3: Dev 3, If 1, Class=Wireless, Driver=btusb, 12M
|__ Port 4: Dev 5, If 1, Class=CDC Data, Driver=cdc_mbim, 480M
|__ Port 4: Dev 5, If 0, Class=Communications, Driver=cdc_mbim, 480M

Mein Modem hängt an Bus 01, Port 4. Jetzt werfen wir das Modem aus:

root@progress:/# echo ‚1-4‘ > /sys/bus/usb/drivers/usb/unbind
1-4

1-4 ist das Echo auf der Console. Anschließend hängen wir es wieder ein

root@progress:/# echo ‚1-4‘ > /sys/bus/usb/drivers/usb/bind
1-4

Voilà, Modem wieder da und ich darf Internet. journalctl:

Nov 27 22:55:16 progress kernel: cdc_mbim 1-4:1.0: cdc-wdm1: USB WDM device
Nov 27 22:55:16 progress kernel: cdc_mbim 1-4:1.0 wwan0: register ‚cdc_mbim‘ at usb-0000:00:14.0-4, CDC MBIM, ce:f3:11:c8:59:ea
Nov 27 22:55:16 progress systemd-udevd[24550]: Using default interface naming scheme ‚v240‘.
Nov 27 22:55:16 progress systemd-udevd[24550]: link_config: autonegotiation is unset or enabled, the speed and duplex are not writable.
Nov 27 22:55:16 progress kernel: cdc_mbim 1-4:1.0 wwp0s20u4: renamed from wwan0
Nov 27 22:55:16 progress mtp-probe[24559]: checking bus 1, device 5: „/sys/devices/pci0000:00/0000:00:14.0/usb1/1-4“
Nov 27 22:55:16 progress mtp-probe[24559]: bus: 1, device: 5 was not an MTP device
Nov 27 22:55:16 progress systemd-udevd[24545]: Using default interface naming scheme ‚v240‘.
Nov 27 22:55:18 progress ModemManager[638]: opening device…
Nov 27 22:55:18 progress ModemManager[638]: [/dev/cdc-wdm1] Read max control message size from descriptors file: 512
Nov 27 22:55:18 progress ModemManager[638]: [/dev/cdc-wdm1] channel destroyed
Nov 27 22:55:18 progress ModemManager[638]: [device /sys/devices/pci0000:00/0000:00:14.0/usb1/1-4] creating modem with plugin ‚Fibocom‘ and ‚2‘ ports
Nov 27 22:55:18 progress ModemManager[638]: Modem for device ‚/sys/devices/pci0000:00/0000:00:14.0/usb1/1-4‘ successfully created
Nov 27 22:55:18 progress ModemManager[638]: opening device…

Nov 27 22:55:29 progress NetworkManager[651]: [1574891729.3901] modem[„cdc-wdm1“]: modem state changed, ‚disabled‘ –> ‚enabling‘ (reason: user preference)
Nov 27 22:55:29 progress ModemManager[638]: Modem: state changed (unknown -> disabled)
Nov 27 22:55:29 progress NetworkManager[651]: [1574891729.3915] manager: (cdc-wdm1): new Broadband device (/org/freedesktop/NetworkManager/Devices/30)
Nov 27 22:55:29 progress NetworkManager[651]: [1574891729.3951] device (cdc-wdm1): state change: unmanaged -> unavailable (reason ‚managed‘, sys-iface-state: ‚external‘)
Nov 27 22:55:29 progress NetworkManager[651]: [1574891729.3984] device (cdc-wdm1): modem state ‚enabling‘
Nov 27 22:55:39 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/26: state changed (enabling -> enabled)
Nov 27 22:55:39 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/26: 3GPP Registration state changed (unknown -> registering)
Nov 27 22:55:39 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/26: 3GPP Registration state changed (registering -> home)
Nov 27 22:55:39 progress ModemManager[638]: Modem /org/freedesktop/ModemManager1/Modem/26: state changed (enabled -> registered)
Nov 27 22:55:39 progress NetworkManager[651]: [1574891739.6730] modem[„cdc-wdm1“]: modem state changed, ‚enabling‘ –> ‚enabled‘ (reason: user-requested)
Nov 27 22:55:39 progress NetworkManager[651]: [1574891739.6749] modem[„cdc-wdm1“]: modem state changed, ‚enabled‘ –> ‚registered‘ (reason: unknown)

Damit ist das Modem auch wieder aus dem Networkmanager heraus benutzbar.

Die beiden Zeilen packen wir mit einem kurzen sleep in ein bashscript

#!/bin/bash
echo ‚1-4‘ > /sys/bus/usb/drivers/usb/unbind
sleep 3
echo ‚1-4‘ > /sys/bus/usb/drivers/usb/bind

Damit ich es immer erreiche, hab ich mir einen Link mit gksu ins Startmenü Whiskermenü gelegt.

Update:

Suspend/Wakeup script

Natürlich ist mir das Aufrufen des Scripts zum Reaktivieren des Modems sehr schnell auf die Nerven gegangen. Viel komfortabler ist es doch, einfach das Modem vorm Suspend abzuschalten und beim Aufwachen es wieder einzubinden. Sowas geht unter Ubuntu ganz einfach mit systemd. Natürlich habe ich nicht erst manpages dazu gewälzt: googlen brachte Just another Linux geek ans Licht. Man muss offenbar nichts weiter tun, als ein Script an die richtige Stelle zu legen. Für Ubuntu ist die Stelle /usr/lib/systemd/system-sleep/, systemd führt einfach alles darin aus, wenn das System in den Sleep geschickt oder aufgeweckt wird. Dabei übergibt systemd „pre“ vorm Suspend und „post“ beim Aufwachen.

Mein Script heißt network und muss natürlich ausführbar gemacht werden: chmod a+x ./network. Drin steht folgendes:

#!/bin/bash
## Dieses scrip sorgt beim suspend für
## – korrektes abschalten/einschalten des Modems
if [ „${1}“ == „pre“ ]; then
# vorm suspend
/usr/bin/logger „turning off wwan radio“
/usr/bin/nmcli radio wwan off
echo ‚1-4‘ > /sys/bus/usb/drivers/usb/unbind
elif [ „${1}“ == „post“ ]; then
# nach dem suspend (aufwachen)
/usr/bin/logger „turning on wwan radio“
echo ‚1-4‘ > /sys/bus/usb/drivers/usb/bind
/usr/bin/nmcli radio wwan on
fi

Den nmcli habe ich noch dazu angestellt, damit der Networkmanager das Modem nicht einfach unterm Hintern weggeschossen bekommt. Yay! Mehr Komfort unter Linux!
(swg)

Wer so durch mein Blog klickt, und im Speziellen auf Bilder, wird festgestellt haben, dass die großen Versionen der Bilder direkt verlinkt sind. Klickt man drauf, bekommt man das nackte Bild. Zum Beitrag geht es nur mit dem „Browser zurück“. Ich kenne eigentlich keine Seite, die das heute noch so macht. Alle benutzen irgendeine Art lightbox. Mit etwas unfreiwilliger (aber nicht gänzlich frei verwendbarer) Freizeit geschlagen, habe ich mich des Themas gerade angenommen.

Woher nehmen?

Eine erste Idee war, nicht haufenweise Javascript dazu zu tun, sondern eher was leichtgewichtiges, nur in CSS, zu benutzen. Ich denke nicht, dass ich hier irgendwas selber klöppeln sollte – die Weiten des Internets bieten viele Lösungen. Mal abgesehen davon, dass die beiden getesteten Pure-CSS-Lösungen nicht funktionierten, hätten sie einen zweiten Nachteil gehabt: Es wären immer alle Bilder beider Art (Thumbnail und groß) direkt mit der Seite geladen worden. Verschwendung. Vor allem von Bandbreite auf mobilen Endgeräten.

FancyBox 3

Am Ende bin ich doch bei Javascript und FancyBox3 hängen geblieben. Nicht, weil es was ganz herausragend Besonderes gegenüber allen anderen Lightboxes wäre: Nein, es gab einfach eine Gute Anleitung™ von Paal Joachim Romdahl bei easywebdesigntutorials.com. Und auch die FancyBox-Seite hilft sehr gut weiter. Ok, besonders ist es in der Hinsicht, dass es sich in meinen Beiträgen direkt verwenden lässt. Ich muss nicht erst irgendwelche Galerien irgendwo im Blog anlegen. Es genügt in die bisherigen Bilderlinks noch ein Attribut einzufügen – das krieg‘ ich sicher auch automatisiert für alle alten Beiträge hin.

modern times!

Wie das immer so ist bei guten Anleitungen und anwenderorientierter Software: Die Recherche hat länger gedauert als die Integration. Ich hätte das Plugin für WordPress nehmen können, hab‘ den Kram aber lieber direkt ins aktuelle Theme geschraubt.

Als erster Beirag profitiert davon Straßenbahnmuseum Prag. Mal sehen, wie schnell ich alte Beiträge nachziehen kann. Außerdem muss ich dann noch meinen IMG-Helpr aktualisieren.

(swg)

PHP Code Snippets Powered By : XYZScripts.com