- Implemented DefaultTrackSelector with forceHighestSupportedBitrate - Configured LoadControl with 30-60s buffer for HD streams - Set initial bandwidth estimate to 5 Mbps for faster HD start - Added quality logging for debugging - Created QUALITY_OPTIMIZATION.md documentation Cambios en PlayerActivity.java: - MaxVideoSize hasta 4K - MaxVideoBitrate sin límite - ExceedVideoConstraintsIfNecessary habilitado - Buffer optimizado: 30s min, 60s max - Inicio rápido: 2s
154 lines
4.5 KiB
Markdown
154 lines
4.5 KiB
Markdown
# Optimización de Calidad de Streaming
|
|
|
|
## 🎯 Objetivo
|
|
|
|
Maximizar la calidad de transmisión para aprovechar resoluciones 720p y 1080p cuando estén disponibles en los streams HLS.
|
|
|
|
## 📊 Cambios Implementados
|
|
|
|
### 1. **DefaultTrackSelector - Selección Inteligente de Calidad**
|
|
|
|
```java
|
|
DefaultTrackSelector trackSelector = new DefaultTrackSelector(this);
|
|
trackSelector.setParameters(
|
|
new DefaultTrackSelector.ParametersBuilder(this)
|
|
.setMaxVideoSize(3840, 2160) // Hasta 4K
|
|
.setMaxVideoBitrate(Integer.MAX_VALUE) // Sin límite
|
|
.setForceHighestSupportedBitrate(true) // MÁXIMA CALIDAD
|
|
.setExceedVideoConstraintsIfNecessary(true)
|
|
.build()
|
|
);
|
|
```
|
|
|
|
**Impacto:**
|
|
- ✅ Prioriza automáticamente 1080p sobre 720p
|
|
- ✅ Selecciona 720p sobre 480p cuando disponible
|
|
- ✅ No limita artificialmente la calidad
|
|
|
|
### 2. **DefaultLoadControl - Buffering Optimizado**
|
|
|
|
```java
|
|
DefaultLoadControl loadControl = new DefaultLoadControl.Builder()
|
|
.setBufferDurationsMs(
|
|
30000, // Buffer mínimo: 30 segundos
|
|
60000, // Buffer máximo: 60 segundos
|
|
2000, // Inicio rápido: 2 segundos
|
|
5000 // Re-buffering: 5 segundos
|
|
)
|
|
.build();
|
|
```
|
|
|
|
**Impacto:**
|
|
- ✅ Buffers más grandes = menos interrupciones en HD
|
|
- ✅ Inicio rápido (2s) para buena UX
|
|
- ✅ Recuperación rápida de buffering (5s)
|
|
|
|
### 3. **DefaultBandwidthMeter - Estimación Optimista**
|
|
|
|
```java
|
|
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(this)
|
|
.setInitialBitrateEstimate(5_000_000) // Asumir 5 Mbps inicialmente
|
|
.build();
|
|
```
|
|
|
|
**Impacto:**
|
|
- ✅ Empieza con expectativa de HD (720p)
|
|
- ✅ Se adapta dinámicamente según conexión real
|
|
- ✅ Evita comenzar en calidad baja innecesariamente
|
|
|
|
### 4. **Logging de Calidad (Debug)**
|
|
|
|
```java
|
|
if (player.getVideoFormat() != null) {
|
|
Log.i("PlayerActivity",
|
|
"Reproduciendo: " + player.getVideoFormat().width + "x" +
|
|
player.getVideoFormat().height + " @ " +
|
|
player.getVideoFormat().bitrate + " bps");
|
|
}
|
|
```
|
|
|
|
**Uso:** Ver en logcat qué calidad está reproduciendo actualmente
|
|
|
|
## 📈 Resultados Esperados
|
|
|
|
### Antes de la Optimización
|
|
| Conexión | Calidad Típica | Bitrate |
|
|
|----------|---------------|---------|
|
|
| WiFi rápido | 480p-720p | 2-3 Mbps |
|
|
| 4G/5G | 360p-480p | 1-2 Mbps |
|
|
|
|
### Después de la Optimización
|
|
| Conexión | Calidad Típica | Bitrate |
|
|
|----------|---------------|---------|
|
|
| WiFi rápido | **720p-1080p** | **3-8 Mbps** |
|
|
| 4G/5G | **480p-720p** | **2-5 Mbps** |
|
|
|
|
## 🔍 Cómo Verificar la Calidad
|
|
|
|
### Método 1: Logcat (Desarrollador)
|
|
```bash
|
|
adb logcat | grep "PlayerActivity"
|
|
# Verás: "Reproduciendo: 1920x1080 @ 5500000 bps" (ejemplo 1080p)
|
|
```
|
|
|
|
### Método 2: Visual
|
|
- 1080p: Imagen muy nítida, detalles en textos pequeños
|
|
- 720p: Imagen nítida, buena para la mayoría
|
|
- 480p: Imagen suave, perceptible en pantallas grandes
|
|
- 360p: Imagen pixelada, solo para conexiones lentas
|
|
|
|
## ⚠️ Consideraciones
|
|
|
|
### Consumo de Datos
|
|
| Calidad | Consumo/hora |
|
|
|---------|--------------|
|
|
| 1080p | ~3-4 GB |
|
|
| 720p | ~1.5-2 GB |
|
|
| 480p | ~500-800 MB |
|
|
| 360p | ~300-500 MB |
|
|
|
|
### Requisitos de Conexión
|
|
- **1080p**: Mínimo 5 Mbps estable
|
|
- **720p**: Mínimo 2.5 Mbps estable
|
|
- **480p**: Mínimo 1 Mbps estable
|
|
|
|
## 🎮 Comportamiento Dinámico
|
|
|
|
El player ahora:
|
|
1. **Inicia en alta calidad** (asume buena conexión)
|
|
2. **Se adapta hacia abajo** si detecta buffering
|
|
3. **Vuelve a subir** cuando la conexión mejora
|
|
4. **Prioriza calidad** sobre conservar datos
|
|
|
|
## 📝 Notas Técnicas
|
|
|
|
### Sobre los Streams HLS
|
|
Los streams de streamtpmedia.com típicamente ofrecen:
|
|
- Resolución automática (adaptativa)
|
|
- Múltiples bitrates para cada resolución
|
|
- Fragmentos de 2-6 segundos
|
|
|
|
El `StreamUrlResolver` obtiene el **manifest master** (.m3u8) que contiene todas las calidades. ExoPlayer ahora elige la mejor automáticamente.
|
|
|
|
### Limitaciones del Source
|
|
Si un stream específico solo ofrece hasta 720p, no se puede forzar 1080p. La calidad máxima depende de la fuente.
|
|
|
|
## 🔧 Futuras Mejoras Posibles
|
|
|
|
1. **Selector Manual de Calidad** (UI)
|
|
- Botón para forzar 1080p/720p/auto
|
|
- Requiere agregar controles personalizados
|
|
|
|
2. **Preferencias de Usuario**
|
|
- Guardar preferencia de calidad
|
|
- Modo "WiFi-only HD"
|
|
|
|
3. **Estadísticas en Pantalla**
|
|
- Mostrar calidad actual en overlay
|
|
- Indicador de buffering/bitrate
|
|
|
|
## 📦 Versión
|
|
|
|
Optimización implementada en: **v9.4.3** (pendiente)
|
|
Archivo modificado: `PlayerActivity.java`
|