Android 音视频开发实践系列-04-Android WebRTC推流到SRS服务器实现直播功能
目录前言了解WebRTC部署SRS服务器下载源码并运行可能遇到的问题create session : create session : add publisher : publish negotiate : no found valid H.264 payload typeRTC error code=5020 : create session : stream /live/livestream
目录
RTC error code=5020 : create session : stream /live/livestream busy
前言
最近项目用到WebRTC来替换RTMP推流功能,原因是RTMP延迟太高不满足需求。本文意在记录学习WebRTC的遇到的相关问题和解决方案,帮助大家避坑。
避免浪费大家时间,先上效果图:
第一张图是Android App使用WebRTC推流,源码地址:https://github.com/xiangang/WebRTCTest
以上源码fork自传说中的二货的《Android使用webrtc仅拉流并且播放》的demo:
https://github.com/Henry-6/WebRTCTest,笔者修改了对SRS服务器V4.0版本的支持,并修改了create session : create session : add publisher : publish negotiate : no found valid H.264 payload type的问题。该问题的解决方案来自于冬季穿短裤的《基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流》。感谢两位大佬!
第二张图是SRS服务器提供的WebRTC Player的播放效果(gif太大,只能截图看效果)。
了解WebRTC
就不多说了,如果对WebRTC技术感兴趣,建议阅读李超的《WebRTC音视频实时互动技术--原理、实现与源码分析》。
在微信读书中是免费的阅读,大大的良心!
部署SRS服务器
SRS是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。
官方文档在这:https://github.com/ossrs/srs/wiki/v4_CN_Home,部署SRS服务器很简单,按照官方WIKI来就好了。也可以参考winlinvip大佬本人写的《用SRS快速搭建WebRTC推流和播放》,笔者也不赘述了。
下载源码并运行
源码在这:https://github.com/xiangang/WebRTCTest,克隆后导入AndroidStudio,建议在MainActivity类中直接修改SRS服务器的IP:
ed1.setText("webrtc://192.168.1.139/live/livestream");
ed2.setText("webrtc://192.168.1.139/live/livestream");
笔者比较建议使用Linux系统来部署SRS服务器,运行推流Demo App的手机连接到和SRS服务器所在的同一个局域网内。如果没有可用的Linux系统,建议使用Docker来部署。
App Demo安装后点Push按钮即可推流。Play按钮则用于拉流播放。
另外,SRS官方也提供了Flutter的流媒体直播App:https://github.com/ossrs/flutter_live
感兴趣的小伙伴可以自行下载运行体验,需要注意的是,如果你运行遇到以下问题:
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
可通过在/flutter_live/example/android/local.properties文件中配置NDK路径来解决。
## 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
注意,路径不要搞错了。
可能遇到的问题
create session : create session : add publisher : publish negotiate : no found valid H.264 payload type
此问题的解决方案看冬季穿短裤的《基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流》
RTC error code=5020 : create session : stream /live/livestream busy
[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
此问题有可能是SRS服务器的一个bug,建议换个流地址或重启SRS服务器。或参考:
WebRTC: 能请求到接口返回正常,使用谷歌浏览器和srs直播APP都不能播放,一直在转圈圈
播放卡住的问题
笔者实际测试发现,即便在局域网内,拉流播放也会出现卡死的问题。具体原因,笔者暂未查明,后续如有解决方案会另外写一篇文章阐述。
如若遇到其它问题,欢迎留言沟通。
参考资料
macaruina的Android接入SRS WebRtc直播流
传说中的二货的《Android使用webrtc仅拉流并且播放》
冬季穿短裤的Android端WebRTC启用H264编码-sdp中无H264信息
感谢以上博主开源奉献的无私精神!
写在最后,首先非常感谢您耐心阅读完整篇文章,坚持写原创且基于实战的文章不是件容易的事,如果本文刚好对您有点帮助,欢迎您给文章点赞评论,您的鼓励是笔者坚持不懈的动力。若文章有不对之处也欢迎指正,再次感谢。
更多推荐
所有评论(0)