WebRTCオーディオ前処理ユニットAPMの全体的なコンパイルと使用

文章

ただし、VoE にはオーディオ前処理が含まれているだけでなく、オーディオ エンコーディング モジュールと伝送モジュールもエンジンに統合されており、プロジェクトは既存のエンコーディング レイヤと伝送レイヤを使用する必要があるため、この最適化でも VoE のセット全体を使用することはできませんでした。 VoE 全体を使用するのは冗長で、私には操作不能に思えます。完璧な道などありません. VoE はさておき、VoE の隣にあるモジュール、APM (Audio Preprocessing Module) を見つけました。これは、以前のすべてのモジュールを統合した純粋なオーディオ前処理ユニットです。

ステップ 1 - Google WebRTC ソース コードをダウンロードする

Google WebRTC の開発はまだかなり進んでおり、この記事では WebRTC の最新のトランク リビジョン 5125 を例に説明します。SVN を使用して、次のディレクトリを自分で同期してください (同期方法については、自分でググってください)。

http://webrtc.googlecode.com/svn/trunk/

ステップ 2 - APM のコンパイルに必要なリソースを抽出する

APM の全体的なコンパイルには、WebRTC ソース ディレクトリに次のリソースが必要です。

1) common_audio ディレクトリ全体

2) モジュール ディレクトリ (ビデオ部分なし)

3) system_wrappers ディレクトリ全体

4) WebRTC ソース コードのルート ディレクトリにある 3 つのヘッダー ファイル common_types.h | common.h | typedefs.h。

5) WebRTC ホーム ディレクトリにある android-webrtc.mk ファイル。

ステップ 3 - Eclipse で APM の基本ステップといくつかの重要なポイントをコンパイルする

このセクションは、独自の jni ディレクトリ編成構造に従ってのみ説明されており、読者は必要に応じて調整できます。

Eclipse の jni 組織構造は次のとおりです。

ステップ 2 のすべてのフォルダーとヘッダー ファイルは、webrtc サブディレクトリにあります。android-webrtc.mk は、jni ルート ディレクトリにあります。

段階的に分解してみましょう。

ステップ 3.1

まず、android プロジェクト全体を記述して設定し、jni ルート ディレクトリにある Application.mk ファイルを開き、次のように編集する必要があります。


# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-9

APP_STL の公式説明は次のとおりです。

APP_STL
    By default, the NDK build system provides C++ headers for the minimal
    C++ runtime library (/system/lib/libstdc++.so) provided by the Android
    system.
    However, the NDK comes with alternative C++ implementations that you can
    use or link to in your own applications. Define APP_STL to select one of
    them. Examples are:
       APP_STL := stlport_static    --> static STLport library
       APP_STL := stlport_shared    --> shared STLport library
       APP_STL := system            --> default C++ runtime library
    For more information on the subject, please read docs/CPLUSPLUS-SUPPORT.html

NDK はデフォルトで最小限の C++ ランタイム ライブラリを使用してプロジェクトをコンパイルするため、std::map などの STL コンテナーのソース コードを WebRTC でコンパイルすることはできません。したがって、このプロジェクトに適した独自の C++ ランタイム ライブラリ gnustl_static を設定する必要があります。

この記事の利点は、C++ オーディオおよびビデオ学習キット、技術ビデオ(オーディオおよびビデオ開発、インタビューの質問、FFmpeg webRTC rtmp hls rtsp ffplaysrs など) ↓↓↓↓↓↓以下を参照してください↓↓記事下部の受信をクリック↓↓

ステップ 3.2

次のように、jni ルート ディレクトリにある Android.mk ファイルを開いて編集します. このファイルは、すべてのサブディレクトリにある Android.mk ファイルを呼び出すように NDK に指示するだけで済みます:


# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
include $(call all-subdir-makefiles)

ステップ 3.3

準備が整ったので、APM ユニット全体のコンパイルを開始できます. まず、jni/webrtc ディレクトリを開き、次のように新しい Android.mk ファイルを作成します。


# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
#
MY_WEBRTC_ROOT_PATH := $(call my-dir)
#
# voice
include $(MY_WEBRTC_ROOT_PATH)/common_audio/signal_processing/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/common_audio/vad/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/modules/audio_processing/aec/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/modules/audio_processing/aecm/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/modules/audio_processing/agc/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/modules/audio_processing/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/modules/audio_processing/ns/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/modules/audio_processing/utility/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/modules/utility/source/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/modules/audio_device/Android.mk
include $(MY_WEBRTC_ROOT_PATH)/system_wrappers/source/Android.mk
#
# build .so
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := liblu_audio_preprocessing
LOCAL_MODULE_TAGS := optional
LOCAL_WHOLE_STATIC_LIBRARIES := \
    libwebrtc_spl \
    libwebrtc_apm \
    libwebrtc_apm_utility \
    libwebrtc_vad \
    libwebrtc_ns \
    libwebrtc_agc \
    libwebrtc_aec \
    libwebrtc_aecm \
    libwebrtc_system_wrappers \
    libwebrtc_audio_device \
    libwebrtc_utility
#
# Add Neon libraries.
ifeq ($(WEBRTC_BUILD_NEON_LIBS),true)
LOCAL_WHOLE_STATIC_LIBRARIES += \
    libwebrtc_aecm_neon \
    libwebrtc_ns_neon \
    libwebrtc_spl_neon
endif
LOCAL_STATIC_LIBRARIES := \
    libprotobuf-cpp-2.3.0-lite
LOCAL_SHARED_LIBRARIES := \
    libcutils \
    libdl \
    libstlport
LOCAL_PRELINK_MODULE := false
#
#TODO(billhoo) find a properway to do this.
LOCAL_LDLIBS += $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/libgnustl_static.a
LOCAL_LDLIBS += -lOpenSLES
ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif
include $(BUILD_SHARED_LIBRARY)

いくつかの注意点:

1) コンパイル時に ../../../Android.mk ファイルが見つからないというメッセージが表示された場合は、相対パスを確認して修正してください。

2) 60 行目の gnu スタティック ライブラリのリンク パスは NDK バージョン r8d 用です. リーダーのバージョンが一致しない場合は、libgnustl_static.a スタティック ライブラリのパスを見つけて置き換えてください.

3) この例では、WebRTC テスト プロジェクトをコンパイルするつもりはありません.Eclipse の検索ファイル機能を使用して、Android.mk ファイル内の -DWEBRTC_AUDIOPROC_DEBUG_DUMP を検索し、コメント アウトしてください。

ステップ 3.4

すべての準備が整い、APM のコンパイルを開始できますが、コンパイル プロセス中に多くの小さな問題 (相対パスが正しくない、特定の関数のシンボルが見つからないなど) が確実に発生します。これらの問題は読者に任せます。自身が Google, SO で解決

ステップ 4 - Android アプリで APM を使用する場合の注意事項

上記の手順の後、読者はダイナミック リンク ライブラリ libwebrtc_audio_preprocessing.so を取得できます。独自の jni ラッパー関数を記述して、Android アプリケーション層に APM インターフェイスを提供するだけです。ここで、読者がコンパイル済みの APM ライブラリを独自の動的ライブラリで参照する場合、android クラスによって 2 つのライブラリがロードされる順序は重要であることに注意してください。

リーダーが独自の JNI インターフェイスを別のライブラリ libmy_jni_wrapper.so にカプセル化し、ライブラリが libwebrtc_audio_preprocessing.so を参照すると仮定すると、これら 2 つのライブラリをロードするときは、次のシーケンスに従う必要があります。

static {
    // Ordering of loading these shared libraries is significant.
    System.loadLibrary("webrtc_audio_preprocessing");
    System.loadLibrary("my_jni_wrapper");
}

順序が逆の場合、webrtc_audio_preprocessing ライブラリ内のシンボルが見つからないという例外が実行時に発生します。

要約する

コンパイル作業全体は今では非常に単純に見えますが、多くの忍耐と検索が必要ですが、結果は非常に満足のいくものです. APM の効果は、各オーディオ モジュールを単独で使用する場合よりもはるかに優れています. しかし、ジッターなどの影響に対してはAPMは無力です。

 この記事の利点は、C++ オーディオおよびビデオ学習キット、技術ビデオ(オーディオおよびビデオ開発、インタビューの質問、FFmpeg webRTC rtmp hls rtsp ffplaysrs など) ↓↓↓↓↓↓以下を参照してください↓↓記事下部の受信をクリック↓↓

おすすめ

転載: blog.csdn.net/m0_60259116/article/details/126389659