2010-06-27 11 views
5

tengo una caja de resonancia es solo una pantalla con aproximadamente 8 botones. cada botón individual tendrá su propio sonido que se reproducirá al presionar el botón . Hay un par de formas en que podría reproducir el sonido, como el sonido del sistema SystemSound o AVAudioPlayer hasta ahora parece tener los tiempos de respuesta más rápidos, el avadomista es bastante lento, no puede mantenerse si el usuario toca los botones muy rápido, creé un reproductor de audio para cada sonido que era bastante complicado. así es como im que juegan los sonidos en el momento el archivo .h¿cuál es la mejor manera de reproducir el sonido rápidamente cuando el botón rápido presiona xcode?

@interface MainScreenViewController : UIViewController <AVAudioPlayerDelegate, UITabBarControllerDelegate> { 
AVAudioPlayer *player; 
CFURLRef keNURL; 
SystemSoundID keNObject; 
//KE LOUD 
CFURLRef keLURL; 
SystemSoundID keLObject; 
//GE NORMAL 
CFURLRef geNURL; 
SystemSoundID geNObject; 
//GE LOUD 
CFURLRef geLURL; 
SystemSoundID geLObject; 
//NA NORMAL 
CFURLRef naNURL; 
SystemSoundID naNObject; 
//NA LOUD 
CFURLRef naLURL; 
SystemSoundID naLObject; 
//RA 
CFURLRef raURL; 
SystemSoundID raObject; 
//DAGGA CLICK 
CFURLRef daCURL; 
SystemSoundID daCObject; 
//TILLI CLICK 
CFURLRef tiCURL; 
SystemSoundID tiCObject; 

} 
@property (nonatomic, retain) AVAudioPlayer *player; 
@property (readwrite) CFURLRef  keNURL; 
@property (readonly) SystemSoundID keNObject; 
@property (readwrite) CFURLRef  keLURL; 
@property (readonly) SystemSoundID keLObject; 
@property (readwrite) CFURLRef  geNURL; 
@property (readonly) SystemSoundID geNObject; 
@property (readwrite) CFURLRef  geLURL; 
@property (readonly) SystemSoundID geLObject; 
@property (readwrite) CFURLRef  naNURL; 
@property (readonly) SystemSoundID naNObject; 
@property (readwrite) CFURLRef  naLURL; 
@property (readonly) SystemSoundID naLObject; 
@property (readwrite) CFURLRef  raURL; 
@property (readonly) SystemSoundID raObject; 
@property (readwrite) CFURLRef  daCURL; 
@property (readonly) SystemSoundID daCObject; 
@property (readwrite) CFURLRef  tiCURL; 
@property (readonly) SystemSoundID tiCObject; 
} 

entonces las acciones que se puede escuchar los sonidos individuales

entonces el archivo .m, después de importar el archivo .h y el derecho El cuadro funciona y sintetiza todas las variables, escriba el código para la acción y esto es lo que está en las acciones individuales.

-(IBAction)geSound{ 
AudioServicesPlaySystemSound (self.geNObject); 
} 

solo quería saber si systemsound es el camino a seguir para crear una caja de resonancia. gracias especialmente cuando el usuario tocará el tablero alternando muy rápido entre beats. . si no, ¿cuál es la mejor manera de reproducir el sonido que responde muy bien?

+0

Xcode es solo un IDE: ¿presumiblemente está hablando de Mac OS X (Cocoa) o iPhone (CocoaTouch)? –

+0

he respondido mi propia pregunta. Mira abajo. – Pavan

Respuesta

2

22/03/2014 - Actualización: Deshágase de mi publicación excesivamente emocionada (que fue escrita hace mucho tiempo) y actualizada para mostrar una respuesta más apropiada.

Tuve que lograr un control preciso sobre el audio, opté por usar OpenAL. WOW es una forma de resumirlo. Tan pronto como me propuse usar OpenAL, requirieron un poco de trabajo extra, obteniendo todos los métodos necesarios implementados y configurando todo; Me encontré con prácticamente ninguna latencia notable en absoluto. Estoy absolutamente satisfecho con los excelentes resultados.

Pude lograr un control preciso y sin latencia en absoluto. Recuerdo saltar de alegría en el momento en que lo tenía funcionando.

Estos son los recursos que utilicé que ayudó a aliviar el esfuerzo de implementar OpenAL por primera vez:

  1. OpenAL on the iPhone
  2. Fue a causa de this linkthis video tutorial que yo era capaz de crear un sonido excelente gerente singleton. Esto me permitió reproducir todos los sonidos que necesitaba de cualquier clase que quisiera con poco manejo de sonido, el singleton se encargó de todo por mí.

Humildemente sugiero a todos a utilizar OpenAL si requiere un control preciso sobre su audio, y más importante aún si necesita una latencia baja en la demanda de audio, especialmente para juegos cuando se necesita para asegurarse de sonido se reproduce allí y luego cuando lo requiera y lo espere, una aplicación basada en audio, por ejemplo.

+0

'este enlace' está muerto. ¿Quieres resumir lo que dijo? – Gyfis

+0

@Gyfis El enlace ha sido actualizado. Es un buen video tutorial. Le insto a que lo vea para comenzar a trabajar con OpenAL realmente rápido. – Pavan

8

Hablando desde la experiencia, AVAudioPlayer funciona bastante bien al reproducir varios sonidos al mismo tiempo o muy rápidamente uno después del otro. La mejor manera de usarlo es simplemente crear un método que alimente en un NSString para reproducir algún sonido con el nombre guardado en ese NSString ... de esa manera, creará un nuevo reproductor para cada archivo de sonido que toque. Tenga cuidado de liberar a los jugadores asignados, a menos que sepa que ha terminado con ellos.

A menos que tenga archivos de sonido muy grandes que pueden tardar un segundo en almacenarse en búfer (tendrá que averiguar por sí mismo si puede vivir con latencia o no), nunca he tenido ningún problema con que sea lento. Si es lento, es probable que hacer algo en contra de las recomendaciones de Apple en lo que respecta a la decodificación de ciertos archivos (es decir, para múltiples sonidos a la vez, Apple recomienda el formato CAF ya que es el hardware decodifica contra el software decodificado): http://developer.apple.com/iphone/library/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html

actualización

Así es como codigo mis archivos con un script de shell. Ponlo en un archivo llamado batchit.sh en su propio directorio. A continuación, coloque los archivos .WAV que desee codificar como un archivo .CAF en ese directorio. Abra el Terminal en su Mac, cd en ese directorio y escriba sh batchit.sh y deje que lo haga. Será convertir por lotes todos los archivos ... Aquí está el código:

for f in *; do 
if [ "$f" != "batchit.sh" ] 
then 
    /usr/bin/afconvert -f caff -d ima4 $f 
    echo "$f converted" 
fi 
done 

Aquí es un proyecto de ejemplo ... http://www.megaupload.com/?d=5NP6FHR1

Aviso Yo no hice nada en el método audioPlayerDidFinishPlaying que es un método delegado de AVAudioPlayer. Necesitará agregar código para liberar adecuadamente a los jugadores después de que cada uno haya terminado de reproducirse (hey, no puedo hacer todo el trabajo por usted :) para que toda la memoria se asigne correctamente. De lo contrario, eventualmente se acabará si indefinidamente sigues creando jugadores sin soltarlos. Como parece que estás teniendo un día difícil ... mira debajo para ver una gran pista.

Eso es toda la ayuda que puedo dar sin embargo. Tienes que aprender & ganan el resto

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { 

    // do something here if you want.. you know like maybe release the old players by uncommenting the line below :) 

    //[player release]; 

} 
+0

muchas gracias por su respuesta. lo que hice antes fue crear un reproductor de audio para cada archivo de osund individual y luego escribir [sound1 play]; al hacer clic en el botón y cuando hice tapping con los botones algunas veces los sonidos se perdieron la reproducción y así sucesivamente y algunas veces sí se reproducían. Son sonidos muy cortos. es como una caja de resonancia de batería. de todos modos, ¿entonces el código que ha proporcionado no es demasiado para ejecutar cada vez que hago clic en uno de los botones para reproducir el sonido? especialmente cuando el usuario va a tocar en la caja de resonancia? – Pavan

+0

¿En qué formato de archivo estaban los archivos? ¿Eran un archivo .caf o un .mp3 o .wav, etc.? Eso hace una gran diferencia en cuanto a ser lento para jugar. Si los convierte en .caf no deberían tener ningún problema y he tenido más de 10 sonidos que se reproducen muy rápido al mismo tiempo o uno después del otro sin problemas. Cuando crea el archivo de sonido, asegúrese de eliminar todos los silencios muertos al comienzo del archivo de sonido para que el sonido comience de inmediato. Recuerde también que una vez que crea un solo jugador, ese jugador se vuelve a utilizar cada vez que se reproduce el sonido a menos que lo suelte. – iwasrobbed

+0

ok ive convirtió todos los sonidos en archivos caf, reduce el tamaño del archivo de 630 kb a aproximadamente 12 kb, lo cual es fantástico, ya que pensé que esta era definitivamente la causa de que mi aplicación reprodujera los sonidos al presionar rápidamente los botones con retraso. Pensé que id también cambiar a AVAudioPlayer por uno de mis botones como prueba, ya que no funcionaba reproducir los archivos caf con systemsound. Ahora cuando toco un botón largo, el sonido aún se reproduce con retraso, incluso más lento que cuando estaba usando systemsound. ¿QUÉ PASA? De verdad quiero que esto funcione. – Pavan

0

podría crear AVAudioPlayer para cada sonido y luego hacer una pausa/reproducirlo.

+0

he intentado eso, y todavía reproduce el sonido lento. lo juega más lento que systemsound ahora. No hay silencio al comienzo del archivo. es solo un archivo de 1 segundo. ¿alguien me puede ayudar, por favor? – Pavan

0

¿Ha intentado reproducir cada sonido en su propio hilo? Podrías probar un básico NSOperation

+0

su problema radica en cómo está codificando los archivos de sonido. los frameworks están haciendo lo que se supone que deben hacer, pero solo necesita codificarlos correctamente y funcionará. – iwasrobbed

+0

Eso es exactamente lo que era. Gracias por su publicación actualizada, seguí su conversión a ima4 y funcionó a las mil maravillas. cómo supiste que era debido a mis sonidos porque todavía están .caf – Pavan

1

Solo vamos a agregar para el beneficio de otros, aunque esto es 2 años después del problema.

He encontrado que si son sonidos cortos, estarás bien (ish) en la carga de tu aplicación. almacenar todas las pistas ejecutando una instancia de prepararse para reproducir para cada sonido (en un ciclo for) (luego soltar: solo lo suficiente para que su procesador recuerde dónde está el archivo)

Esto le quita el tiempo de carga inicial la próxima vez usted se pone manos a la obra y deja que los sonidos comiencen más rápidamente

+0

hola gracias por publicar una respuesta. Si mires mi respuesta a la pregunta, verás cómo he lidiado con esto. hasta ahora todavía uso el mismo método. – Pavan

Cuestiones relacionadas