Screencast compatible amb JACK

De wikijoan
Salta a la navegació Salta a la cerca

Tips per gravar videos de l'escriptori. Utilitzar Xephyr

El recordmydesktop és compatible amb JACK (però ha d'estar compilat per a JACK, veure més avall!!), de manera que es pot gravar la sortida, per exemple, del fluidsynth. Una manera de veure-ho funcionant és al video (de Jeremy-Autostatic)

De totes maneres, el Jeremy creu (setembre 2010) que és millor utilitzar ffmpeg en comptes de recordmydesktop per a fer videos del Youtube:

This tutorial explains how to use the Sirlab Vocoder LADSPA plugin in Qtractor.

MIDI USB keyboard: M-Audio Oxygen 8 v2
Softsynth: Yoshimi 0.058.1 (ZynAddSubFX fork) with the Pulse Pad 3 instrument patch
DAW: Qtractor
Vocoder: Vocoder LADSPA plugin from
Screencast: Xephyr (nested X-server), FFmpeg 0.6svn (video) and jack_capture 0.9.56 (audio)
Video editor: OpenShot 1.1.3
Distro: Ubuntu 9.10 Karmic Koala

The video quality is improved as promised, it seems that FFmpeg is the way to go when screencasting.

It's about using the Sirlab Vocoder LADSPA plugin in Qtractor. I ditched 
recordMyDesktop in favor of ffmpeg with jack_capture within a nested 
Xephyr session with a 1280x720 resolution (apparently YouTube likes this 
best). The quality improved drastically

El Jeremy ho ha documentat:

Hello Frank,

I've created a Wiki page on the toolchain I use:



Leigh Dyer ha fet un videotutorial sobre el seq24 seguint les recomanacions del Jeremy.

> Hi Leigh,
> > I've just posted a video tutorial for seq24 -- it discusses what seq24
> > is, and what it isn't, and then proceeds to demonstrate the basics of
> > building and playing patterns. If you've tried it in the past and been
> > confused by its somewhat unique interface, hopefully this will get you
> > past that initial confusion. The direct Youtube link is here:
> >
> >
> Wow, that is finally one really nice tutorial video - very well done!
> I like the quality of video and sound, the speed, the "entertaining bits" -
> everything really!

Thanks! I've answered your questions below:

> May I ask a few short questions about creation of this tutorial (I tried
> to write them so that a simple yes/no suffices in most cases ;-):
> - What toolchain did you use? Was it the Xephyr/jack_capture/ffmpeg
>   package that others (AutoStatic?) had mentioned here or in other places?

Yep, I used AutoStatic's Xephyr and ffmpeg setup for capturing the
video. For the audio, I recorded straight in to Ardour -- that let me
record the synths I used in to separate tracks so I could adjust the
voice and music levels after recording.

> - What frame rate did you choose for video - 15fps?

I had ffmpeg set to 30 FPS -- I can't say for sure that it captured at
that rate all the way through, but I was definitely happy with the

> - I assume you first write out to disk mostly uncompressed video at the
>   highest possible quality and then do a re-encoding to your selected target
>   video format offline afterwards?

I used ffmpeg's default MPEG-4 compression, but with a very high maximum
bitrate -- that gave me high quality, a manageable (large, but not too
large) file size, and relatively low CPU usage. Here's the command I

ffmpeg -an -f x11grab -s 1280x720 -r 30 -i :2.0 -vb 10000000 tute1.avi

> - Did you experience any audio/video out-of-sync problems which you had to
>   compensate for by e.g. time-stretching the video?

Nope, the audio I exported from Ardour lined up perfectly with the video
from ffmpeg. To make it easier to line them up in Kdenlive during the
edit, I started the video by hitting the "send test note" button in
XSynth; I was then able to line up the button press in the video track
with the sound of the note being played by XSynth in the audio track.

> - Since your voice comes over pretty clear, I assume you did not do live
>   voice recording, but rather overdubbed it afterwards by "watching and
>   commenting" your own video?

For the intro, I recorded the voice independently, and then lined up the
images and slides, and the little "apt-cache search" video, with that --
I made use of Kdenlive's video speed features here to speed through the
footage of the seq24 package installing.

For the rest of the video (the actual screencast), I did just record the
audio and video together in one take -- I had my mic set up so I could
talk in to it comfortably while working. If you listen closely, I'm sure
there are a few mouse or key click sounds in there as evidence of
that :)

If the screencast sounds rehearsed, that's because it kinda was -- I
actually recorded a very similar tutorial screencast a week earlier.
Once I decided to add the intro, though, I scrapped that video and
re-recorded it.


Dies més tard es continua discutint sobre el tema. Mirar el fil:

Discussió a hispasonic sobre recordmydesktop (solució!!)

Molt interessant les aportacions sobre aquest tema tan important:

recordmydesktop --use-jack funcionant

NOTA: veure més avall recordmydesktop --use-jack funcionant Com es comenta, recordmydesktop per defecte no està compilat per tal que funcioni amb jack. Per tal d'arreglar-ho:

sudo add-apt-repository ppa:autostatic/ppa
sudo apt-get update
sudo apt-get install recordmydesktop

I ara sí que funciona:

$ recordmydesktop --fps 15 --use-jack system:capture_1 system:capture_2
$ recordmydesktop -x 300 -y 300 --width 480 --height 272 --fps 15 --use-jack system:capture_1 system:capture_2

Evidentment recordmydesktop té diferents opcions.

script jack_capture (veu) + ffmpeg (video)


DATE=`date +%Y%m%d`
TIME=`date +%Hh%M`
# Start screencast
//$ echo $DISPLAY -> per saber quin és el teu valor de DISPLAY. És el valor que es fica en el paràmetre -i
xterm -geometry 80x10+0+1000 -e jack_capture -c 2 -p system:capture* -b 24 $HOME/screencast_audio_$DATE-$TIME.wav &
ffmpeg -an -f x11grab -r 30 -s 1280x720 -i :1.0 -vcodec libx264 -vpre lossless_ultrafast -threads 4 $HOME/screencast_video_$DATE-$TIME.mkv

per aturar-ho tot: (o bé fer Ctrl-C)

$ killall ffmpeg jack_capture


  • és necessari gravar amb format mkv. Amb ogv no em funciona, suposo que per la llibreria libx264
  • tal com es proposa en el post (-e jack_capture -b 24) no acaba de funcionar jack_capture, no puc connectar manualment system:capature amb el jack_capture. Però si ho fico en línia de comandes sí que funciona.

ffmpeg amb JACK (funciona!). Octubre 2013

Compilació de ffmpeg aplicant un patch



He de descarregar el codi font de ffmpeg.

En principi seria:

$ git clone git:// ffmpeg

però el problema està en què així sempre seria la última versió, i el patch que aplico i que explica en l'enllaç funciona en una versió concreta.

$ patch -p1 < ./patch
patching file libavdevice/jack_audio.c
patching file libavdevice/x11grab.c
Hunk #1 FAILED at 493.
Hunk #2 succeeded at 562 (offset 19 lines).
1 out of 2 hunks FAILED -- saving rejects to file libavdevice/x11grab.c.rej

Com es veu, falla l'aplicació del patch.

Nota sobre versions. Agafo les versions antigues de:

  • la versió 0.8.15 falla, no ha aplicat bé el canvis en el patch, per tant no és la versió correcta
  • d'altres versions també fallen.

Finalment, agafo la versió ffmpeg-N-53284-gd0a34ae-src que trobo a


~/ffmpeg-N-53284-gd0a34ae-src$ patch -p1 < ./patch
patching file libavdevice/jack_audio.c
patching file libavdevice/x11grab.c
Hunk #1 succeeded at 492 (offset -1 lines).
Hunk #2 succeeded at 541 (offset -1 lines).

i ara sí que s'apliquen els patchs correctament

Ara he de compilar. Es pot configurar amb diverses opcions:

$ ./configure --enable-libmp3lame --enable-libopenjpeg --enable-libpulse --enable-libvorbis --enable-libx264 --enable-libxvid --enable-gpl --disable-yasm --enable-x11grab

però la idea és que cadascuna d'aquestes opcions requerirà les llibreries corresponents.

La llibreria més important que em faltava:

$ sudo apt-get install libx11-dev
$ sudo apt-get install libxext-dev
$ sudo apt-get install x11proto-xext-dev
$ sudo apt-get install libxfixes-dev

És important mirar el fitxer config.log al final de tot per veure el resultat del configure. Si tot ha anat bé, el fitxer config.mak s'ha hagut de crear amb la data actual.

COMPTE!: El que es crea no és el fitxer Makefile, sinó que el fitxer Makefile conté un include del fitxer config.mak que s'acaba de crear.

En el procés de configure em va donant diferents errors (mirar config.log) que em dóna pistes de les llibreries que falten:

ERROR: libmp3lame >= 3.98.3 not found
$ sudo apt-get install libmp3lame0-dev
ERROR: libopenjpeg not found
$ sudo apt-get install libopenjpeg-dev
ERROR: libpulse-simple not found
$ sudo apt-get install libpulse-dev
$ sudo apt-get install libvorbis-dev
$ sudo apt-get install libx264-dev
ERROR: libxvid not found
sudo apt-get install libxvidcore-dev

Finalement es crea el fitxer config.mak, i ara ja puc compilar, que triga una estona:

$ make

Puc instal.lar-ho, o senzillament no cal però aleshores recordar d'invocar ffmpeg des del directori de compilació:

$ cd ~/ffmpeg-N-53284-gd0a34ae-src
$ ./ffmpeg

Ús de Xephyr (opcional)

Per al tema que m'ocupa, utilitzar Xephyr o no és opcional. La idea d'utilitzar Xephyr és que puc utilitzar un altre escriptori diferent del 0:0, i des d'aquest executar la comanda ffmpeg per gravar l'escriptori 0:0. D'aquesta manera puc gravar només aquelles finestres que m'interesse, és a dir, en la gravació no hi ha la finestra on s'executa la comanda ffmpeg. A part d'això, no veig la utilitat d'utilitzar Xephyr.

$ sudo apt-get install xserver-xephyr
$ echo $DISPLAY

El meu display per defecte és el 0:0

Arrenco Xephyr

$ Xephyr -ac -screen 1280x1024 -br -reset -terminate 2> /dev/null :1 &

Les opcions signifiquen:

    The ":1" = your display (displays are numbered starting with 0)
    -ac = disable access control restrictions= allow you to forward X
    -screen 1280x1024 = screen size
    -br = black background
    -reset -terminate= Xephyr should automatically close when the last X client is killed, does not always work.
    2> /dev/null redirects error messages.

Per tancar la sessió de Xephyr:

$ ps aux | grep xephyr
$ sudo kill 2742

Ara que tinc el servidor Xephyr (amb display 1:0) corrent en una finestra, li puc redirigir comandes. Per fer-ho he d'establir aquest valor com a display per defecte:

$ DISPLAY=:1.0
$ xterm

com a conseqüència, m'apareixerà el xterm en el Xephyr.

Screencast amb ffmpeg

Ara ja puc fer screencasts amb el JACK.

Abans d'arrencar la comanda, arrenco el JACK i preparo fonts de so que utilitzin JACK. 2 exemples:

  • jack-keyboard + yoshimi (o fluidsynth), i estableiso les connexions corresponents.
  • video del Youtube (que és pulseaudio), però utilitzant el JACK SINK (i configurant en les preferències d'audio que la sortida sigui pel JACK SINK).

Executo la comanda, que és difícil d'interpretar perquè hi ha molts arguments. La idea és que hi ha arguments que fan referència a video, i d'altres que fan referència a àudio:

$ ./ffmpeg -fflags +genpts+igndts -f x11grab -vsync 0 -r 30 -s 800x600 -i ${DISPLAY}+0,0 -vcodec h264 -f jack -ac 2 -r:a 48000 -i screencast -acodec pcm_s16le -r:v 30 -vsync 2 -async 1 -map 0:0,1,0 -map 1:0 -preset ultrafast -qp 0 output.mkv

La idea (crec), és que tot el que va darrera de -f x11grab fa referència a les opcions de video (per exemple el DISPLAY), i tot el que va darrera de -f jack són les opcions d'audio, que és el que interessa.

Important és adonar-se que amb l'opció -i screencast estic creant en el JACK un nou port d'audio d'entrada, i per tant hauré de connectar el yoshimi a aquest port (a més a més de system:output).

Aquest és realment el truco. A partir d'aquí es pot jugar amb diferents opcions per aconseguir el tamany adequant, un offset X-Y (per ex, ${DISPLAY}+100,150), una bona resolució (l'extensió .mkv dóna bona resolució).

./ffmpeg -fflags +genpts+igndts -f x11grab -vsync 0 -r 30 -s 1024x768 -i ${DISPLAY}+0,0 -vcodec h264 -f jack -ac 2 -r:a 48000 -i screencast -acodec pcm_s16le -r:v 30 -vsync 2 -async 1 -map 0:0,1,0 -map 1:0 -preset ultrafast -qp 0 output.mkv

./ffmpeg -fflags +genpts+igndts -f x11grab -vsync 0 -r 30 -s 1600x900 -i ${DISPLAY}+0,0 -vcodec h264 -f jack -ac 2 -r:a 48000 -i screencast -acodec pcm_s16le -r:v 30 -vsync 2 -async 1 -map 0:0,1,0 -map 1:0 -preset ultrafast -qp 0 output.mkv

Però així com funciona molt bé la resolució 800x600, en el cas de 1024x768 el so del video arriba tard, i en el cas 1600x900 arriba molt tard.

M'he estat barallant bastant i funciona bé per 800x600 i inferiors, i funciona malament per 1024x768 i superiors. (si instal.lés els drivers de la targeta, funcionaria?)

Webcam application: wxcam i camorama

Aquesta és la utilitat per activar la webcam. Pot ser interessant quan faig un screencast de tenir la webcam activa i poder tenir una finestra amb el contingut de la webcam, i d'aquesta manera també quedarà gravat en el screencast.

Com que no trobo el paquest wxcam instal.lo el paquet camorama:

$ sudo apt-get install camorama
$ camorama -x 300 -y 300

Evidentment la webcam que s'activa és la webcam integrada amb el portàtil. Ara bé, també tinc una webcam USB. En aquest cas he de veure quins són els dispositius disponibles.

$ ls -al /sys/class/video4linux 

lrwxrwxrwx  1 root root 0 oct 28 01:17 video0 -> ../../devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.4/1-1.4:1.0/video4linux/video0
lrwxrwxrwx  1 root root 0 oct 28 01:20 video1 -> ../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/video4linux/video1

o millor:

$ ls /dev/video*
/dev/video0  /dev/video1

I per tant, si vull activar amb el camorama la webcam USB:

$ camorama --device=/dev/video1 -x300 -y 300

Nota general: primer gravar i després codificar

If you have a slow computer, it will not be smart to grab and encode your video at the same time, because slow CPU will not be able to do this. In that case, first grab all you need and save it as uncompressed video/audio and when you finish the grabbing process then start converting it to whatever you need:

ffmpeg -framerate 25 -video_size 1024x768 -f x11grab -i :0.0+100,200 -f alsa -ac 2 -i pulse -vcodec libx264 -crf 0 -preset ultrafast -acodec pcm_s16le output.flv

ffmpeg -i output.flv -acodec ... -vcodec ... final.flv

ffmpeg (video) i jack_capture (audio) (funciona!). Octubre 2013

Doncs potser és més senzill que el cas anterior.

Es fa un script de manera que s'executen al mateix temps ffmpeg (només video) i jack_capture (només audio). Després amb un editor de video com Openshot editarem el video. Però el problema, igual que abans, és que funciona fins a resolucions de 800x600, però valors superiors no funciona, és a dir, hi ha desfase entre l'aùdio i el vídeo.



DATE=`date +%Y%m%d`
TIME=`date +%Hh%M`

# Start screencast
xterm -e jack_capture -b 24 ./screencast_audio_$DATE-$TIME.wav &
./ffmpeg -an -f x11grab -r 30 -s 800x600 -i 0:0 -threads 0 ./screencast_video_$DATE-$TIME.mkv
killall jack_capture

recordmydesktop (video) i jack_capture (audio) (funciona!). Novembre 2013

recordmydesktop no funciona molt bé amb JACK, per tant millor utilitzar l'opció --no-sound i que jack_capture se n'encarregui de la part d'audio.

He de compilar recordmydesktop de la última versió disponible, perquè la que hi ha en els repositoris és molt antiga. Descarrego de:

$ sudo apt-get install libtheora-dev
$ ./configure --enable-jack
$ make
$ cd src

L'opció --enable-jack de totes maneres no funciona.

Ja puc capturar la pantalla sense so:

$ /home/joan/recordmydesktop- --width 1360 --height 768 --no-sound --v_quality 63  --v_bitrate 2000000 --fps 25 --overwrite -o ~/output/output

I d'altra banda ja puc capturar el so:

$ /usr/bin/jack_capture -c 2 -f wav --port system:capture_1 ~/output/test.wav

Ho poso tot junt amb un script:

DATE=`date +%Y%m%d`
TIME=`date +%H%M%S`
# Start screencast

/home/joan/recordmydesktop- --width 1360 --height 768 --no-sound --v_quality 63  --v_bitrate 2000000 --fps 25 --overwrite -o /home/joan/output/output_$DATE-$TIME &
/usr/bin/jack_capture -c 2 -f wav --port fluidsynth:l_00 --port fluidsynth:r_00 /home/joan/output/output_$DATE-$TIME.wav

Amb el Openshot editor importo el video i l'audio, i efectivament estan sincronitzats. Es pot exportar un video de qualitat.

recordmydesktop: gravar una sola finestra

Primer obro la finestra:

$ gnome-terminal --geometry=70x40 --window-with-profile=screencast --working-directory=/home/joan/projectes/50_ways/way7

Aquí lo important és adonar-se de què --geometry no són els pixels de la finestra, sinó la resolució quant a files i columnes de caràcters. Per simplificar el prompt en la nova finestra:

$ PS1="$ "

Per saber el id d'una finestra:

$ xwininfo

I ara gravo el que passa en aquesta finestra:

$ ./recordmydesktop --no-sound --v_quality 63  --v_bitrate 2000000 --fps 25 --overwrite --windowid 0x3202ab7 -o prova.ogv

recordmydesktop --use-jack funcionant. Gravar TV3 a la carta

(desembre 2013) Finalment aconsegueixo fer recordmydesktop amb l'opció enable-jack funcionant. El truco és compilar bé amb aquesta opció.

Com es comenta a:

no n'hi ha prou a fer ./configure --prefix=/usr --enable-jack=yes sinó que s'ha de fer:

$ ./configure --prefix=/usr --enable-jack=yes LIBS=-ljack CFLAGS=-DHAVE_LIBJACK

i podem comprovar que l'opció --enable-jack està habilitada:

./recordmydesktop --print-config

Per tant, ara ja podem gravar l'escriptori. En el cas de què ens ocupa, que és gravar un programa de TV3 a la carta:

/home/joan/recordmydesktop- --v_quality 63  --v_bitrate 2000000 --fps 25 --overwrite  --windowid 0x24aff7f --on-the-fly-encoding --use-jack "PulseAudio JACK Sink":front-left "PulseAudio JACK Sink":front-right -o /home/joan/output/bressola_nadal.ogv

He de fer proves amb diferents tamanys de finestra, a veure si puc aconseguir el tamany complet. Aquí el truco està a utilitzar l'opció --on-the-fly-encoding, perquè si no et mors esperant la codificació d'un video que pot durar més d'una hora. A TV3 a la carta hi ha l'opció d'obrir el video en una nova finestra: he de fer servir aquesta opció, i veure quin és el id de la finestra.

A l'hora de gravar el video, he de tenir en compte:

  • nivell àudio entrada correcte
  • que no es posi en negre la pantalla: estalvi de pantalla. Paràmetres del Sistema > Brillantor i Bloqueig

NOTA: si vull utilitzar l'opció --on-the-fly-encoding hauré de mantenir la finestra que gravo ben petita.

Recordem que per trobar el id de la finestra utilitzem xwininfo, i que aquesta mateixa comanda em dóna informació de l'amplada i l'altura de la finestra.

En el cas de TV3 a la carta, si no vull que se'm gravin la barra de transport i etc, hauré de jugar amb les opcions -x -y -width -height. Per ex:

/home/joan/recordmydesktop- -y 40 --height 340 --v_quality 63  --v_bitrate 2000000 --fps 25 --overwrite  --windowid 0x340437b --on-the-fly-encoding --use-jack "PulseAudio JACK Sink":front-left "PulseAudio JACK Sink":front-right -o /home/joan/Baixades/bressola_nadal.ogv

Sembla ser que la finestra ha de ser prou petita, i si la redimensiono a més grossa poden començar els problemes...

creat per Joan Quintana Compte, 2010, octubre 2011, octubre 2013, desembre 2013