Repository navigation
Releases: jopsis/InputStreamPlayer
Releases · jopsis/InputStreamPlayer
Release list
v0.9.28
- Un perfil Dolby Vision 5 se ve morado y verdoso con ExoPlayer en una Bravia
VH21 y bien con mpv, sin que el log diga si la tele anuncia Dolby Vision
(«BRAVIA 4K VH21» es una plataforma compartida por modelos con y sin él). El
encabezado del registro lleva ahora «Pantalla:» (tipos HDR que declara, la
misma consulta que usa ExoPlayer para elegir decodificador) y «Decodificadores
Dolby Vision:» con los perfiles de cada uno. - Prueba: con ExoPlayer, si el vídeo es HDR o Dolby Vision la ventana pide
COLOR_MODE_HDR(y lo deja en el de siempre al salir), por si la tele no
entraba en su modo HDR con el decodificador Dolby Vision. La Sony
XR-75X90K sí anuncia Dolby Vision; no hay certeza de que ésta sea la causa.
Compila; sin probar en aparato (no hay esa Bravia a mano).
v0.9.27
- Un usuario con una Bravia VH21 veía mal los colores de una película con
ExoPlayer y bien con mpv. El registro no decía nada: en producción ExoPlayer
no escribía el decodificador ni el formato, solo en depuración. Ahora, al
abrir el vídeo, deja en el registro el decodificador elegido y el formato
(códec, tamaño, bitrate y primarios/transferencia/rango de color). No cambia
la reproducción; solo sirve para diagnosticar el siguiente log. Lo único que
se sabía de la película por el lado de mpv: H.264 1080p SDR, BT.709, rango
limitado, conOMX.MTK.VIDEO.DECODER.AVC.
v0.9.26
Aviso de un usuario de Apple TV.
- Preferencias: la pantalla no tenía desplazamiento vertical y no cabía:
empezaba a media tarjeta de OpenGL/Sistema y no bajaba de «Red». Ahora va en
unScrollView. - Fuentes y Guías EPG: el foco de tvOS solo baja a lo que tiene justo
debajo, y bajo «Cerrar» o el campo del nombre no había nada enfocable (el
icono de la tarjeta, el título de la fila). Cabecera, tarjeta de añadir y
cada fila son ahorafocusSection: desde cualquier botón se baja y se sube. - Guía: desde «Antes» no se bajaba a la rejilla (debajo están los nombres
de los canales); ahora sí. La guía abre con el foco en lo que se emite en el
primer canal en vez de en «Cerrar». La franja pasa de cuatro a dos horas,
como en iPad y Android, y la rejilla llega al borde de abajo en vez de
cortarse a media fila dejando una franja libre. --ui-testing-show-guide-sourcesabre la gestión de guías para pruebas.- Probado en el simulador de Apple TV 4K pulsando el mando desde un test de
interfaz (XCUIRemote); no en un Apple TV real.
v0.9.25
- Un MKV Dolby Vision perfil 7 (
dvhe.07.06, el de los UHD) en una Shield:
el aviso de la 0.9.24 saltó bien («el aparato no decodifica»), pero se
puede ver.DolbyVisionCompatenvuelve los extractores de archivos y, si
ningún decodificador Dolby Vision del aparato admite el perfil 7, presenta
la pista como HEVC: el decodificador HEVC reproduce la capa base (HDR10) e
ignora la de mejora. Sin muestra de perfil 7 a mano: comprobado solo que MP4
y MKV normales siguen abriendo.
v0.9.24
- Cierre al cambiar de motor (Android, desde 0.9.22): la superficie de
vídeo no se recreaba al pasar de ExoPlayer a MPV (o al revés), así que el
motor nuevo no tenía dónde pintar y mpv abortaba
(vo_mediacodec_embed: WinID != 0), visto en una Bravia. Ahora hay una
superficie por reproductor (key(player)). Probado en un OnePlus 7 Pro en
los dos sentidos. - ExoPlayer sin imagen: Dolby Vision o AV1 que el decodificador del aparato
no puede («excede sus capacidades») fallan al momento con el aviso de probar
el otro motor; y si hay vídeo en el búfer pero ninguna imagen en 20 s,
también (visto en una Shield con Dolby Vision perfil 10 sobre AV1, que se
quedaba cargando sin decir nada). - Sin decodificadores libres (multiview en una Bravia, que solo tiene dos):
el mensaje lo dice en vez de «el aparato no sabe decodificar este vídeo». - Núcleo: si el alimentador de un Smooth falla (un 412 al empezar), se
cierra el flujo; antes el reproductor se quedaba esperando para siempre sin
reconectar ni avisar. - ISML en directo con ExoPlayer (OnePlus 7 Pro): tardaba ~50 s en arrancar
(mpv, 9 s) y luego se paraba cada minuto. Tres causas, todas del lado de
ExoPlayer: el ajustador de tiempos compartido por vídeo y audio (ahora uno
por flujo: el núcleo ya los hace empezar en el mismo punto, medido a 9 ms);
el control de búfer, que no sabía cuánto llevaba y esperaba a llenarlo
(ahora arranca en cuanto hay datos); y el lector progresivo, que se detenía
cada 1 MB a esperar permiso y frenaba al alimentador (ahora no se detiene).
Medido: arranca en 0,7 s y sin paradas en más de 3 minutos. - Solo en depuración:
EventLoggerde ExoPlayer al registro, y en el núcleo
el instante del primer fragmento de cada pista.
v0.9.23
- El arreglo de la 0.9.22 (
vo=libmpv) no bastaba: reproducido en el
simulador con cuatro HLS locales y--ui-testing-multiview(solo Debug:
entra en el multiview y añade un cuadro cada 8 s). - Causa 1: al entrar en el multiview, SwiftUI aún actualizaba la superficie
de pantalla completa que se iba y suupdateUIViewle quitaba el
reproductor a la del cuadro. Ahora la vista nueva se engancha al crearse,
updateUIViewsolo engancha si no hay ninguna, y al quitarse una vista el
vídeo vuelve a la anterior que siga viva (IOSMPVPlayerSurfacey
TVOSMPVPlayerSurfacecon coordinador). - Causa 2: al soltar la vista anterior se libera el contexto de render y con
él la salida de vídeo de mpv, que no vuelve ni convoni quitando y
poniendo la pista. Con el vídeo en marcha, cambiar de vista vuelve a abrir
el canal (lo que no es directo, por donde iba). - Comprobado en el simulador: los cuatro cuadros con imagen y solo suena el
elegido. ExoPlayer y multiview probados además en un OnePlus 7 Pro real
(4 canales a 720p por hardware, unos 386 MB).
v0.9.22
ExoPlayer como segundo motor (Android)
- Preferencias → Reproductor → Motor: MPV (por defecto) o ExoPlayer. No viaja
con la sincronización: depende de lo que decodifique cada aparato. PlaybackEngine(interfaz común) conMpvPlayeryExoPlayerEngine
(Media3 1.11.1). Los dos preparan con el núcleo, así que proxies, Smooth y
claves son los mismos. La pantalla, el multiview y el traspaso entre ellos
usan la interfaz.- El núcleo da ahora también
manifest,headersyclearKeys(KID → clave)
enplayback.prepare. ExoPlayer descifra ClearKey con el de Android; se
añade la clave para el KID cero, como hace FFmpeg con la clave por defecto. - Smooth servido por el núcleo:
TimestampAdjustercompartido (los tiempos
de la emisión empiezan en miles de millones) ySmoothDrmExtractor, que
pone unpsshcomún en las pistas (el MP4 del núcleo no lo trae y sin él
ExoPlayer no abre sesión DRM). - Subtítulos:
SubtitleViewencima del vídeo; los de addons van en el
MediaItemy se fuerzan al elegirlos. Sin subtítulos al empezar, como mpv. - Si un vídeo no abre, el aviso dice con qué motor falló y ofrece «Probar con
…» el otro solo para ese vídeo (como Stremio). En la tele, el botón toma el
foco y los mandos no se dibujan encima. - En el reproductor, Pistas → «Reproductor»: cambiar de motor sin salir del
vídeo (solo para ese vídeo). Lo que no es directo sigue por donde iba. - Probado en emulador (móvil y Android TV): HLS fMP4/TS/directo/AES-128, HLS
SAMPLE-AES de Movistar+ por el proxy, DASH VOD/directo, DASH ClearKey
(Axinom, Shaka, Orange), Smooth VOD corto y largo, Smooth en directo cifrado
de Movistar, MP4, MKV, addon con MP4/HLS/MKV y subtítulos de OpenSubtitles,
multiview de 4 canales (unos 171 MB PSS) y la reconexión cortando la red.
Sin probar en aparato real.
Reconexión del directo (Android, iOS y tvOS)
- Un directo que ya se veía y se corta (fin del flujo o error) se vuelve a
preparar a los 1, 2, 4, 8 y 16 s; tras un minuto bien, se cuenta de cero.
Núcleo
SmoothLiveFeeder: el 412 es «fragmento aún no publicado» (Unified
Streaming), como el 404, y no corta el canal. Test añadido.
Multiview (iOS y tvOS)
- El primer cuadro se quedaba negro y se oía (lo reportó un usuario en
iPhone): al pasar el reproductor a la vista del cuadro se libera el
contexto de render de mpv y, con él, la salida de vídeo. Ahora se vuelve a
ponervo=libmpval enganchar una vista nueva. Lo mismo al volver a
pantalla completa con otro cuadro. Compila; sin probar en aparato.
mpv (Android)
- Con la libmpv de Stremio el fin de archivo solo llega por
endFile: un
canal que no abría se quedaba cargando para siempre. Ahora enseña el error.
v0.9.21
- Una Bravia (Android 12, 32 bits) cerró la app tras unos 40 minutos de un
contenido HLS SAMPLE-AES bajo demanda, con tirones antes. El registro,
mandado desde el arranque siguiente, no traía nada del proceso que falló:
el logcat se filtraba por el pid actual. DiagnosticsLog.kt: el logcat ya no se filtra por pid. Android solo deja
leer las líneas de la propia app, así que ahora entran también las del
proceso anterior.- Nueva sección «Cierres anteriores» con
getHistoricalProcessExitReasons
(Android 11 o posterior): motivo (sin memoria, fallo de Java o nativo, ANR…),
hora, importancia, PSS/RSS y la descripción del sistema de los últimos cinco. - Compila; no se ha probado en aparato.
v0.9.20
Multiview (Android, iOS y tvOS)
- Botón «Multiview» en el reproductor, solo en directo. El canal que se ve
pasa al primer cuadro de una cuadrícula de 2×2 con el mismo reproductor, sin
volver a abrirse (MultiviewScreen.kt;IOSMultiviewView.swift, compartido
por iOS y tvOS, conIOSPlaybackHandoffpara volver a pantalla completa con
otro cuadro). - «+» añade un canal de la lista de zapping, empezando por el siguiente. Suena
solo el cuadro elegido: los demás van conmutey no conaid=no, porque en
directo volver a poner la pista deja el canal parado hasta que el audio
alcanza al vídeo. - Menú de cada cuadro: pantalla completa, cambiar canal, quitar. «Atrás» sale a
pantalla completa con el cuadro elegido. - Tope de calidad:
maxVideoHeightenPlaybackPreparation.prepare(DASH, HLS
con ClearKey y Smooth) yhlsBitrateCapparahls-bitratede mpv cuando
mpv ve el master entero. Los cuadros nuevos abren a ≤720p; con el cuarto,
todos. Tests:QualityCapTests. - Varios controladores a la vez en iOS/tvOS: la sesión de audio y el «no
apagar la pantalla» se sueltan cuando ya no queda ninguno. - Probado en el Chromecast con Google TV (4 canales a 720p por hardware, unos
670 MB). iOS y tvOS compilan pero no se han probado en aparato.
Favoritos y recientes (Android, iOS y tvOS)
- Petición de un usuario. Dos grupos fijos, «★ Favoritos» y «Recientes»,
delante de «Todos» (solo en el directo). Un canal se marca manteniéndolo
pulsado en la rejilla (combinedClickableen Android,contextMenuen
iOS/tvOS) o con la estrella del reproductor; las tarjetas favoritas llevan
una estrella. Recientes: los últimos 20 canales en directo abiertos, también
al zapear, del último hacia atrás. - Se identifican por grupo + nombre, que sobrevive a recargar la lista (el id
es la posición). Se guardan en cada aparato; no se sincronizan por Drive. - Con «Favoritos» elegido, el zapping y el selector del multiview se mueven
entre favoritos. Sin probar en aparato.
Android: el APK de la actualización ya no se queda en el aparato
cache/update/update.apk(unos 60 MB) seguía ahí tras instalarse hasta que
Android vaciaba la caché.AppUpdaterlo borra al arrancar.
Proxies que no se quedan sin hilos
- Los
accept()de los proxies DASH/HLS, el servidor de Smooth y el DNS
bloqueaban hilos deDispatchQueue.globaly del pool de Swift, que en
Android tienen un hilo por núcleo. Con cuatro canales en el Chromecast (4
núcleos) todo se quedaba en «Conectando…», y cambiar de canal muy seguido
podía atascarse igual.BlockingIO(enLiveHTTPServer.swift) los saca a
hilos propios.
Android: el renderizado por sistema ya no se cae al reabrir
checkSystemRenderermirabahwdec-currenten cuanto había tamaño de
vídeo, también entre un archivo y otro (cambiar de calidad), cuando mpv
responde «no», y pasaba avo=gpusin motivo. Ahora mira al arrancar la
reproducción y solo con un vídeo abierto.
«Enviar registro» llega por Telegram (Android)
- El registro se manda al desarrollador con el bot @isplayer_registry_bot
(DiagnosticsLog.sendToDeveloper), con lo que el usuario cuente y un código
para identificarlo. Uno por minuto como mucho. «Compartir» sigue como
alternativa. Token y chat enConfig/GoogleOAuth.local.xcconfig(fuera del
repo); sin ellos, la app solo ofrece compartir. Sin probar el envío desde un
aparato.
v0.9.19
Catálogos JSON con el formato de OTT Navigator
- El catálogo JSON ya era el «Media library file» de OTT Navigator
(https://ottnav.github.io/faq.html#media-library-file-json); ahora se lee
entero.OTVNormalizer(enJSONPlaylistParser.swift) deja el JSON como
si no trajera lo siguiente antes de decodificarlo:- textos en BASE64 sin relleno, según el elemento técnico
{ "base64": "name,video" }(*: todos los textos); - textos por idioma (
"name:es"): manda el del idioma del aparato.
- textos en BASE64 sin relleno, según el elemento técnico
headerscomo objeto JSON ({"User-Agent": "…"}). Antes un objeto hacía
fallar la decodificación y el título desaparecía de la lista.- Temporadas y episodios sin número se numeran por su posición.
backdropcomo fondo ytrailerdentro deinfo, también como id de
YouTube suelto.- Los tráileres de YouTube (
VODMetadata.trailerYouTubeID) ya no intentan
abrirse en mpv, que no puede: se abren en YouTube (Safari o la app en iOS,
la app en tvOS,vnd.youtube:o el navegador en Android). - Tests:
OTTNavigatorCatalogTests, con el ejemplo oficial tal cual. Sin
probar en aparato con una lista real.
Addons detrás de un proxy (Pictorium)
- Un addon cuya dirección lleva parámetros
(…/api/proxy/manifest.json?url=…&u=…, el proxy de pósters de Pictorium)
perdía la query al pedir catálogos, fichas, enlaces y subtítulos. Ahora
StremioAddonURL.queryse añade a cada recurso, como hace Stremio. - Cinemeta y OpenSubtitles se reconocen por su dirección, no por su id: un
proxy repite el id del addon que envuelve y se confundía con el de serie. - El addon propio de Pictorium (
/u/…/manifest.json) ya funcionaba. Su
proxy responde hoy 403 a cualquier petición (lado servidor), así que esa
forma no se ha podido probar contra el servicio real.