Cómo jugar InputStream de un archivo de audio que no está dentro de una url o almacenamiento?

Fondo

He conseguido cargar un archivo de audio (3gp) en Google Drive.

Ahora quiero poder reproducir el archivo dentro de la aplicación.

La API de Google Drive solo permite obtener el flujo de entrada del archivo almacenado allí.

El problema

Todas las capacidades de MediaPlayer de las entradas no están disponibles en mi caso, que es sólo InputSteam:

Http://developer.android.com/reference/android/media/MediaPlayer.html#setDataSource(java.io.FileDescriptor)

Sé que puedo guardar el archivo de la unidad de Google en la memoria caché y reproducirlo, pero quiero evitar el manejo del almacenamiento y reproducir el archivo sobre la marcha.

Lo que he intentado

He intentado buscar este problema, y ​​sólo encontré que podría ser posible utilizando AudioTrack ( aquí ). También podría ser posible usar nuevas características Jelly-Bean (se muestra aquí , se encuentra aquí ), pero no estoy seguro ya que es muy bajo nivel.

Por desgracia, usando AudioTrack tengo sonidos equivocados jugando (ruido).

También he notado que MediaPlayer tiene la opción de establecer el origen de datos para ser MediaDataSource ( aquí ), pero no sólo no estoy seguro de cómo usarlo, también requiere API 23 y superior.

Por supuesto, he intentado usar una url que se da en Google Drive, pero esto sólo se utiliza para otros fines y no se dirige al archivo de audio, por lo que no se puede utilizar con MediaPlayer.

La pregunta

Dado un InputStream, ¿es posible usar AudioTrack o algo más, para reproducir un archivo de 3gp de audio?

¿Existe quizá una solución de biblioteca de soporte para esto?

Si su minSdkVersion es 23 o superior, puede utilizar setDataSource(MediaDataSource) y suministrar su propia subclase de la clase MediaDataSource abstract .

Para dispositivos más antiguos, debería ser capaz de utilizar un ParcelFileDescriptor creado desde ParcelFileDescriptor . Tendrías un subproceso que escribe datos en tu final de la canalización y pasará FileDescriptor (de getFileDescriptor() ) para el final del reproductor a setDataSource(FileDescriptor) .

Si pregunta acerca del reproductor de medios que define nuestra ruta de audio tal vez este código puede ayudar.

 File directory = Environment.getExternalStorageDirectory(); File file = new File( directory + "/AudioRecorder" ); String AudioSavePathInDevice = file.getAbsolutePath() + "/" + "sample.wav" ; mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(AudioSavePathInDevice); mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.start(); 
  • La notificación push de Google Play para la actualización de la aplicación no se ha enviado con fiabilidad. ¿Me estoy perdiendo de algo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.