czwartek, 13 lutego 2020

Linux: szybka konwersja plików audio za pomocą lame na procesorach wielordzeniowych


Konwersja za pomocą lame dużej liczby plików trwa dosyć długo. Nie pomaga tu liczba rdzeni procesora, bo lame jest jednowątkowy. Jest to frustrujące, jeśli posiadamy procesor o 8, 16 czy nawet 24 rdzeniach. Jednak Linux od zawsze był wielowątkowy, więc nic nie stoi na przeszkodzie, aby wykorzystać moc drzemiącą w nowoczesnych CPU z użyciem prostych komend w powłoce Bash.

Wyznaczenie liczby procesorów logicznych:

cc=`grep -c ^processor /proc/cpuinfo`

wyznaczenie liczy procesów lame (oparcie o loadavg nie spełnia zadania, bo loadavg jest zbyt powolne):

#lavg=`cat /proc/loadavg|cut -d. -f1`

cl=`ps -ef|grep -c " lame "`

wstawienie opóźnienia jeśli procesów lame więcej niż rdzeni CPU:

if [ $((cc/2)) -lt $((cl+1)) ] ; then sleep 4; fi;

poniższy skrypt należy uruchamiać w katalogu z plikami mp3, tworzony jest podkatalog aa z plikami po konwersji.


#!/bin/bash



cc=`grep -c ^processor /proc/cpuinfo`



mkdir aa; for ii in *.mp3; do lame -a -V 8 --nohist "$ii" "aa/$ii" & cl=`ps -ef|grep -c " lame "` ; if [ $((cc)) -lt $((cl+1)) ] ; then sleep 4 ; fi; done

Warto poeksperymentować z wartościami sleep oraz z korektą parametrów cc i cl. Powyższe wartości sprawdzają się przy plikach audio kilka - kilkanaście MB i z procesorem Intel Xeon z 16 rdzeniami logicznymi (8 fizycznych).

Można też optymalizować dalej skrypt z użyciem wartości loadavg, żeby zapewnić dodatkowe opóźnienie przy przetwarzaniu długich plików, gdzie spowolnienie o 4 sekundy może być niewystarczające lub do zapobiegania przeciążeniu systemu przy realizacji innych obciążąjących CPU zadań.

Skrypt, po modyfikacjach, można wykorzytać do zrównoleglania innych zadań. Podane w powyższym przykładzie opcje do lame służą do konwersji dzwięku stereo na mono.


Przechwytywanie klawiatury w Linuksie

Przechwytywanie kodów klawiatury do pliku:


w sesji ssh lub w terminalu wydać polecenie:

sudo while ( true ) ; do stdbuf -oL showkey -s | stdbuf -i0 -o0 tee -a /var/spool/keys.dump; done


Jak interpretować przechwycone kody?


Najpierw (jednorazowo) zrobić tablicę translacji:

 
sudo dumpkeys |grep ^keycode|sed "s/ / /"|sed "s/ / /" |cut -d' ' -f2,4 >s2a.txt

Potem w mało optymalnej i topornej pętli wypisywać znaki (bez modyfikatorów):

for k in `cat /var/spool/keys.dump |grep 0x|sed 's/0xe0//gm'|sed 's/0x4b//gm'`; do d=`printf "%d\n" $k`;grep $d s2a.txt|cut -d' ' -f2|perl -ne 'chomp; print " " if (m/space/); print "-" if (m/Pause/);print "\n" if (m/Return/); print substr $_,1 if(m/\+/);';done;echo


Przechwytywane są wszystkie kody klawiatury pisane na konsoli graficznej.