Acceso al flujo de medios de Android para la visualización de audio
Básicamente, quiero hacer un visualizador de audio. Sé que es posible, porque mi teléfono viene con unos fondos de pantalla en vivo que lo hacen. El problema es que no puedo averiguar cómo hacerlo con la API de Android.
Mi aplicación recogería el stream de medios actualmente en reproducción y, dependiendo del volumen que se esté reproduciendo en ese momento, mostraría más o menos barras en la pantalla.
- Juego de Multitouch de Android
- Convertidor de gson retrofit para json anidado con diferentes objetos
- El soporte de NDK es una característica experimental y todos los casos de uso aún no son compatibles con el error en Android Studio?
- Cámara androide estirada en modo horizontal
- ¿Cómo sé si mi mensaje de GCM es lo suficientemente pequeño (<4kb) para enviar? (Cómo obtener el tamaño de la cadena?)
¿Cómo puedo hacer esto? Parece que podría hacer algo como esto con el micrófono, pero quiero poder hacerlo por música, podcasts, etc.
- La vinculación de datos de Android pasa los argumentos al método onClick
- No puede importar java.awt.geom en eclipse
- ¿Cuál es el propósito de la anotación Android @Widget?
- Android obtiene actividad desde una clase anónima
- ¿Cómo evitar la espera en el hilo principal cuando se añaden los encabezados a las solicitudes de retrofit?
- ¿Cómo hacer una solicitud de POST utilizando retrofit 2?
- Cómo instanciar la clase de fragmento usando el nombre de la clase en lugar del índice
- Android Studio - Gradle: La ejecución falló para la tarea ': Foo: dexDebug' - pero ¿por qué?
La fuente de papel tapiz de MusicVisualization está disponible en el AOSP . Básicamente parece implicar llamar a MediaPlayer.snoop()
, un método indocumentado añadido en Eclair.
Parece que en 2.3 las cosas han cambiado aquí, hay permisos ahora
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
Y hay una clase de ayudante de AudioCapture en losp para ayudar a los fondos de pantalla en vivo a hacerlo correctamente. https://android.googlesource.com/platform/packages/wallpapers/MusicVisualization/+/gingerbread-release/src/com/android/musicvis/AudioCapture.java
Editar:
Una de las importaciones en la AOSP no coincide con la API pública.
import android.media.audiofx.Visualizer;
es
import android.media.Visualizer;
Si da un dolor de cabeza asegúrese de cambiar. Esto es todo 2.3 api, al parecer, devuelve un flujo de audio de baja resolución para viz, pero no es lo suficientemente bueno para la grabación.
Básicamente lo que dijo roskit excepto con una modificación de valor de retorno menor de
return 0;
a
return Integer.parseInt( (m.invoke(c, outData, kind)).toString() );
En otras palabras:
public static int snoop(short [] outData, int kind){ try { Class c = MediaPlayer.class; Method m = c.getMethod("snoop", outData.getClass(), Integer.TYPE); m.setAccessible(true); return Integer.parseInt( (m.invoke(c, outData, kind)).toString() ); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return 1; } }
Un snoop()
ligeramente más rápido snoop()
sería llamar a Class.getMethod()
una vez, y luego usar un parseInt()
lugar de Integer.parseInt()
…
private static Method mSnoop; //..(http://nadeausoftware.com/node/97).. private static int customParseInt( final String s ) { // Check for a sign. int num = 0; int sign = -1; final int len = s.length( ); final char ch = s.charAt( 0 ); if ( ch == '-' ) sign = 1; else num = '0' - ch; // Build the number. int i = 1; while ( i < len ) num = num*10 + '0' - s.charAt( i++ ); return sign * num; } private static int snoop(short [] outData, int kind) { if ( mSnoop != null ) { try { return customParseInt( (mSnoop.invoke( MediaPlayer.class , outData, kind)).toString() ); } catch ( Exception e ) { Log.e( TAG, "Failed to MediaPlayer.snoop()!", e ); return 1; } } else { try { Class c = MediaPlayer.class; Method m = c.getMethod("snoop", outData.getClass(), Integer.TYPE); m.setAccessible(true); mSnoop = m; return customParseInt( (m.invoke(c, outData, kind)).toString() ); } catch (Exception e) { Log.e( TAG, "Failed to MediaPlayer.snoop()!", e ); return 1; } } }
Así es como lo hice desde mi aplicación:
protected short [] mAudioData = new short[1024];
Luego en el bucle:
int res = snoop(mAudioData, 0);
Y aquí está la función en sí:
public static int snoop(short [] outData, int kind){ try { Class c = MediaPlayer.class; Method m = c.getMethod("snoop", outData.getClass(), Integer.TYPE); m.setAccessible(true); m.invoke(c, outData, kind); return 0; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return 1; } }
Consulte http://code.google.com/p/moonblink/wiki/Tricorder para obtener un ejemplo.
- Desarrollador de Android "Subir nuevo APK a la producción 99% completa" y pegado
- Los servicios de Google Play están desactualizados. Requiere 9256000 pero encontrado 9080470