Tabla de contenido
Descarga el código fuente y ejecuta
Código de error RTC = 5020: crear sesión: transmisión/en vivo/transmisión en vivo ocupada
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:
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.