Super tutorial de introducción a GStreamer

En este pequeño repaso vamos a ver algunos ejemplos de cosas simples que podemos hacer desde la consola con GStreamer y a explicar un poco su funcionamiento.

Introducción a GStreamer

Gstreamer es, hoy por hoy, prácticamente el framework multimedia de facto en GNU/Linux. Con GStreamer podemos por ejemplo:

  • Mezclar diferentes tipos de medios como pueden ser señales de audio, video, imágenes y subtitulos.
  • Permite aplicar diferentes tipos de filtros tanto de audio como de video.
  • Transmisión y recepción de datos en tiempo real.
  • Codificación y decodificación en diferentes formatos.
  • Reproducción de archivos multimedias.
  • Y así un muy largo etcetera de posibilidades.

Un gran numero proyectos muy conocidos hacen uso de GStreamer como por ejemplo: Kaffeine, Totem, Cheese, Kamoso, Pidgin, Empathy, Gnash, Phonon, Transmageddon, Pitivi, y muchas, muchas más. Si te interesa lo que acabas de leer pues entonces comencemos.

Instalación de GStreamer

Primero debemos instalar todos los paquetes necesarios para hacer uso de GStreamer (si es que todavía no lo hemos hecho). Debemos ejecutar (como root) el siguiente comando según nuestra distro:

  • Arch/Chakra/Parabola:
    1
    pacman -S gstreamer0.10 gstreamer0.10-good gstreamer0.10-bad
  • Debian/Ubuntu/Linux Mint/Trisquel:
    1
     <em>apt-get install gstreamer0.10-tools gstreamer0.10-plugins-good gstreamer0.10-plugins-bad</em>
  • Fedora/CentOS:
    1
    yum install gstreamer gstreamer-plugins-good gstreamer-plugins-bad-free
  • OpenSuSE:
    1
    zypper install gstreamer-0_10-utils gstreamer-0_10-plugins-good gstreamer-0_10-plugins-bad
  • Mandriva/Mageia:
    1
    urpmi gstreamer0.10-tools gstreamer0.10-plugins-good gstreamer0.10-plugins-bad

Con esto ya estamos listos para comenzar.

Elementos, Pads, Sources y Sinks

GStreamer divide cada unidad básica de procesamiento en lo que se conoce como Elementos.

Elementos de GStreamer
Elementos de GStreamer

A su vez cada elemento puede tener una, varias, o ninguna conexión de entrada o de salida, dichas conexiones se las conoce como pads. A su vez los elementos que solo entregan señal se los conoce como source (Fuentes), y los que solo reciben señal se los conoce como sink (Consumidores).

Pads
Pads

Ahora que ya sabemos esto, vamos a hacer nuestro primer experimento con GStreamer. Para ello utilizaremos el comando gst-launch-0.10 (puede variar el nombre según la distro) de la siguiente manera:

1
gst-launch-0.10 videotestsrc ! ximagesink

Ejemplo de una pipeline
Ejemplo de una pipeline

videotestsrc es un elemento del tipo source que genera una señal de video similar al del inicio y fin de transmisión los canales de TV.

ximagesink es un elemento del tipo sink que renderiza todas las señales de video que le llegan en una ventana.

GStreamer utiliza el operador ! (exclamación) para vincular los elementos, a esa vinculación de elementos se la conoce como pipe (tubería), y a la ruta total formada por la vinculación de todos los elementos se le llama pipeline (red de tuberías).

El resultado de ejecutar dicho comando será este:

El "Hola mundo!" de GStreamer
El «Hola mundo!» de GStreamer

Para consultar la lista completa de elementos que provee GStreamer podemos usar el comando gst-inspect-0.10 (puede variar el nombre según la distro) cuya salida será parecida a esta (suele ser bastante mas larga):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<br />
qtvideosink:  qtvideosink: Qt video sink<br />
qtvideosink:  qtglvideosink: Qt GL video sink<br />
qtvideosink:  qwidgetvideosink: QWidget video sink<br />
bluetooth:  rtpsbcpay: RTP packet payloader<br />
bluetooth:  a2dpsink: Bluetooth A2DP sink<br />
bluetooth:  avdtpsink: Bluetooth AVDTP sink<br />
bluetooth:  sbcparse: Bluetooth SBC parser<br />
bluetooth:  sbcdec: Bluetooth SBC decoder<br />
bluetooth:  sbcenc: Bluetooth SBC encoder<br />
bluetooth: sbc: sbc<br />
bayer:  rgb2bayer: RGB to Bayer converter<br />
bayer:  bayer2rgb: Bayer to RGB decoder for cameras<br />
schro:  schroenc: Dirac Encoder<br />
schro:  schrodec: Dirac Decoder<br />
vp8:  vp8enc: On2 VP8 Encoder<br />
vp8:  vp8dec: On2 VP8 Decoder<br />
festival:  festival: Festival Text-to-Speech synthesizer<br />

El formato de dicha salida es el siguiente:

1
grupo: nombredelelemento: descripcion

Para consultar la información sobre cada elemento usaremos el siguiente comando:

1
gst-inspect-0.10 nombredelelemento

Por ejemplo para el elemento ximagesink, su salida correspondiente será esta:

1
2
3
4
5
6
7
<br />
Factory Details:<br />
Long name:    Video sink<br />
Class:        Sink/Video<br />
Description:  A standard X based videosink<br />
Author(s):    Julien Moutte &lt;julien@moutte.net&gt;<br />
Rank:         secondary (128)

1
Plugin Details:<br />Name: ximagesink<br />Description: X11 video output element based on standard Xlib calls<br />Filename: /usr/lib/gstreamer-0.10/libgstximagesink.so<br />Version: 0.10.36<br />License: LGPL<br />Source module: gst-plugins-base<br />Source release date: 2012-02-20<br />Binary package: GStreamer Base Plugins (Archlinux)<br />Origin URL: http://www.archlinux.org/

1
GObject<br />+----GstObject<br />+----GstElement<br />+----GstBaseSink<br />+----GstVideoSink<br />+----GstXImageSink

1
Interfaces implementados:<br />GstImplementsInterface<br />GstNavigation<br />GstXOverlay

1
Pad Templates:<br />SINK template: 'sink'<br />Availability: Always<br />Capabilities:<br />video/x-raw-rgb<br />framerate: [ 0/1, 2147483647/1 ]<br />width: [ 1, 2147483647 ]<br />height: [ 1, 2147483647 ]

1
Element Flags:<br />no flags set

1
Element Implementation:<br />Has change_state() function: 0x7fe77f8e5490<br />Has custom save_thyself() function: gst_element_save_thyself<br />Has custom restore_thyself() function: gst_element_restore_thyself

1
Element has no clocking capabilities.<br />Element has no indexing capabilities.<br />Element has no URI handling capabilities.

1
Pads:<br />SINK: 'sink'<br />Implementation:<br />Has chainfunc(): gst_base_sink_chain<br />Has custom eventfunc(): gst_base_sink_event<br />Has custom queryfunc(): gst_base_sink_sink_query<br />Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default<br />Has bufferallocfunc(): gst_base_sink_pad_buffer_alloc<br />Has getcapsfunc(): gst_base_sink_pad_getcaps<br />Has setcapsfunc(): gst_base_sink_pad_setcaps<br />Has acceptcapsfunc(): gst_pad_acceptcaps_default<br />Has fixatecapsfunc(): gst_base_sink_pad_fixate<br />Pad Template: 'sink'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Element Properties:<br />
name                : The name of the object<br />
                        flags: legible, escribible<br />
                        String. Default: "ximagesink0"<br />
preroll-queue-len   : Number of buffers to queue during preroll<br />
                        flags: legible, escribible<br />
                        Unsigned Integer. Range: 0 - 4294967295 Default: 0<br />
sync                : Sync on the clock<br />
                        flags: legible, escribible<br />
                        Boolean. Default: true<br />
max-lateness        : Maximum number of nanoseconds that a buffer can be late before it is dropped (-1 unlimited)<br />
                        flags: legible, escribible<br />
                        Integer64. Range: -1 - 9223372036854775807 Default: 20000000<br />
qos                 : Generate Quality-of-Service events upstream<br />
                        flags: legible, escribible<br />
                        Boolean. Default: true<br />
async               : Go asynchronously to PAUSED<br />
                        flags: legible, escribible<br />
                        Boolean. Default: true<br />
ts-offset           : Timestamp offset in nanoseconds<br />
                        flags: legible, escribible<br />
                        Integer64. Range: -9223372036854775808 - 9223372036854775807 Default: 0<br />
enable-last-buffer  : Enable the last-buffer property<br />
                        flags: legible, escribible<br />
                        Boolean. Default: true<br />
last-buffer         : The last buffer received in the sink<br />
                        flags: legible<br />
                        MiniObject of type "GstBuffer"<br />
blocksize           : Size in bytes to pull per buffer (0 = default)<br />
                        flags: legible, escribible<br />
                        Unsigned Integer. Range: 0 - 4294967295 Default: 4096<br />
render-delay        : Additional render delay of the sink in nanoseconds<br />
                        flags: legible, escribible<br />
                        Unsigned Integer64. Range: 0 - 18446744073709551615 Default: 0<br />
throttle-time       : The time to keep between rendered buffers (unused)<br />
                        flags: legible, escribible<br />
                        Unsigned Integer64. Range: 0 - 18446744073709551615 Default: 0<br />
show-preroll-frame  : Whether to render video frames during preroll<br />
                        flags: legible, escribible<br />
                        Boolean. Default: true<br />
display             : X Display name<br />
                        flags: legible, escribible<br />
                        String. Default: null<br />
synchronous         : When enabled, runs the X display in synchronous mode. (unrelated to A/V sync, used only for debugging)<br />
                        flags: legible, escribible<br />
                        Boolean. Default: false<br />
pixel-aspect-ratio  : The pixel aspect ratio of the device<br />
                        flags: legible, escribible<br />
                        String. Default: null<br />
force-aspect-ratio  : When enabled, reverse caps negotiation (scaling) will respect original aspect ratio<br />
                        flags: legible, escribible<br />
                        Boolean. Default: false<br />
handle-events       : When enabled, XEvents will be selected and handled<br />
                        flags: legible, escribible<br />
                        Boolean. Default: true<br />
handle-expose       : When enabled, the current frame will always be drawn in response to X Expose events<br />
                        flags: legible, escribible<br />
                        Boolean. Default: true<br />
window-width        : Width of the window<br />
                        flags: legible<br />
                        Unsigned Integer64. Range: 0 - 18446744073709551615 Default: 0<br />
window-height       : Height of the window<br />
                        flags: legible<br />
                        Unsigned Integer64. Range: 0 - 18446744073709551615 Default: 0<br />

Dentro de la información devuelta por gst-inspect-0.10 podrán encontrar un campo llamado Source module el cual indica el grupo al que pertenece dicho elemento. GStreamer divide los diferentes elementos de los que hace uso en diferentes categorías:

  • gst-plugins-base: Este grupo contiene todo un conjunto de plugins básicos bien soportados, que permiten, por ejemplo, el acceso a ficheros, acceso al hardware del sistema, acceso HTTP y FTP, etc..
  • gst-plugins-good: Este grupo contiene elementos extras (principalmente codecs y efectos) bien soportados.
  • gst-plugins-bad: Este grupo contiene elementos extras pero que podrían tener algún bug.
  • gst-plugins-ugly: Este grupo contiene elementos que podrían tener problemas de patentes o que podrían no ser Software Libre.

Propiedades y Caps

A su vez podemos personalizar cada elemento mediante sus propiedades, así como también podemos filtrar el tipo de señal que envía o recibe cada elemento mediante el uso de caps (capacidades). Por ejemplo:

1
gst-launch-0.10 videotestsrc pattern='ball' ! video/x-raw-rgb,width=800,height=600,framerate=100/1 ! ximagesink

El formato para las propiedades es básicamente:

1
nombredelelemento prop1=val1 prop2=val2 prop3=val3 ...

Los caps se colocan como otro elemento y cada propiedad va separada por , (coma).

Adaptadores

Los adaptadores son un tipo especial de elementos que permiten conectar dos elementos con capacidades diferentes.

En el siguiente ejemplo capturamos imágenes de la webcam, la cual está en formato YUV y mediante el uso del elemento ffmpegcolorspace la convertimos automáticamente a RGB

1
gst-launch-0.10 v4l2src device=/dev/video0 ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! ffmpegcolorspace ! ximagesink

Adaptador de señales de video
Adaptador de señales de video

Mientras que para adaptar señales de audio se utiliza el elemento audioconvert. Por ejemplo:

1
gst-launch-0.10 audiotestsrc ! audioconvert ! alsasink

Adaptador de señales de audio
Adaptador de señales de audio

Codecs

Los codecs son elementos que nos permiten entre otras cosas comprimir o descomprimir la información contenida dentro de un archivo de audio, video o imagen. Por ejemplo para mostrar una imagen en formato PNG usamos el comando:

1
2
<br />
gst-launch-0.10 filesrc location=imagen.png ! pngdec ! freeze ! ffmpegcolorspace ! ximagesink<br />

Diagrama del visualizador de imágenes
Diagrama del visualizador de imágenes

filesrc permite abrir cualquier tipo de archivo y entrega toda la información en formato crudo (tal y como esta almacenada).

pngdec es el codec que sirve para descomprimir la información en formato PNG y convertirla a RGB en crudo.

El elemento freeze permite congelar el flujo de datos. Si no estuviera presente, la ventana se cerraría automáticamente sin mostrar la imagen.

En el siguiente ejemplo vamos a ver como hacer una captura de pantalla y guardarla en formato PNG:

1
2
<br />
gst-launch-0.10 ximagesrc ! ffmpegcolorspace ! pngenc ! filesink location=captura.png<br />

Diagrama del capturador de imágenes del escritorio
Diagrama del capturador de imágenes del escritorio

Puede notar que esta vez no es necesario utilizar el elemento freeze pues no es nuestra intención bloquear el flujo de datos, y que también invertimos el flujo de datos cambiando el tipo de cada elemento, lo que antes era src pasa a ser sink y viceversa.

Bifurcaciones, muxers y Queues

Hasta ahora veníamos procesando todas las señales de forma completamente lineal, una atrás de otra. Pero GStreamer ofrece un mecanismo especial con el cual podemos romper con esa linealidad y procesar varias pipes al mismo tiempo, con lo cual podemos crear pipelines mas complejas y dinámicas.

Supongamos que queremos realizar una captura de pantalla y guardarla en dos formatos diferentes al mismo tiempo, por ejemplo en formato PNG y JPG. Para ello podemos utilizar el siguiente comando:

1
2
3
4
<br />
gst-launch-0.10 ximagesrc ! tee name=bifurcacion <br />
                bifurcacion. ! queue ! ffmpegcolorspace ! pngenc ! filesink location=captura.png <br />
                bifurcacion. ! queue ! ffmpegcolorspace ! jpegenc ! filesink location=captura.jpg<br />

Diagrama de ejemplo de una bifurcación
Diagrama de ejemplo de una bifurcación

Aquí podemos ver dos nuevos elementos, tee (bifurcación) y queue (cola).

tee es un elemento que posee un único pad de entrada y es capaz de dividir la señal de entrada entre varias señales de salida idénticas a la entrada.

Para hacer uso del elemento tee debemos asignarle un nombre mediante la propiedad name (todos los elementos de GStreamer poseen esta propiedad), para conectar un pipeline al tee basta con usar el nombre asignado al tee, seguido de un . (punto), como si fuera cualquier otro elemento.

Luego de declarar el elemento tee no debemos colocar el operador ! (exclamación), ya que un tee representa el final de un pipeline.

El elemento queue permite destrabar el flujo de datos en caso de tener varias pipes conectadas a un único pad. Si no hubiesemos colocado un queue entonces las pipelines correspondientes a los codecs de PNG y JPG se hubieran bloqueado mutuamente, y por lo tanto GStreamer hubiera quedado bloqueado sin escribir ningun dato en los respectivos archivos.

En contraposición al elemento tee tenemos al elemento muxer (multiplexor o mezclador), el cual posee varios pads de entrada y un único pad de salida, por lo tanto funciona como un mezclador de señales (de tipos iguales o diferentes).

Por ejemplo, para grabar un video en formato WEBM usando la webcam y un micrófono, usaríamos el siguiente comando:

1
2
3
4
5
<br />
gst-launch-0.10 -e v4l2src device=/dev/video0 ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! <br />
                   ffmpegcolorspace ! vp8enc quality=10 speed=7 bitrate=1000000000 ! queue ! mezclador. <br />
                   alsasrc device=plughw:0,0 ! queue ! audioconvert ! queue ! vorbisenc ! queue ! mezclador. <br />
                   webmmux name=mezclador ! filesink location=webcam.webm<br />

Grabando video con GStreamer
Grabando video con GStreamer

El elemento muxer al igual que el elemento tee necesita un nombre para poder utilizarlo. En este caso el elemento webmmux es un muxer el cual mezcla una señal de video comprimida con el codec vp8enc en formato VP8, y otra señal de audio comprimida con el codec vorbisenc en formato Vorbis.

El elemento alsasrc captura el audio proveniente de microfono por defecto usando ALSA.

A su vez se ha añadido la opción -e a gst-launch-0.10, esta opción permite que cuando el usuario detenga el programa usando, por ejemplo CTRL + C, GStreamer pueda cerrar los archivos y todos los flujos correctamente.

También podemos hacer uso de los elementos tee y muxer al mismo tiempo. Con el siguiente comando podemos grabar video desde la webcam mas el audio del micrófono mientras previsualizamos la captura en una ventana:

1
2
3
4
5
6
<br />
gst-launch-0.10 -e v4l2src device=/dev/video0 ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! tee name=bifurcacion <br />
                   bifurcacion. ! queue ! ffmpegcolorspace ! ximagesink <br />
                   bifurcacion. ! queue ! ffmpegcolorspace ! vp8enc quality=10 speed=7 bitrate=1000000000 ! queue ! mezclador. <br />
                   alsasrc device=plughw:0,0 ! queue ! audioconvert ! queue ! vorbisenc ! queue ! mezclador. <br />
                   webmmux name=mezclador ! filesink location=webcam.webm<br />

Grabando y previsualizando la grabación
Grabando y previsualizando la grabación

Bins

Un bin (contenedor) es un elemento que encapsula todo un pipeline completo. Por ejemplo para capturar imágenes de la webcam podemos utilizar el siguiente comando:

1
gst-launch-0.10 camerabin

ó

1
gst-launch-0.10 camerabin2

Los elementos camerabin y camerabin2 encapsulan todo un pipeline completo que permite mostrar la webcam en un ximagesink, grabar video, y hacer capturas de video, aunque desde linea de comandos solo está disponible la primera opción, las otras dos opciones solo están disponibles desde la API en C sólo para programadores.

Para reproducir un video, audio o visualizar una imagen desde el disco duro podemos usar el siguiente comando:

1
gst-launch-0.10 playbin uri='file:///ruta/completa/del/video.webm'

Si por el contrario queremos reproducir algún archivo que esta en internet usamos la dirección web del mismo:

1
gst-launch-0.10 playbin uri='http://www.pagina.com/del/archivo/de/musica.ogg'

También hay bins que en lugar de crear un reproductor completo solo descomprimen los archivos en sus señales básicas. Por ejemplo:

1
2
3
4
<br />
gst-launch-0.10  filesrc location=video.webm ! decodebin name=decodificador <br />
                 decodificador. ! ffmpegcolorspace ! ximagesink <br />
                 decodificador. ! audioconvert ! alsasink<br />

Contenedor para decodificar flujos multimedia
Contenedor para decodificar flujos multimedia

Y por supuesto también tenemos su contraparte:

1
2
3
4
<br />
gst-launch-0.10 -e v4l2src device=/dev/video0 ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! ffmpegcolorspace ! codificador. <br />
                   alsasrc device=plughw:0,0 ! audioconvert ! codificador. <br />
                   encodebin name=codificador ! filesink location=video.webm<br />

Contenedor para codificar flujos multimedia
Contenedor para codificar flujos multimedia

Composición de Video

Otra potente opción que nos ofrece GStreamer es la de hacer composiciones de video utilizando varias fuentes utilizando el elemento videomixer el cual funciona de manera similar a un muxer. Veamos un ejemplo sencillo:

1
2
3
4
<br />
gst-launch-0.10 videotestsrc ! video/x-raw-yuv,width=320,height=240,framerate=30/1 ! mezclador. <br />
                videotestsrc pattern='ball' ! video/x-raw-yuv,width=160,height=120,framerate=30/1 ! mezclador. <br />
                videomixer name=mezclador ! ffmpegcolorspace ! xvimagesink<br />

Diagrama del mezclador de video
Diagrama del mezclador de video

El resultado será este:

Mezclando fujos de video con GStreamer
Mezclando fujos de video con GStreamer

Como podrás notar, la fuente de video que se declara primero es la primera que se dibuja y que la última que se declara es la última que se dibuja, por defecto videomixer dibuja las fuentes en el mismo orden en el que se las declara.

Por supuesto GStreamer provee un mecanismo muy simple por el cual no solo podemos cambiar el orden de dibujo, sino que también podemos cambiar la posición en la que se dibuja cada fuente. El elemento que provee dicho mecanismo se llama videobox. Veamos un ejemplo:

1
2
3
4
5
6
7
8
9
10
<br />
gst-launch-0.10 videotestsrc pattern='smpte' ! video/x-raw-yuv,width=160,height=120,framerate=30/1 ! <br />
                    videobox top=0 left=0 border-alpha=0 ! mezclador. <br />
                videotestsrc pattern='snow' ! video/x-raw-yuv,width=160,height=120,framerate=30/1 ! <br />
                    videobox top=0 left=-160 border-alpha=0 ! mezclador. <br />
                videotestsrc pattern='circular' ! video/x-raw-yuv,width=160,height=120,framerate=30/1 ! <br />
                    videobox top=-120 left=0 border-alpha=0 ! mezclador. <br />
                videotestsrc pattern='ball' ! video/x-raw-yuv,width=160,height=120,framerate=30/1 ! <br />
                    videobox top=-120 left=-160 border-alpha=0 ! mezclador. <br />
                videomixer name=mezclador ! ffmpegcolorspace ! xvimagesink<br />

Diagrama de ejemplo para videobox
Diagrama de ejemplo para videobox

Las propiedades top, left, bottom y right indican la separación entre el cuadro y su posición originasl en el lateral correspondiente. Las propiedad border-alpha indica la visibilidad que tendrá el borde del cuadro.

Este será el resultado:

Ejemplo de uso de videobox
Ejemplo de uso de videobox

Superposición de Texto

GStreamer también nos permite superponer texto sobre una imagen usando el elemento textoverlay. Aquí un ejemplo:

1
2
3
4
<br />
gst-launch-0.10 videotestsrc pattern='snow' ! <br />
                textoverlay font-desc="Sans Bold 30" text='No hay señal de TV ;(' valign=bottom halign=center color=4294967040 ! <br />
                ffmpegcolorspace ! xvimagesink<br />

Diagrama de superposición de texto
Diagrama de superposición de texto

La propiedad font-desc permite seleccionar el nombre, los atributos y el tamaño de la fuente a utilizar. Las propiedades valign y halign permiten alinear el texto. La propiedad color es un entero que representa un color en el formato ARGB, por ejemplo: 0xFFFFFF00 (amarillo) = 4294967040.

Este es el resultado:

Insertando texto con GStreamer
Insertando texto con GStreamer

Efectos de Audio y Video

GStrreamer también nos ofrece la posibilidad de aplicar efectos tanto de imagen como de sonido.

El siguiente ejemplo aplica un efecto de distorsión a la webcam:

1
2
<br />
gst-launch-0.10 v4l2src device=/dev/video0 ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! ffmpegcolorspace ! square ! ffmpegcolorspace ! ximagesink<br />

Diagrama de efectos
Diagrama de efectos

Esta es la imagen original sin el efecto de distorsión:

Imagen cortesía de flickr
Imagen cortesía de flickr

Y esta la imagen de la webcam con el efecto aplicado:

Imagen con efectos
Imagen con efectos

Aquí dejo una lista de todos los plugins de efectos de video:

  • agingtv
  • bulge
  • burn
  • chromium
  • dicetv
  • edgetv
  • exclusion
  • fisheye
  • kaleidoscope
  • marble
  • mirror
  • optv
  • pinch
  • quarktv
  • radioactv
  • revtv
  • rippletv
  • shagadelictv
  • solarize
  • sphere
  • square
  • streaktv
  • stretch
  • tunnel
  • twirl
  • vertigotv
  • warptv
  • waterripple

Y para aplicar efectos de sonido, en este caso un efecto de eco (se recomienda usar auriculares para evitar acoplamiento):

1
2
<br />
gst-launch-0.10 alsasrc device=plughw:0,0 ! audioconvert ! audioecho intensity=0.6 feedback=0.4 delay=400000000 ! audioconvert ! alsasink<br />

Diagrama de efectos de audio
Diagrama de efectos de audio

Aquí dejo una lista de todos los plugins de efectos de audio:

  • audioamplify
  • audiochebband
  • audiocheblimit
  • audiodynamic
  • audioecho
  • audiofirfilter
  • audioiirfilter
  • audioinvert
  • audiopanorama
  • audiokaraoke
  • audiowsincband
  • audiowsinclimit

Visualizacion de Audio

Hace hace algunos años estaban de moda los reproductores de música que traían visualizaciones integradas. Las visualizaciones de audio son aquellos gráficos que cambian su forma de acuerdo con el compás y estridencia de la música.

Para los nostálgicos, aquí está el comando para mostrar dichas visualizaciones al ritmo de la música:

1
2
3
4
<br />
gst-launch-0.10 filesrc location=musica.ogg ! decodebin ! tee name=bifurcacion <br />
                bifurcacion. ! queue ! audioconvert ! alsasink <br />
                bifurcacion. ! queue ! audioconvert ! goom2k1 ! ffmpegcolorspace ! ximagesink<br />

Diagrama de efectos
Diagrama de efectos

Este es el resultado:

Visualizaciones de audio con GStreamer
Visualizaciones de audio con GStreamer

Aquí dejo una lista de todos los plugins de visualizaciones:

  • goom
  • goom2k1
  • libvisual
  • monoscope
  • spacescope
  • spectrascope
  • synaescope
  • wavescope

Fin

Y llegamos al final de esta pequeña introducción a la magnífica herramienta multimedia que es GStreamer. Pueden encontrar más información en la página del proyecto aquí abajo.


GStreamer | Página principal de GStreamer
GStreamer | Resumen de todos los plugins para GStreamer

1
0
444
Califique este artículo

1 comentario en «Super tutorial de introducción a GStreamer»

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.