• Suscríbete al Feed Espacio Linux
  • Suscríbete al Feed por Email
  • Sigue a Espacio Linux en Identi.ca
  • Espacio Linux también en Facebook
  • Sigue a Espacio Linux en Twitter
  • Sigue a Espacio Linux en Google +
          Iniciar sesión | Registrarse

Micro reproductor de música con FFmpeg en Bash

Hasta ahora todos conocen la utilidad de FFmpeg como conversor de archivos multimedia, incluso seguramente más de uno conoce la famosa guía de los 19 comandos útiles con FFmpeg que circula por toda la internet.

Logo de FFmpeg

Logo de FFmpeg

Pero puedo apostar que muy pocos saben que FFmpeg también se puede usar para reproducir archivos de audio. FFmpeg integra de serie muchos codecs necesarios para codificar y decodificar diferentes tipos de flujos multimedia, en este caso lo que nos interesa es decodificar flujos de audio (ogg, mp3, wma, etc.) y enviarlos directamente al dispositivo de audio predeterminado. FFmpeg permite hacer transcoding (codificación/decodificación) a diferentes sistemas de audio, en este caso nos interesan los sistemas de audio mas populares: Pulse Audio, ALSA y OSS.

Los comandos básicos para reproducir cualquier tipo de archivo de audio con FFmpeg son:

1
2
3
4
5
6
7
8
# Pulse Audio
ffmpeg -i /ruta/del/archivo.ext -f alsa -ac 2 pulse

# ALSA
ffmpeg -i /ruta/del/archivo.ext -f alsa -ac 2 hw:0

# OSS
ffmpeg -i /ruta/del/archivo.ext -f oss -ac 2 /dev/dsp

Teniendo esta información sería interesante programar un pequeño reproductor de audio usando Bash. Yo lo llamo micro reproductor de audio porque no tiene todas las funcionalidades básicas que tiene un reproductor de audio normal (Listas de reproducción personalizadas, avanzar y retroceder la música actual, reproducir la música anterior, repetir y mezclar canciones, accesos globales, etc.), sino solamente algunas de ellas.

En este caso sólo están disponibles algunas funcionalidades como reproducir todos los archivos dentro de una ruta, pausar, reproducir la siguiente música y salir del programa. Nada más ni nada menos.

Sin más preámbulos, el script completo:

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/bin/bash
#
# ffplayer.sh, Micro music player example with FFmpeg and Bash.
# Copyright (C) 2012  Gonzalo Exequiel Pedone
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with This program. If not, see <http: //www.gnu.org/licenses/>.
#
# Email   : hipersayan DOT x AT gmail DOT com
# Web-Site: http://hipersayanx.blogspot.com/

# Detectamos el sistema de audio disponible, dando como prioridad el siguiente
# orden:
#
# 1) Pulse Audio
# 2) ALSA
# 3) OSS
pulseaudio --version 2>/dev/null 1>/dev/null

if [ $? == '0' ]; then
    asys=pulse
else
    asound=$(cat /proc/asound/version 2>/dev/null)

    if [ $? == '0' ]; then
        asys=alsa
    else
        if [ -e '/dev/dsp' ]; then
            asys=oss
        else
            asys=''
        fi
    fi
fi

pid=0
pause=false
quit=false

IFS=$'\n'

# Recorremos el árbol de directorio pasado como parámetro.
# Sólo reproduciremos archivos en formato OGG, MP3 y WMA.
for filename in $(find "$1" -iname '*.ogg' -o -iname '*.mp3' -o -iname '*.wma')
do
    if [ $quit == 'true' ]; then
        # Si el proceso de FFmpeg este pausado lo continuamos para forzar su
        # cierre.
        if [ $pause == 'true' ]; then
            kill -CONT $pid
        fi

        # Terminamos FFmpeg
        if [ $pid -ne 0 ]; then
            kill -TERM $pid
        fi

        break
    fi

    # Si es un directorio, continuamos con la siguiente ruta en la lista.
    if [ -d "$filename" ]; then
        continue
    fi

    # Si ya hay un archivo en reproducción, finalizamos FFmpeg.
    if [ $pid -ne 0 ]; then
        kill -TERM $pid
    fi

    # Reproducimos el archivo de audio usando el sistema de audio predefinido.
    case "$asys" in
        # Pulse Audio
        pulse)  ffmpeg -i "$filename" -f alsa -ac 2 pulse &
                r=$?
                pid=$!
        ;;

        # ALSA
        alsa)   ffmpeg -i "$filename" -f alsa -ac 2 hw:0 &
                r=$?
                pid=$!
        ;;

        # OSS
        oss)    ffmpeg -i "$filename" -f oss -ac 2 /dev/dsp &
                r=$?
                pid=$!
        ;;

        *)
            break
        ;;
    esac

    # Si hay algún fallo en la reproducción continuamos con el siguiente archivo
    # en la lista.
    if [ $r != '0' ]; then
        continue
    fi

    while true
    do
        # Leemos una tecla durante un segundo.
        read -t 1 -n 1 key

        # Si el usuario no ha pulsado ninguna tecla y no hay música en
        # reproducción, continuar con la siguiente música en la lista.
        if [ "$?" != '0' ] && [ "$(ps -p $pid -o comm=)" == '' ]; then
            pid=0
            break
        fi

        case "$key" in
            # Reproducir el siguiente archivo en la lista.
            n)  if [ $pause == 'true' ]; then
                    kill -CONT $pid
                    pause=false
                fi

                break
            ;;

            # Pausamos la música actual
            p)  if [ $pause == 'true' ]; then
                    kill -CONT $pid
                    pause=false
                else
                    kill -STOP $pid
                    pause=true
                fi
            ;;

            # Salimos del programa
            q)  quit=true
                break
            ;;

            # No hacer nada.
            *)
            ;;
        esac
    done
done

# Si FFmpeg todavía está corriendo finalizarlo.
if [ $pid -ne 0 ] && [ $(ps -p $pid -o comm=) ]; then
    kill -TERM $pid
fi

Para correr este script necesitan tener instalado FFmpeg, si no lo tienen instalado ya:

  • Arch/Chakra: pacman -S ffmpeg
  • Debian/Ubuntu: apt-get install ffmpeg
  • Fedora: yum install ffmpeg
  • OpenSuSE: zypper install ffmpeg
  • Mandriva: urpmi ffmpeg
  • Pardus: pisi it ffmpeg

Copiamos y pegamos el código en un archivo, pej. ffplayer.sh, y guardamos.

Le damos permisos de ejecución:

1
chmod 744 ffplayer.sh

Y ejecutamos:

1
./ffplayer.sh /tu/carpeta/de/musica

Las combinaciones de teclas disponibles son:

  • N: Reproducir la musica siguiente.
  • P: Pausar/Continuar.
  • Q: Salir del programa.

Incluso si alguien se anima, puede extender y mejorar un poco más el script usando ncurses, KDialog y/o Zenity. En fin, otra interesante forma de usar FFmpeg.


Enlaces de interés:
FFmpeg | ffmpeg.org


Temas:
Documentación, Multimedia, Programación


Etiquetas:
, , ,

Feed Espacio LinuxSi este artículo ha sido de tu interés, considera hacer un comentario o suscribirte al feed para que te enteres de nuevos artículos a través de tu lector de noticias o email.

Acerca del autor

Avatar image

3 Comentarios para “Micro reproductor de música con FFmpeg en Bash”

  1. Avatar image

    que bueno !!! 

  2. Estupendo!!!

    Probado y funcionando ;-)

    Un saludo

  3. Me gusto, esta completo y descriptivo, ya lo pruebo

Publica un comentario

Puedes usar estas etiquetas XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <blockquote cite=""> <code> <em> <strong>