Práctica de desarrollo de audio y video de Android series-04-Android WebRTC push stream al servidor SRS para realizar la función de transmisión en vivo

Tabla de contenido

prefacio

Más información sobre WebRTC

Implementar el servidor SRS

Descarga el código fuente y ejecuta

Posibles problemas

crear sesión: crear sesión: agregar editor: publicar negociar: no se encontró un tipo de carga útil H.264 válido

Código de error RTC = 5020: crear sesión: transmisión/en vivo/transmisión en vivo ocupada

Problema de juego atascado

Referencias


prefacio

Recientemente, el proyecto usa WebRTC para reemplazar la función de transmisión de RTMP, porque el retraso de RTMP es demasiado alto para satisfacer la demanda. Este artículo tiene la intención de registrar los problemas relacionados y las soluciones encontradas en el aprendizaje de WebRTC y ayudar a todos a evitar trampas.

Para evitar perder el tiempo de todos, primero cargue las representaciones:

La primera imagen es una aplicación de Android que usa WebRTC para enviar transmisiones, la dirección del código fuente: https://github.com/xiangang/WebRTCTest

La bifurcación del código fuente anterior es de la demostración del legendario " Android uses webrtc to pull streams and play" del legendario Erhuo:

​​​​​​https://github.com/Henry-6/WebRTCTest , el autor modificó el soporte para el servidor SRS versión V4.0 y modificó la sesión de creación: sesión de creación: agregar editor: publicar negociar: no Se encontró un problema de tipo de carga útil H.264 válido. La solución a este problema proviene de "Android-Web Video Calling Based on SRS Server (3): Android Pushes WebRTC Stream to SRS Server" de Wearing Shorts in Winter . ¡Gracias a los dos grandes!

La segunda imagen es el efecto de reproducción del reproductor WebRTC proporcionado por el servidor SRS (el gif es demasiado grande, por lo que solo puede ver el efecto al tomar una captura de pantalla).

Más información sobre WebRTC

No hay mucho que decir, si está interesado en la tecnología WebRTC, se recomienda leer "Tecnología interactiva en tiempo real de audio y video WebRTC: principio, implementación y análisis de código fuente" por Li Chao .

Es gratis leer en WeChat leyendo, ¡gran conciencia!

Implementar el servidor SRS

SRS es un servidor de video en tiempo real simple y eficiente que admite RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181.

El documento oficial está aquí: https://github.com/ossrs/srs/wiki/v4_CN_Home , implementar el servidor SRS es muy simple, solo siga el WIKI oficial. También puede consultar "Using SRS to Build Quickly Build WebRTC Streaming and Playback" escrito por el mismo winlinvip , y el autor no entrará en detalles.

Descarga el código fuente y ejecuta

El código fuente está aquí: https://github.com/xiangang/WebRTCTest , impórtalo a AndroidStudio después de la clonación, se recomienda modificar directamente la IP del servidor SRS en la clase MainActivity:

ed1.setText("webrtc://192.168.1.139/live/livestream");
ed2.setText("webrtc://192.168.1.139/live/livestream");

El autor recomienda usar el sistema Linux para implementar el servidor SRS, y el teléfono móvil que ejecuta la aplicación de demostración de transmisión está conectado a la misma red de área local que el servidor SRS. Si no hay un sistema Linux disponible, se recomienda usar Docker para implementar.

Después de instalar la demostración de la aplicación, haga clic en el botón Push para enviar la transmisión. El botón Reproducir se utiliza para la reproducción de secuencias.

Además, SRS proporciona oficialmente la aplicación de transmisión en vivo de Flutter: https://github.com/ossrs/flutter_live

Los socios interesados ​​pueden descargar la experiencia de carrera por sí mismos. Cabe señalar que si se encuentra con los siguientes problemas:

Launching lib/main.dart on LB4418 in debug mode...
Warning: Mapping new ns http://schemas.android.com/repository/android/common/02 to old ns http://schemas.android.com/repository/android/common/01
Warning: Mapping new ns http://schemas.android.com/repository/android/generic/02 to old ns http://schemas.android.com/repository/android/generic/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/addon2/02 to old ns http://schemas.android.com/sdk/android/repo/addon2/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/repository2/02 to old ns http://schemas.android.com/sdk/android/repo/repository2/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/sys-img2/02 to old ns http://schemas.android.com/sdk/android/repo/sys-img2/01
Warning: Mapping new ns http://schemas.android.com/repository/android/common/02 to old ns http://schemas.android.com/repository/android/common/01
Warning: Mapping new ns http://schemas.android.com/repository/android/generic/02 to old ns http://schemas.android.com/repository/android/generic/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/addon2/02 to old ns http://schemas.android.com/sdk/android/repo/addon2/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/repository2/02 to old ns http://schemas.android.com/sdk/android/repo/repository2/01
Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/sys-img2/02 to old ns http://schemas.android.com/sdk/android/repo/sys-img2/01

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:stripDebugDebugSymbols'.
> No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 58s
Running Gradle task 'assembleDebug'...                             67.7s
Exception: Gradle task assembleDebug failed with exit code 1

Se puede resolver configurando la ruta del NDK en el archivo /flutter_live/example/android/local.properties.

## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Tue Feb 15 17:14:21 CST 2022
sdk.dir=/work/android/android-sdk-linux
ndk.dir=/work/android/android-ndk-r20#配置NDK路径
flutter.buildMode=debug
flutter.versionCode=1
flutter.sdk=/home/work/flutter
flutter.versionName=1.0.9

Tenga cuidado de no equivocarse en el camino.

Posibles problemas

crear sesión: crear sesión: agregar editor: publicar negociar: no se encontró un tipo de carga útil H.264 válido

Para obtener la solución a este problema, consulte "Videollamadas Android-Web basadas en el servidor SRS (3): Android empuja la transmisión WebRTC al servidor SRS" de Wearing Shorts in Winter

Código de error RTC = 5020: crear sesión: transmisión/en vivo/transmisión en vivo ocupada

[2022-02-15 14:21:23.569][Warn][1][wz97i48f][11] RTC error code=5020 : create session : stream /live/livestream busy
thread [1][wz97i48f]: do_serve_http() [src/app/srs_app_rtc_api.cpp:458][errno=11]                                                                                                                                    
thread [1][wz97i48f]: create_session() [src/app/srs_app_rtc_server.cpp:521][errno=11]                                                                                                                                
[2022-02-15 14:21:23.577][Trace][1][wz97i48f] TCP: before dispose resource(HttpConn)(0x2c4e240), conns=1, zombies=0, ign=0, inz=0, ind=0                                                                             
[2022-02-15 14:21:23.577][Warn][1][wz97i48f][104] client disconnect peer. ret=1007
[2022-02-15 14:21:23.577][Trace][1][bik1o4g8] TCP: clear zombies=1 resources, conns=1, removing=0, unsubs=0                                                                                                          
[2022-02-15 14:21:23.577][Trace][1][wz97i48f] TCP: disposing #0 resource(HttpConn)(0x2c4e240), conns=1, disposing=1, zombies=0
[2022-02-15 14:21:23.592][Trace][1][5ftt8q4e] HTTP #0 192.168.0.8:52660 POST http://192.168.0.11:1985/rtc/v1/publish/, content-length=4089
[2022-02-15 14:21:23.593][Trace][1][5ftt8q4e] RTC publish webrtc://192.168.0.11/live/livestream, api=http://192.168.0.11:1985/rtc/v1/publish/, tid=, clientip=192.168.0.8, app=live, stream=livestream, offer=3747B, eip=, codec=
[2022-02-15 14:21:23.594][Warn][1][5ftt8q4e][11] RTC error code=5020 : create session : stream /live/livestream busy
thread [1][5ftt8q4e]: do_serve_http() [src/app/srs_app_rtc_api.cpp:458][errno=11]                                                                                                                                    
thread [1][5ftt8q4e]: create_session() [src/app/srs_app_rtc_server.cpp:521][errno=11]                                                                                                                                
[2022-02-15 14:21:23.602][Trace][1][5ftt8q4e] TCP: before dispose resource(HttpConn)(0x2c4e240), conns=1, zombies=0, ign=0, inz=0, ind=0                                                                             
[2022-02-15 14:21:23.602][Warn][1][5ftt8q4e][104] client disconnect peer. ret=1007
[2022-02-15 14:21:23.602][Trace][1][bik1o4g8] TCP: clear zombies=1 resources, conns=1, removing=0, unsubs=0                                                                                                          
[2022-02-15 14:21:23.602][Trace][1][5ftt8q4e] TCP: disposing #0 resource(HttpConn)(0x2c4e240), conns=1, disposing=1, zombies=0
^C[2022-02-15 14:21:23.606][Trace][1][823e71md] cleanup for quit signal fast=1, grace=0
[2022-02-15 14:21:23.606][Warn][1][823e71md][11] main cycle terminated, system quit normally.
[2022-02-15 14:21:23.606][Warn][1][80fp0709][4] inotify ignore read failed, nn=-1                                                                                                                                    
[2022-02-15 14:21:23.706][Trace][1][823e71md] srs disposed                                                                                                                                                           
[2022-02-15 14:21:23.706][Trace][1][823e71md] srs terminated

Este problema puede ser un error del servidor SRS. Se recomienda cambiar la dirección de transmisión o reiniciar el servidor SRS. o consulte:

WebRTC: puede solicitar que la interfaz vuelva a la normalidad, use el navegador de Google y la aplicación srs live no se puede reproducir, ha estado dando vueltas

Solucionar problemas del registro de problemas de SRS 1 (transmisión de RTMP, reproducción de RTC atascada)

srs no puede distribuir webrtc, la transmisión no se puede reproducir #1727

Problema de juego atascado

La prueba real del autor encontró que incluso en la red de área local, la reproducción de transmisión aún tendrá el problema de congelarse. El autor aún no ha identificado el motivo específico, y si hay una solución en el futuro, escribiré otro artículo para explicarlo.

Si encuentra otros problemas, deje un mensaje para comunicarse.

Referencias

Acceso Android de Macaruina a la transmisión en vivo de SRS WebRtc

El legendario " Android usa webrtc para tirar y jugar" de Erhuo

WebRTC en el lado de Android usando pantalones cortos en invierno habilita la codificación H264; no hay información H264 en sdp

Winlinvip usa SRS para construir rápidamente transmisión y reproducción WebRTC

¡Gracias a los blogueros anteriores por su dedicación desinteresada al código abierto!

Escrito al final, en primer lugar, muchas gracias por su paciencia al leer el artículo completo. No es fácil insistir en escribir artículos originales y prácticos. Si este artículo le resulta útil, le invitamos a que le guste. y comente el artículo. Su aliento es la insistencia del autor. Impulso implacable. Si hay algún error en el artículo, por favor corrígeme, gracias de nuevo.

Supongo que te gusta

Origin blog.csdn.net/xiangang12202/article/details/122994219
Recomendado
Clasificación