Ottieni solo la geometria H + W del mio schermo senza la successiva + x + y


9

Sto leggendo questo articolo . C'è una dichiarazione lì che dice:

ffmpeg -f alsa -ac 2 -i hw:0,0 -f x11grab -s $(xwininfo -root | grep 'geometry' | awk '{print $2;}') -r 25 -i :0.0 -sameq -f mpeg -ar 48000 -s wvga -y sample.mp4 

Quando eseguo il comando, viene visualizzato un errore nella sezione che dice:

xwininfo -root | grep 'geometry' | awk '{print $2;}' 

Il motivo è che quando si utilizza questo comando sul mio computer genera:

1360x768+0+0 

Come posso rimuovere l'ultima parte dell'output della risoluzione dello schermo 1360x768invece di 1360x768+0+0?


1
Se conosci la geometria, 1360x768, usa piuttosto una variabile
Pantera

1
Me ne rendo conto e l'ho già fatto in questo modo con successo. Ma stavo cercando di usare l'esperienza per aumentare anche la mia conoscenza di awk. :)
Guest123ABC

Ok buona fortuna. Ci sono molti tutorial eccellenti su awk su Internet.
Pantera

Risposte:


10
  • Puoi usare perlsolo per ottenere la risoluzione:

    xwininfo -root | perl -lne 's/.*geometry (\w+).*/$1/ or next; print'
    1360x768
    
  • O ancora più breve con solo GNU grep:

    xwininfo -root | grep -oP '(?<=geometry )\w+'
    1360x768
    

    Spiegazione : Il lookbehind (?<=geometry )afferma che nella posizione corrente nella stringa, ciò che precede è la "geometria" dei caratteri. Se l'asserzione ha esito positivo, il motore corrisponde al modello di risoluzione.

    Un lookbehind non "consuma" alcun carattere sulla stringa. Ciò significa che dopo la parentesi di chiusura, il motore regex viene lasciato nello stesso punto della stringa da cui ha iniziato a guardare: non si è mosso. Da quella posizione, quindi il motore può ricominciare ad abbinare i caratteri.

    Fonte: http://www.rexegg.com/regex-disambiguation.html#lookbehind


@ Guest123ABC Ho aggiornato la mia risposta con una versione più breve dell'espressione regolare
Sylvain Pineau

6

Il mio awkapproccio puro , dividendo la stringa in campi basati su spazi e segni più:

xwininfo -root | awk -F'[+| ]' '/geometry/ {print $4}'

Un metodo simile all'espressione Perl di Sylvain ma con sed:

xwininfo -root | sed -nr 's/.*geometry ([0-9x]+).*/\1/p'

5

Potresti forse usare awk substr. Nel tuo caso particolare:

xwininfo -root | awk '/geometry/ {print substr($2,1,8);}'

O se vuoi che funzioni in ogni caso:

xwininfo -root | awk '/geometry/ {print $2;}' | cut -d'+' -f1

spero che questo aiuto.


Oh si! Grazie mille! Il primo ha funzionato! :) Il secondo produce due risultati: un 1 e quindi la risoluzione che non funzionerebbe in questo caso, ma comunque una bella dichiarazione per conoscenza generale.
Guest123ABC,

2
dovresti usare la risposta di sylvain. è più bello.
Reliquia

1
Ho spostato la parte grep nel comando awk (perché non posso fare a meno). Il problema con substr è che utilizza posizionamenti fissi. Risoluzioni come 1000x1000 la romperanno perché sono troppo lunghe.
Oli

@Oli wow bella mossa. non dimenticherò quella sostituzione grep. Grazie per i suggerimenti Hai perfettamente ragione sul substr, ecco perché ho aggiunto il secondo comando.
Reliquia

2

Altri hanno già fornito risposte per l'operazione completa, ma di rispondere solo Come posso ottenere da 1360x768+0+0a 1360x768? quindi consiglierei di utilizzare cutla soluzione più semplice possibile, ad es

$ echo 1360x768+0+0 | cut -d+ -f1
1360x768
$

1

Ho anche provato esempi di acquisizione dello schermo della riga di comando alcune settimane fa. Come soluzione alternativa puoi usare

 xdpyinfo  | grep dimensions | awk -F ' ' ' { print $2 } ' 

per rilevare la risoluzione dello schermo.

Per acquisire lo schermo con audio e microfono interni, è possibile utilizzare

 avconv -f   pulse -i default -f x11grab -r 15 -s $(xdpyinfo  | grep dimensions | awk -F ' ' ' { print $2 } ' ) -i :0.0+0,0 -acodec libmp3lame -vcodec libx264  $(date +"%m%d%Y_%H%M%S_$HOSTNAME")_screencast.mp4
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.