2010-12-10 16 views

Respuesta

12

El tamaño de la memoria intermedia está copiado en el firmware. Todo lo que puede hacer es controlar cuánto se llena el búfer, e incluso eso es solo en porcentajes.

¡Lo siento!

+2

No realmente/solo Como vi en el Código de Google, hay un Método 'public booleansetParameter (int key, int value)' que te permite hacer esto si conoces el valor de la clave (los tengo para dispositivos RK).Desafortunadamente no puedo encontrar una forma de llamar a este método (aunque es público), pero lo encontraré, ¡debe haber una forma de hacerlo! – bluewhile

+0

@bluewhile ¿encontró la forma de hacer esto? – w2lame

+2

No, terminé llorando porque perdí varias grandes ofertas solo por la ignorancia de Google. – bluewhile

3

El problema aparece cuando se transmite contenido en vivo, por ejemplo: radio por Internet en vivo. Como contenido en vivo no puedo calcular nada porque la longitud de la pista es infinita y los métodos onBuffering en MediaPlayer nunca se llaman.

Mi intención es establecer un búfer en función del factor de velocidad de bits para optimizar los recursos y aumentarlo para evitar las desconexiones 3G. Bueno, realmente no puedo evitar las desconexiones 3G, pero quiero decir que puedo hacer que esta conexión sea más larga para mantener la transmisión más activa para el usuario final.

Así que creo que puedo codificar un proxy Java para conectarme a contenido en vivo y establecer mi propio tamaño de búfer dependiendo de la tasa de bits, luego pasar este proxy como url en MediaPlayer y reproducir el contenido.

Pero antes de comenzar a codificar esto, quiero saber si hay otro método u otro truco mejor que pueda aplicar a MediaPlayer para resolver este problema.

+0

Hola Josh, ¿cómo resolviste el problema, usaste un proxy de transmisión? – burakk

4

Esto puede ser no del todo relevantes para su problema específico, pero tal vez alguien más se verá favorecido por la siguiente:

Sólo necesito saber el tamaño de la memoria intermedia está. Supongo que es una cantidad fija de bytes, en lugar de una cantidad fija de tiempo de reproducción.

Para obtener una estimación del tamaño del búfer de audio/video, puede implementar un OnBufferingUpdateListener para detectar cuándo el búfer está completamente lleno y usar TrafficStats para determinar cuántos bytes ha consumido su transmisión entre el inicio del flujo y el búfer llenándose Esto debería ser un indicador del tamaño de la memoria intermedia utiliza MediaPlayer ...

+3

¿no es triste que tengamos que recurrir a esta basura para realizar tareas básicas? – StackOverflowed

+0

buen consejo, gracias. votacion – sandalone

10

El tamaño se establece en marcos/base/media/libstagefright/include/NuCachedSource2.h

kDefaultHighWaterThreshold y kDefaultLowWaterThreshold subió entre Android 2.3.7 y Android 4.0.4 el tamaño del búfer creció por el factor 8, como se indica en este hilo Android - MediaPlayer Buffer Size in ICS 4.0

Se necesitaría una ROM personalizada.

Android 2.3.7

enum { 
    kPageSize   = 65536, 
    kHighWaterThreshold = 5 * 1024 * 1024, 
    kLowWaterThreshold = 512 * 1024, 

    // Read data after a 15 sec timeout whether we're actively 
    // fetching or not. 
    kKeepAliveIntervalUs = 15000000, 
}; 

Android 4.0.4

enum { 
    kPageSize      = 65536, 
    kDefaultHighWaterThreshold  = 20 * 1024 * 1024, 
    kDefaultLowWaterThreshold  = 4 * 1024 * 1024, 

    // Read data after a 15 sec timeout whether we're actively 
    // fetching or not. 
    kDefaultKeepAliveIntervalUs  = 15000000, 
}; 

Si importa este tema, entonces tal vez usted está interesado en el informe de error https://code.google.com/p/android/issues/detail?id=29870

Cuestiones relacionadas