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

Hector Garcia hectorogarcia en gmail.com
Mar Feb 11 00:30:37 CET 2014


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

Saludos!!


-- 
Hector
--
El Pic no pudo Iniciar correctamente.
Inserte el disco de arranque y presione cualquier pin para continuar...

Linux Registered User #467500
https://linuxcounter.net/user/467500.html


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