¿Cómo uso android.media.MediaDataSource personalizado junto con android.media.MediaPlayer?

Sé de AndroidMediaPlayer Es una gran cosa. Nos permite reproducir archivos locales, así como secuencias de medios. Y es bastante fácil de usar (solo por ejemplo):

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource("http://streaming.shoutcast.com/80sPlanet"); // this steam broadcasts audio/mpeg
mediaPlayer.prepareAsync();
mediaPlayer.start();

Es posible establecer diferentes tipos de DataSource llamando al sobrecargadosetDataSource() con diferentes conjuntos de parámetros. Y hay un prototipo interesante de esta función:

void setDataSource(MediaDataSource dataSource) 

Parece que es posible anular por completo elDataSource con su propia implementación Y funciona de hecho:

import android.media.MediaDataSource;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.HttpURLConnection;

public class UrlMediaDataSource extends MediaDataSource {
    URL url;
    HttpURLConnection connection;
    BufferedInputStream stream;

    public UrlMediaDataSource(URL url) throws IOException {
        this.url = url;
        connection = (HttpURLConnection) url.openConnection();
    }

    @Override
    public long getSize() {
        return 0;
    }

    @Override
    public int readAt(long position, byte[] buffer, int offset, int size) throws IOException {
        if (stream == null)
            stream = new BufferedInputStream(connection.getInputStream());
        return stream.read(buffer, offset, size);
    }

    @Override
    public void close() throws IOException {
        stream.close();
        stream = null;
        connection.disconnect();
        connection = null;
    }
}

y en el código principal:

UrlMediaDataSource dataSource = new UrlMediaDataSource(new URL("http://streaming.shoutcast.com/80sPlanet"));
mediaPlayer.setDataSource(dataSource);

Sí, esto funciona bien. Pero si trato de transmitir audio / aacp (por ejemplo: "http://111.223.51.8:8005"- es la radio" COOLfahrenheit 93 "), el reproductor no reproduce. Logcat trace:

06-07 23:26:01.680 1352-1147/? E/GenericSource: Failed to init from data source!
06-07 23:26:01.681 1352-1093/? D/NuPlayerDriver: notifyListener_l(0xf3e051e0), (100, 1, -2147483648)
06-07 23:26:01.735 1352-2013/? D/NuPlayerDriver: reset(0xf3e051e0)
06-07 23:26:01.735 1352-2013/? D/NuPlayerDriver: notifyListener_l(0xf3e051e0), (8, 0, 0)
06-07 23:26:01.736 1352-1093/? D/NuPlayerDriver: notifyResetComplete(0xf3e051e0)

Sin embargo, la URL funciona bien (se reproduce la música) cuando no hay una costumbreMediaDataSource se usa:

mediaPlayer.setDataSource("http://111.223.51.8:8005");

¿Alguien sabe la forma correcta de gestionar esto? Simplemente no me propongas usar elURL directamente - Necesito una costumbreMediaDataSource para acceder a los datos sin procesar de la secuencia.

Respuestas a la pregunta(1)

Su respuesta a la pregunta