Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apple no reproduce los videos #1740

Open
rauldam opened this issue Mar 7, 2025 · 11 comments
Open

Apple no reproduce los videos #1740

rauldam opened this issue Mar 7, 2025 · 11 comments

Comments

@rauldam
Copy link

rauldam commented Mar 7, 2025

Buenas tardes Pedro,

Mira después de cambiar de dispositivo a uno con Hardware encoders tanto en h264 como en h265 y realizar una serie de test sobre varios live servers tales como youtube, nginx rtmp, mediamtx y odyx, me ocurre un problema que lo veo raro, porque todos los dispositivos Android, Microsoft y Ubuntu son capaces de ver el stream sin problemas es mas lo puedo incluso almacenar en formato mp4 y visualizarlo ondemand, pero los dispositivos Apple no, solo obtengo audio, tanto en iphone como en macs (Intel y gama M), paso por el analizador de medios del video, y me devuelve o bien es un H264 Main profile con level 3.1 o 4.1 (depende de como lo configure) osea me devuelve todo correctamente, ara bien si la misma maquina que hace el stream lo configuro para que use el encoder obligatoriamente via Software, realizo el mismo procediminto stream to nginx rtmp, guardo el video en mp4 y lo visualizo, todos los dispositivos lo reproducen sin ningun tipo de problema tanto apple como microsoft, android y ubuntu (usando la misma configuración que en Hardware, la unica diferencia cuando lo paso por el analizador de video este me devuelve que es un Baseline Constrained Profile level 3.1 H264, eso intuyo porque el encoder hardware esta mas limitado y solo tiene ese perfil) pero lo dicho lo reproduce sin problemas, y era pues a ver si te ha pasado a ti o alguien mas ha comentado algo.. porque es algo muy extraño.

Gracias.

@pedroSG94
Copy link
Owner

Hola,

Me puedes pasar un fichero de ejemplo que no te funcione y los parámetros usando para configurar la app para obtenerlo?

@rauldam
Copy link
Author

rauldam commented Mar 11, 2025

Buenas tardes Pedro, por supuesto mira, aqui te dejo todo, estoy creando así:

val genericStream: RtmpStream by lazy {
RtmpStream(applicationContext, this, Camera2Source(applicationContext),MicrophoneSource(MediaRecorder.AudioSource.VOICE_PERFORMANCE)).apply {
setVideoCodec(VideoCodec.H264)
setAudioCodec(AudioCodec.AAC)
getGlInterface().autoHandleOrientation = true
getStreamClient().setCheckServerAlive(true)
setTimestampMode(TimestampMode.BUFFER,TimestampMode.BUFFER)
val audio = (audioSource as MicrophoneSource)
audio.microphoneVolume = 0.01f

    }
}

Como parametros los siguietnes:

val width = 1920
val height = 1080
val vBitrate = 7500 * 1000
private var rotation = 0
private val sampleRate = 48000
private val isStereo = false
private val aBitrate = 64000

y el prepare de la siguiente forma:

genericStream.forceCodecType(CodecUtil.CodecType.HARDWARE, CodecUtil.CodecType.FIRST_COMPATIBLE_FOUND)
genericStream.prepareVideo(width, height, vBitrate, 30, 1,rotation, MediaCodecInfo.CodecProfileLevel.AVCProfileMain, MediaCodecInfo.CodecProfileLevel.AVCLevel41) && genericStream.prepareAudio(sampleRate, isStereo, aBitrate, true, true)

Me selecciona el siguiente encoder:

Name: c2.rk.avc.encoder
Type: video/avc
Max instances: 32
----- Encoder info -----
Complexity range: 0 - 0
Quality range: 0 - 0
CBR supported: false
VBR supported: true
CQ supported: false


----- Video info -----
Supported colors:
2130708361
2135033992
19
21
20
39
Profile: 1, level: 32768
Profile: 2, level: 32768
Profile: 8, level: 32768
Bitrate range: 1 - 40000000
Frame rate range: 0 - 960
Width range: 144 - 7680

Estoy atacando un nginx RTMP, aqui te dejo el enlace del video que acabo de grabar
Formato MP4: https://justet.es/record/orangepi-11-Mar-25-15:46:56.mp4 (este es obteniendo en server usando ffmpeg haciendo basicamente un ffmpeg -i input.flv -c copy -a copy -movflags +faststart output.mp4)
Formato FLV: https://justet.es/record/orangepi-11-Mar-25-15:46:56.flv (el que envíamos directamente desde rootencoder)

Como podrás observar tanto en windows, linux y android (tanto navegador como reproductor) funciona perfectamente, pero en dispositivos apple solo hay audio tanto iOS como Mac)

Si lanzo a Youtube tanto en H265, como en H264 funciona perfectamente.

Si necesitas cualquier cosa mas para analizar me dices!
PD: El link tiene 24 horas de vida solamente

@pedroSG94
Copy link
Owner

Hola,

Por lo que puedo ver es un problema con la decodificación por hardware en macOS y iOS. Si la desactivas en VLC ambos videos se reproducen correctamente.
Ajustes > Entrada / codecs (agranda la ventana a lo ancho que quizás está oculto a la derecha) > deshabilita decodificación por hardware
Por lo que he visto si grabas con rootencoder directamente en vez de streamear si que funciona. Confirma eso en tu caso y si funciona podemos ver posibles soluciones. Una de ellas puede ser cambiar el comando ffmpeg para arreglarlo.

También deberias confirmar que si usas ffmpeg para stremear con un fichero a tu nginx el flv resultante funcione.

@rauldam
Copy link
Author

rauldam commented Mar 11, 2025

Buenas Pedro, voy hacer la prueba de la grabación voy a editar la app para añadir el boton de grabación y grabar y pruebo a reproducir en el mac y en el iphone.

Respecto a que si hago stream dsde ffmpeg, si que funciona, osea es como hemos funcionado hasta ahora, usando ffmpeg recoger el flujo de rtsp y stream rtmp y sin problemas en todos los dispositivos, y desde OBS también hemos probado y sin problemas.

Si hago un ffmpeg -i entrada.flv -vcodec libx264.... output.mp4 si que funciona el video, pero claro me rehace todo el video volviendolo a codificar etc etc, gastando muchos recursos sobretodo en videos que suelen ser de 90 min, por varios a la vez.

Te dejo aqui un enlace de un video que hay de hoy en el server grabado dsd ffmpeg: https://justet.es/record/info%2540padel-ux.com-11-Mar-25-12:30:28.mp4

EDIT

Acabo de realizar una grabación interna y sin problema, lo reproduce en cualquier lado, tanto android, iphone, linux, windows y mac sin problemas asi que es el stream solamente, te adjunto el video que he grabado en local.

20250311_170736.mp4

@pedroSG94
Copy link
Owner

pedroSG94 commented Mar 23, 2025

Hola,

He tardado bastante pero estoy con esto. Con el servidor de nginx que me he montado yo si me funcionan los videos en macOS usando el VLC y con hardware.
Me he compilado este docker:
https://github.com/tiangolo/nginx-rtmp-docker

Mi fichero de configuración:

worker_processes auto;
rtmp_auto_push on;
events {}
rtmp {
    server {
        listen 1935;

        application live {
            live on;
            record all;
            record_path /var/www/html/rtmp/recordings;
            record_unique on;
            record_suffix _%Y-%m-%d_%H-%M-%S.flv;
        }
    }
}

@rauldam
Copy link
Author

rauldam commented Mar 24, 2025

Buenas Pedro, tranquilo no te preocupes, bastante haces.

Si es muy parecido al mío por no decir que es básicamente el mismo el fichero y el nginx-rtmp module.

Pues a ver si yo he probado con otros dispositivos, que tienen también hardware como el xiaomi mi A2 y el redmi note y si funciona bien, solo me pasa con esta board con rockchip, asi que me parece taan extraño, no se, ahora he intentado probar a ver con la versión 2.5.9 y el forceincremental a true a ver si era algo del nginx con los paquetes flv o nose, pero me sigue apareciendo igual, el audio bien, el video por hardware decode en negro asi que ya no se, lo unico que se me ocurre, es mandarte la board con la cámara por paquetería por si tu quieres probarlo sobre este dispositivo y hacer un debug mas profundo a ver si conseguimos llegar al porque de esto...

Muchas gracias por todo tu esfuerzo y dedicación Pedro!

@pedroSG94
Copy link
Owner

Hola,

Parece ser que este caso tendrá mas que ver con el codec del board que otra cosa por que si funciona con los mismos parámetros en otros teléfonos debería ser por eso.
Has probado a no pasarle ningún parámetro de profile o level en prepareVideo y dejar que el encoder use los parámetros por defecto?
También puedes probar a usar el profile high y dejar el level por defecto ya que normalmente siempre se usa el profile high por defecto.

Lo que seguramente si funcione y supongo que no querrás hacer es forzar a usar un encoder de software para el video.

@rauldam
Copy link
Author

rauldam commented Mar 26, 2025

Buenas Pedro,

Mira acabo de realizar unas pruebas de las siguientes maneras, obteniendo el mismo resultado, perfecto en todas las plataformas excepto en Apple que sigue haciendo lo mismo, black screen y audio bien.

genericStream.prepareVideo(width, height, vBitrate,25,0,MediaCodecInfo.CodecProfileLevel.AVCProfileHigh) && genericStream.prepareAudio(sampleRate, isStereo, aBitrate, true, true)
genericStream.prepareVideo(width, height, vBitrate) && genericStream.prepareAudio(sampleRate, isStereo, aBitrate, true, true)

Si le fuerzo a usar Software este funciona pefectamente, pero claro... si tenemos en teoria un hardware especifico para esto, lo bueno es usarlo, así no sobreforzar el procesador a realizar esta tarea que puede ser compleja y dejando el sistema con menos recursos o incluso que llegue a desboardar o sobrecalentarse.

Te dejo captura de mediainfo de linux, con todas las especificaciones del video, en tanto software como en hardware.

Image

@pedroSG94
Copy link
Owner

La única diferencia que veo es que el de hardware es profile high, level 5.1 y va con HDR y el de software profile main, level 5 y sin HDR.

Vamos a intentar forzar que no use HDR y sea main profile y level 5. Para eso usa este prepareVideo:

    //30fps, iframe 2, rotation 0, main profile y level 5
    genericStream.prepareVideo(width, height, vBitrate, 30, 2, 0, MediaCodecInfo.CodecProfileLevel.AVCProfileMain, MediaCodecInfo.CodecProfileLevel.AVCLevel5)

Usa ese prepareVideo tanto para software como hardware y vemos si hay alguna diferencia de nuevo. Esto debería hacer que el de hardware se configure exactamente como el que tienes de software que si te funciona.

@rauldam
Copy link
Author

rauldam commented Mar 26, 2025

Vale, acabo de realizar la prueba que me has dicho usando los parametros que tu me has facilitado y el resultado, es el mismo, osea, en Apple se va a black screen pero si va el audio, aqui te dejo la comparativa.

Image

@pedroSG94
Copy link
Owner

Vale, sigue usando HDR. Vamos a forzar formatos de color que no usan HDR a ver que pasa (necesitas API 24+ o lo que es lo mismo Android 7.0+).
En esta linea de código:
https://github.com/pedroSG94/RootEncoder/blob/master/encoder/src/main/java/com/pedro/encoder/video/VideoEncoder.java#L147
Añade:

      videoFormat.setInteger(MediaFormat.KEY_COLOR_RANGE, MediaFormat.COLOR_RANGE_LIMITED);
      videoFormat.setInteger(MediaFormat.KEY_COLOR_STANDARD, MediaFormat.COLOR_STANDARD_BT709);
      videoFormat.setInteger(MediaFormat.KEY_COLOR_TRANSFER, MediaFormat.COLOR_TRANSFER_SDR_VIDEO);

Sigue usando los mismos valores en el prepareVideo.
Esto puede hacer que el prepareVideo retorne false, eso es por que no soporta alguno de los parámetros usados así que prueba a ir quitándolos a ver cuales soporta. El ultimo quizás es el mas importante por que el resto parece que ya los usa.

Solo hace falta que pruebes con el de hardware ya que lo que intentamos ahora es que el comando nos retorne exactamente la misma configuración con el de hardware que el de software.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants