[Python-es] pygame.mixer.music.set_pos no existe. ¿Alternativa?

Carlos Zuniga carlos.zun en gmail.com
Mie Feb 12 13:53:59 CET 2014


2014-02-10 18:30 GMT-05:00 Hector Garcia <hectorogarcia en gmail.com>:
> Buenas tardes. Soy medio principiante en python, agradezco su
> paciencia si estoy haciendo algo mal.
>
> Python 2.7.3 sobre Debian Wheezy
>
> pygame.ver
> Out[10]: '1.9.1release'
>
> Tengo un pequeño script, en donde, mediante pygame muestro algunas
> imágenes, y, aprovechando, la librería, le estoy agregando
> reproducción de archivos .ogg
>
> Le implementé un control de teclado por curses
>
> Pues bien, la reproducción de los archivos la hago con la siguiente rutina:
>
> def cargaaudio(current):
>   global pygame, file_list, num_files ,screen, espere, enreproduccion
>   archivo = file_list[current]
>   enreproduccion = current
>   pygame.mixer.music.stop()
>   screen.clear()
>
>   sleep(0.5)
>
>
>   song = pygame.mixer.music.load(archivo)
>   title='{0},   {1}/{2}'.format(os.path.basename(archivo), current, num_files-1)
>
>   # salida por curses
>   screen.addstr(0,1,'Reproduciendo: {0}'.format(title))
>   screen.refresh()
>   espere = False
>
>   pygame.mixer.music.set_volume(1)
>   pygame.mixer.music.play(0)
>
>
> En la rutina del control del teclado, le agregué un evento para
> avanzar la reproducción 10 segundos:
>
> def input_audio(event)
>   ....
>   ....
>   ....
>
>   if (event == ord(".")):
>       screen.addstr(2,0,'Avanzo 10 seg.')
>       screen.refresh()
>
>       posactual = pygame.mixer.music.get_pos()
>       posnueva = float(posactual + 10000) #milisegundos
>
>
>       pygame.mixer.music.set_pos(posnueva)
>
>
>
> Al ejecutar el script, Python me marca un error en la llamada a set_pos
>
> 'module' object has no attribute 'set_pos'
>
> Si analizo la librería desde ipython, efectivamente, no hay tal método.
>
> Buscando en google, me doy cuenta que el método play, acepta un
> argumento de posición (en segundos). Así que,
>
> 1. cambio el método cargaaudio para recibir la posición nueva desde el
> manejador de eventos.
>
> Alternativa:
> 2. Creo otra rutina más simple, sin cargar de nuevo el archivo, ni el
> stop o el delay de tiempo ( y la llamo desde input_audio, en lugar de
> la llamada a set_pos):
>
> def avanza(posnueva=0):
>   if ( posnueva > 0):
>     pos_segundos = float (posnueva/1000)
>     pygame.mixer.music.play(0, pos_segundos)
>     screen.addstr(3,0,'PosNueva:{0}'.format(pos_segundos))
>     screen.refresh()
>
> Entonces, al iniciar la reproducción, presiono el . y, efectivamente,
> la reproducción se va a pygame.mixer.music.get_pos + 10 segundos.
> Pero, ¡el contador de get_pos se reinicia a 0!. Un ejemplo
>
> Inicia reproducción. al rededor de los 15 segundos, presiono el [.]
> la reproducción se va a alrededor de 25 segundos.
>
> Aqui get_pos = 0
>
> Si, 3 segundos después, presiono [.], posactual = 3 +10 = 13 segundos,
> por lo que, la reproducción de la canción, se irá a alrededor del
> segundo 13. *no del segundo 25 + 13*
>
> ¿Algo estoy haciendo mal?
>
> Si a alguien le interesa el código completo, con gusto se los hago
> llegar; consta de casi 180 líneas, que no quise poner aquí, para no
> meter ruido innecesario.
>
> Gracias de antemano
>

Hola Hector, si miras la documentación de get_pos [0] dice:

This gets the number of milliseconds that the music has been playing
for. The returned time only represents how long the music has been
playing; it does not take into account any starting position offsets.

O sea, get_pos no te devuelve la posición actual en el archivo que
estas escuchando si no el tiempo que la musica ha estado corriendo.
Ejecutar play de nuevo hace que reinicie get_pos.

Esto es porque la música se carga por partes (streaming) en lugar de
cargar todo el archivo en memoria.

Si quieres obtener la posición, te recomendaría que guardes en una
variable el valor que le pasas a la función play y se lo sumes al
resultado de get_pos, aunque esto se complica si la musica esta
sonando en un bucle y el contador no reinicia, tendrías que probar
eso.

Saludos.


[0] http://www.pygame.org/docs/ref/music.html#pygame.mixer.music.get_pos
-- 
A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
de leer manuales.


Más información sobre la lista de distribución Python-es