# Reproducir Audio .gsm (Cerrado)

## JotaCE

Estimados.

Hace algunas semanas monte un servidor "elastik" basado en centos, es increible la cantidad de cosas que tiene instaladas y lo que facilita la vida.

Las llamadas telefonicas son almacenadas en formato .gsm

Las computadoras de los usuarios estan basadas en gentoo me gustaria que me recomendara una forma de reproducir ya sea como complemento de firefox o una aplicacion independiente.

Cualquier consejo es bienvenido  :Very Happy: 

----------

## Latinvs

Hombre, un poco de Google no hace mal a nadie,  :Wink: 

http://www.google.com/search?q=formato+gsm&ie=UTF-8&oe=UTF-8

----------

## Inodoro_Pereyra

Mplayer puede reproducir .gsm JotaCE...

Salud!

----------

## JotaCE

 *Inodoro_Pereyra wrote:*   

> Mplayer puede reproducir .gsm JotaCE...
> 
> Salud!

 

Gracias Inodoro_Pereyra

Que USE flags deberia tener activada para poder reproducir archivos gsm con mplayer ?

----------

## agdg

 *JotaCE wrote:*   

> Que USE flags deberia tener activada para poder reproducir archivos gsm con mplayer ?

 

Activa el USE flag gsm, pero para ffmpeg. No existe la USE gsm para mplayer. Obviamente tendrás que instalar ffmpeg si no lo tienes; y si lo tienes recompilar con las nuevas USE.

echo "media-video/ffmpeg gsm" >> /etc/portage/package.use

emerge --ask --verbose --newuse media-video/ffmpeg

----------

## JotaCE

 *agdg wrote:*   

>  *JotaCE wrote:*   Que USE flags deberia tener activada para poder reproducir archivos gsm con mplayer ? 
> 
> Activa el USE flag gsm, pero para ffmpeg. No existe la USE gsm para mplayer. Obviamente tendrás que instalar ffmpeg si no lo tienes; y si lo tienes recompilar con las nuevas USE.
> 
> echo "media-video/ffmpeg gsm" >> /etc/portage/package.use
> ...

 

Gracias por tu respuesta.

Segui tu consejo y aqui esta la salida al comando

```
localhost ~ # mplayer rafa.gsm

MPlayer SVN-r29463-4.1.2 (C) 2000-2009 MPlayer Team

Playing rafa.gsm.

libavformat file format detected.

[gsm @ 0x93beb40]Could not find codec parameters (Audio: 0x0000, 0 channels, s16)

LAVF_header: av_find_stream_info() failed

Exiting... (End of file)
```

Algun Comentario ?

--- EDITO ---

el comando play del paquete sox funciona pero ..... habra algun frontend para esa aplicacion ?

----------

## agdg

 *JotaCE wrote:*   

> 
> 
> ```
> localhost ~ # mplayer rafa.gsm
> 
> ...

 

Solo se me ocurren dos opciones:

1.- Si no te importa probar guarreando un poco el sistema; instala las librerías gsm: emerge -av media-sound/gsm

2.- Hacer un arreglo para que al hacer clic derecho sobre un fichero .gsm, aparezca una opción que diga "REPRODUCIR"; y se ejecute un script bash que de forma transparente al usuario: 

2.1.- Convierta el fichero .gsm a .wav y lance el reproductor que prefieras. Esta opción te da control sobre la reproducción (play, pausa, stop...); o bien

2.2.- Simplemente comienza la reproducción del fichero. Control de la reproducción engorroso, puesto que no aparecería ninguna GUI; solo se escucharía el audio.

Depende del uso que quieras, puede ser mas interesante uno u otro método. Lo que debes de tener en cuenta que la opción 2.1, como implica convertir el audio, será más lenta; aunque todo depende de lo que se tarde de recodificar el fichero. Como en todo, tendrás que probar y ver que solución se adapta más a tus necesidades.

NOTA: En caso de que te interese esta opción; solo te puedo ayudar si usas nautilus. En caso contrario deberías buscar con añadir opciones contextuales al menú del explorar que uses. Los scripts que ejecutan las opciones contextuales solo son simples guiones-bash de 2-3 comandos.

Yo usa esta opción para montar las imágenes de CD y va de fábula. clic derecho sobre una ISO y montar; y listo ya esta montada  :Very Happy: 

PD: En el post anterior se me olvido comentarlo, pero tras actualizar las nuevas USE siempre se debe hacer un revdep-rebuild. Si no lo has hecho, hazlo y prueba antes de nada.

----------

## JotaCE

Hasta donde se ffmpeg y mplayer son desarrollados por las mismas personas.

Pero ffmpeg no es dependencia de mplayer por lo tanto no lo usará para nada. 

Efectivamente ffmpeg tiene soporte gsm pero como no es dependencia de mplayer pues no creo que sirva de mucho.

Voy a intentar la otra alternativa que señalas haber que pasa!

Algun comentario ?

----------

## agdg

Hace unos meses escribe un post en mi bitacora de barrapunto describiendo como montar imágenes de CD en gnome con nautilus. Puedes usarlo a modo de guía puesto que el procedimiento es el mismo, tan solo tendrás que cambiar los filenames para que solo actue con los .gsm. Y por supuesto hacer un script bash adecuado; y puesto que sox te funciona, es sencillísimo, y hace maravillas, el script tan solo será uno o dos comandos.

----------

## JotaCE

Hola :

Mi instalacion es con un escritorio KDE-3.5.10 (overlay) un perfil desktop.

Solo un par de aplicaciones como firefox, kcalc, openoffice y twinkle.

Desconozco por completo como funcionan los scritps, pero si tengo claro que deberia ser algo que descarge mi archivo lo convierta a wav y lo reproduzca con mplayer usando kmplayer como frontend.

Saludos Cordiales

----------

## agdg

Por los scripts bash no hay problema; el mecanismo es más sencillo que el de un chupete.

```
#! /bin/bash

# /usr/bin/gsm2wav.sh

#Definimos variables. El fichero sobre el que actuar y el directorio donde se generará el wav temporal

FILE=`"$1"`

TEMP="~/Desktop/wav/"

# Si no existe el directorio wav en el escritorio, se crea. 

if [[ ! -d $TEMP ]] ; then mkdir "$TEMP" ; fi

#Si el fichero wav ya existe en el directorio, se reproduce via kmplayer

if [[ -f "$TEMP"/"${1%.*}.wav" ]] ; then kmplayer "$TEMP"/"${1%.*}.wav"

else 

# Usamos sox para convertir de gsm a wav; respetando el nombre original.

sox $1 ${1%.*}.wav

#Le decimos a kmplayer que abra el .wav

kmplayer "$TEMP"/"${1%.*}.wav"

fi
```

Salvo que me dejase algo, debería funcionar, siempre y cuando: tengamos una consola bash (la más normal en las distribuciones), sox y kmplayer.

Este sería el script; lo puedes probar guardándolo, dándole permisos de ejecución y escribiendo ./gsm2wav.sh /RUTA/fichero.gsm Para integrarlo con Dolphin, o el explorador que uses, deberás buscar algo similar a nautilus-actions. O bien, puedes probar asociaando los ficheros .gsm para que se abran con el script sh; de esa forma al hacer doble clic, de forma transparente al usuario, se transforma a wav y se abre kmplayer.

Ojo, que un wav no tiene compresión; aunque en principio nunca podrá haber ficheros wav repetidos (siempre se comprueba que no exista antes de convertir), si ves que la cosa se desmadra puede ser interesante reconvertir a un wav en mono con menos Hz... Y a las muy malas convertir a mp3 o similar, aunque puede que en este caso los tiempos de conversión se resientan dependiendo de tu micro y el fichero a convertir.

Como ya has visto, el script es muy sencillo y podrás adaptarlo facilmente a tu necesidades.

PD: Si ves que te da algún error, postealo.

----------

## JotaCE

```
localhost ~ $ gsm2wav.sh  q6001-20100901-102629-1283354768.144734.gsm

/usr/bin/gsm2wav.sh: line 5: q6001-20100901-102629-1283354768.144734.gsm: command not found

mkdir: cannot create directory `~/Desktop/wav/': No such file or directory

kmplayer: WARNING: resolveURL /home/usuario/~/Desktop/wav/q6001-20100901-102629-1283354768.144734.wav not found

mplayer -wid 39846427 -slave  -vo xv,sdl,x11 -ao alsa,oss,sdl,arts -framedrop  -contrast 0 -brightness 0 -hue 0 -saturation 0  '/home/usuario/~/Desktop/wav/q6001-20100901-102629-1283354768.144734.wav' -identify
```

Asi con todo el error el archivo gsm es convertido a wav/

kmplayer se abre en ejecucion pero no abre el archivo para reproducirlo, al parecer no encuentra la ruta.

----------

## archimd

 *JotaCE wrote:*   

> 
> 
> ```
> localhost ~ $ gsm2wav.sh  q6001-20100901-102629-1283354768.144734.gsm
> 
> ...

 

según entiendo tu problema debe de ser los signos (`) verifica en el script pues las variables deben ser declaradas con " y tu la tienes mal `~/Desktop/wav/'

----------

## agdg

Jeje, mea culpa. Más fallos que líneas tiene el script. Ahora el corregido.

```
#! /bin/bash

# /usr/bin/gsm2wav.sh

#Definimos variables. El fichero sobre el que actuar y el directorio donde se generará el wav temporal

FILE=${1##*/}

TEMP=~/Desktop/wav

# Si no existe el directorio wav en el escritorio, se crea.

if [[ ! -d $TEMP ]] ; then mkdir "$TEMP" ; fi

#Si el fichero wav ya existe en el directorio, se reproduce via kmplayer

if [[ -f "$TEMP"/"${FILE%.*}.wav" ]] ; then kmplayer "$TEMP"/"${FILE%.*}.wav"

else

# Usamos sox para convertir de gsm a wav; respetando el nombre original.

sox $1 "$TEMP"/"${FILE%.*}.wav"

#Le decimos a kmplayer que abra el .wav

kmplayer "$TEMP"/"${FILE%.*}.wav"

fi
```

Para los que tengan curiosidad, los fallos eran:

1.- mkdir: cannot create directory `~/Desktop/wav/': No such file or directory <--- La virulilla (~) no se esta traduciendo.

 TEMP="~/Desktop/wav/"  La virulilla (~) no se estaba traduciendo de forma normal, y era debido a los comillas. Eliminar las comillas soluciona el problema.

2.- kmplayer: WARNING: resolveURL /home/usuario/~/Desktop/wav/q6001-20100901-102629-1283354768.144734.wav not found   <--- Ruta hacia el fichero erronea.

En este caso se debe a un despiste, puesto que en ningún momento definí el nombre del fichero y por tanto el script tomaba el nombre del fichero junto con su ruta absoluta original (la ruta del .gsm). Se soluciona definiendo el nombre del fichero (sin ruta :_)   ---> FILE=${1##*/}

Espero que este sea el definitivo, saludos  :Wink: 

----------

## i92guboj

```
#! /bin/bash

# /usr/bin/gsm2wav.sh

PLAYER=/usr/bin/mplayer

FILE="$1" # nada de backticks aquí, eso es incorrecto en este caso

TEMP="$HOME/Desktop/wav/"

# tal como comprobamos $TEMP deberíamos comprobar $1

if [[ ! -f "$FILE" ]]; then exit 1; fi

# comillas también en -d, no solo en mkdir

if [[ ! -d "$TEMP" ]] ; then mkdir "$TEMP" ; fi

# Si el fichero wav ya existe en el directorio, se reproduce via $PLAYER

if [[ -f "$TEMP/${1%.*}.wav" ]]

then

        "$PLAYER" "$TEMP/${1%.*}.wav"

else

        # comillas again, probablemente queremos guardarlo en $TEMP también

        sox "$1" "$TEMP/${1%.*}.wav"

        "$PLAYER" "$TEMP/${1%.*}.wav"

fi
```

Eso es lo que he visto a ojo, no lo he probado porque no tengo archivos gsm ni ganas de buscarlos en la red.   :Very Happy: 

----------

## i92guboj

 *agdg wrote:*   

> 1.- mkdir: cannot create directory `~/Desktop/wav/': No such file or directory <--- La virulilla (~) no se esta traduciendo.

 

En este caso no hay problema en eliminar las comillas, siempre que no exista algún home dir tal como "/home/miguel ángel()/"  :Razz: 

Pero por si a alguien le interesa, para más info diré que '~' no se expande usando la expansión de variables (como es el caso de "$HOME"), sino con su particular mecanismo conocido como "Tilde expansion", para más info, la página man de bash (o tu shell, sea el que sea).

Podrías hacer esto:

```
TEMP=~/"resto del path con espacios"
```

Aunque yo prefiero la forma que he usado arriba:

```
TEMP="$HOME/resto del path con espacio o sin ellos"
```

Porque es algo más sólido con home dirs que no sigan el estándar y porque es más legible (y la legibilidad en cualquier script es algo de agradecer cuando lo tienes que editar a los dos años).

----------

## agdg

 *i92guboj wrote:*   

>  *agdg wrote:*   1.- mkdir: cannot create directory `~/Desktop/wav/': No such file or directory <--- La virulilla (~) no se esta traduciendo. 
> 
> En este caso no hay problema en eliminar las comillas, siempre que no exista algún home dir tal como "/home/miguel ángel()/" 

 

Cierto, es una posibilidad que se puede dar. Aunque la veo un poco remota: Crear un usuario (sin espacios, no están permitidos), crear manualmente la carpeta home con espacios y por último asignar la carpeta home con espacios al usuario creado. No creo que ningún "sysadmin" se complique tanto. Aunque es cierto que la posibilidad existe, así que en ese caso $HOME puede ser la solución. Buen apunte.

 *i92guboj wrote:*   

> Pero por si a alguien le interesa, para más info diré que '~' no se expande usando la expansión de variables (como es el caso de "$HOME"), sino con su particular mecanismo conocido como "Tilde expansion", para más info, la página man de bash (o tu shell, sea el que sea).

 

~ se expande, al igual que $HOME. De hecho ~ es capaz de expandirse fuera, no solo del terminal, sino del usuario cosa que $HOME no. Ejemplo:

```
[agd@agd-desktop tmp]$ echo ~

/home/agd

[agd@agd-desktop tmp]$ echo ~tv

/home/tv

[agd@agd-desktop tmp]$ echo ~monica

/home/monica

[agd@agd-desktop tmp]$ su -c "useradd -m -d /home/agd/Descargas down"

Contraseña: 

useradd: aviso: el directorio personal ya existe.

No se copia ningún fichero del directorio skel en él.

[agd@agd-desktop tmp]$ echo ~down

/home/agd/Descargas

[agd@agd-desktop tmp]$ su -c "userdel down"

Contraseña: 

[agd@agd-desktop tmp]$ echo ~down

~down

[agd@agd-desktop tmp]$ 
```

 *i92guboj wrote:*   

> 
> 
> # tal como comprobamos $TEMP deberíamos comprobar $1 
> 
> if [[ ! -f "$FILE" ]]; then exit 1; fi 

 

Siempre se puede hacer, aunque en este caso es innecesario puesto que el script esta creado para ser asociado con el explorador de ficheros. Es decir, solo si hacemos un clic determinado el script actuara, lo que implica que estamos haciendo clic sobre "algo" ($1). Tal vez sería más interesante comprobar que el fichero sobre el que hacemos clic es un fichero .gsm; por si por error el usuario asocia el script a un .mp3 y comienza a convertirlos en wav cada vez que los reproduce; se quedará sin espacios en 3 2 1 ...

PD: Yo tampoco tengo ningún .gsm. En la "segunda versión" depure el código usando los errores que posteo jotaCE. Y para verificar que todo estaba bien use "echo" para comprobar que haría lo que se suponía que debía hacer. Ahora JotaCE dirá si funciona o vuelve a petar.

----------

## i92guboj

 *agdg wrote:*   

> ~ se expande, al igual que $HOME.

 

No es el mismo mecanismo de expansión, es todo lo que quería ilustrar. Como ya dije, la expansión de tilde viene perfectamente explicada en la página man de bash y es distinta a la expansión de variables. El fin era ilustrar por qué la asignación de variable del script original no funcionaba (lo cual quedará perfectamente claro a quien lea el susodicho apartado en la man de bash).

----------

## agdg

 *i92guboj wrote:*   

> El fin era ilustrar por qué la asignación de variable del script original no funcionaba (lo cual quedará perfectamente claro a quien lea el susodicho apartado en la man de bash).

 

La asignación funciona en el script original. El único problema, como dije en el post anterior, son las comillas. Si se eliminan las comillas se elimina el problema de traducción de los caracteres especiales (como el usado: ~). Y como dije anteriormente, usar $HOME (como tu propones) en este caso es mejor por si las moscas.

Las diferencias de las que habla, y que explica la página man, son simples: Las variables de entorno, como $HOME, solo permiten recuperar su valor o cambiarlo. Las "Tilde expansion" (¿expansión de virgulilla? ¿expansión de ~?, no se que traducción queda peor) permiten expandir las variables de entorno; es decir, superamos las limitaciones de las variables de entorno.

Un ejemplo, es el que ya indique antes. $HOME hace referencia al home de nuestro usuario; con ~ podemos hacer referencia al home de cualquier usuario del sistema. De forma que si estamos como root y necesitamos acceder al Desktop de userx, podemos usar ~userx/Desktop en lugar de la ruta absoluta hasta el directorio home del usuario x.

----------

## JotaCE

Les agradezco a ambos su valioza ayuda, ya tengo el script funcionando.

Muchas gracias a Todos!!! D

----------

