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

2014-02-13 Por tema Hector Garcia
El día 12 de febrero de 2014, 6:53, Carlos Zuniga
carlos@gmail.com escribió:
 2014-02-10 18:30 GMT-05:00 Hector Garcia hectorogar...@gmail.com:
...

 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.


Gracias Carlos, no había notado ése pequeño detalle.

En realidad, quiero implementar un avance (o retroceso) corto en la
canción que se reproduce, de, por ejemplo, 10 segundos. Algo parecido
a mplayer, al presionar las flechas izquierda o derecha.

Por alguna razón que no entiendo, mi pygame no expone la función
set_pos. Me estoy imaginando que viene desde la versión de SDL que
tengo con Wheezy(1.2). No tengo muchas ganas de compilar e instalar
la SDL2 sólo para probar si se soluciona con ello.

De momento, estoy analizando los manuales de gstreamer, a ver si por
allí le pego. Sólo que, manejan sus ejemplos muy pegados con GTK, y,
como no estoy haciendo un reproductor gráfico, se me complica un poco
su interpretación.

Si alguien considera que existe alguna otra librería, que me permita
reproducir archivos ogg  desde consola, con la posibilidad de avance
por pasos, (o ejemplos en la red de gstreamer, sin GTK) le agradecería
muchísimo un cable.

Gracias de nuevo

Saludos cordiales


-- 
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
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


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

2014-02-12 Por tema Carlos Zuniga
2014-02-10 18:30 GMT-05:00 Hector Garcia hectorogar...@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 + 1) #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.
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


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

2014-02-10 Por tema Hector Garcia
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 + 1) #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
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/