Androidオーディオ・ビデオ開発実践シリーズ-04-Android WebRTCでSRSサーバーにストリームをプッシュし、ライブブロードキャスト機能を実現

目次

序文

WebRTC について学ぶ

SRSサーバーを導入する

ソースコードをダウンロードして実行する

考えられる問題

セッションの作成 : セッションの作成 : パブリッシャーの追加 : パブリッシュ ネゴシエート : 有効な H.264 ペイロード タイプが見つかりません

RTC エラー コード = 5020 : セッションの作成 : ストリーム /live/livestream ビジー

プレイが進まない問題

参考文献


序文

最近、プロジェクトでは RTMP 遅延が長すぎて需要を満たすことができないため、RTMP ストリーミング機能の代わりに WebRTC を使用しています。この記事は、WebRTC を学習する際に遭遇する関連する問題と解決策を記録し、誰もが落とし穴を回避できるようにすることを目的としています。

全員の時間を無駄にしないように、まずレンダリングをアップロードします。

最初の写真は、WebRTC を使用してストリームをプッシュする Android アプリです。ソース コードのアドレス: https://github.com/xiangang/WebRTCTest

上記のソース コード フォークは、伝説的な Erhuo「Android はストリームのプルと再生のみに webrtc を使用します」のデモからのものです。

https://github.com/Henry-6/WebRTCTest、作成者は SRS サーバー バージョン V4.0 のサポートを変更し、セッションの作成: セッションの作成: パブリッシャーの追加: パブリッシュのネゴシエート: いいえを変更しました。有効な H.264 ペイロード タイプの問題が見つかりました。この問題の解決策は、Wearing Shorts in Winterの「Android-Web Video Calling Based on SRS Server (3): Android Pushes WebRTC Stream to SRS Server」にあります。偉いお二人に感謝です!

2 番目の写真は、SRS サーバーが提供する WebRTC プレーヤーの再生効果です (gif は大きすぎるため、スクリーンショットを撮ることによってのみ効果を確認できます)。

WebRTC について学ぶ

言うことはあまりありませんが、WebRTC テクノロジに興味がある場合は、Li Chao 著の「WebRTC オーディオおよびビデオ リアルタイム インタラクティブ テクノロジ - 原理、実装、およびソース コード分析」を読むことをお勧めします

WeChatリーディングで無料で読むことができます、素晴らしい良心です!

SRSサーバーを導入する

SRS は、RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181 をサポートするシンプルで効率的なリアルタイム ビデオ サーバーです。

公式ドキュメントはここにあります: https://github.com/ossrs/srs/wiki/v4_CN_Home、SRS サーバーのデプロイは非常に簡単で、公式 WIKI に従うだけです。winlinvip自身が書いた「Using SRS to Quickly Build WebRTC Streaming and Playback」も参照してください。著者は詳細には触れません。

ソースコードをダウンロードして実行する

ソース コードはここにあります: 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 サーバーを展開し、ストリーミング デモ アプリを実行している携帯電話を SRS サーバーと同じローカル エリア ネットワークに接続することを推奨しています。利用可能な Linux システムがない場合は、Docker を使用してデプロイすることをお勧めします。

アプリ デモがインストールされたら、[プッシュ] ボタンをクリックしてストリームをプッシュします。再生ボタンはストリーミング再生に使用します。

さらに、SRS は Flutter のライブ ストリーミング アプリを公式に提供しています: 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

道を間違えないように注意してください。

考えられる問題

セッションの作成 : セッションの作成 : パブリッシャーの追加 : パブリッシュ ネゴシエート : 有効な H.264 ペイロード タイプが見つかりません

この問題の解決策については、冬のウェアリングショートパンツによる「Android-Web Video Calling Based on SRS Server (3): Android Pushes WebRTC Stream to SRS Server」を参照してください。

RTC エラー コード = 5020 : セッションの作成 : ストリーム /live/livestream ビジー

[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 サーバーのバグである可能性がありますので、ストリーム アドレスを変更するか、SRS サーバーを再起動することをお勧めします。または以下を参照してください。

WebRTC: インターフェイスを通常に戻すように要求できます。Google ブラウザを使用すると、SRS ライブ APP が再生できず、循環しています

SRS 問題レコード 1 のトラブルシューティング (RTMP ストリーミング、RTC 再生のスタック)

SRS が webrtc の配布に失敗し、ストリームを再生できません #1727

プレイが進まない問題

筆者が実際に試してみたところ、ローカルエリアネットワークであってもストリーミング再生ではフリーズの問題が発生することがわかった。具体的な原因はまだ筆者も特定できていないので、今後解決策があれば改めて記事を書いて解説したいと思います。

他の問題が発生した場合は、メッセージを残して連絡してください。

参考文献

MacaruinaSRS WebRtc ライブ ストリームへの Android アクセス

伝説の二胡氏のAndroid はプルと再生のみに webrtc を使用します」

冬にショートパンツを着用するAndroid 側のWebRTC によりH264 エンコードが有効になります - SDP に H264 情報はありません

Winlinvip はSRSを使用してWebRTC ストリーミングと再生を迅速に構築します

オープンソースに対する無私の献身的な上記のブロガーに感謝します。

最後に書いていますが、まずは最後まで読んでいただき、誠にありがとうございます。オリジナルで実践的な記事を書くことにこだわるのは簡単なことではありません。この記事がお役に立ちましたら、「いいね!」していただければ幸いです。あなたの励ましが著者の主張です。記事内に間違いがございましたら修正させていただきますので、またよろしくお願いいたします。

おすすめ

転載: blog.csdn.net/xiangang12202/article/details/122994219