mura-hiromura-hiroホームITスキルAndroidAndroidアプリでGstreamerを使ってみる2022/01/10SHAREツイートシェアはてブGoogle+PocketLINEAndroidアプリでGstreamerを使う手順を紹介します。下記の公式チュートリアルに従って進めます。1.18.5Gstreamerを開発用PCにインストールする公式サイトのインストール手順を参考に、開発用PCにGstreamerをインストールします。developmenthttps://gstreamer.freedesktop.org/documentation/installing/for-android-development.html?gi-language=cGstreamerを開発用PCにダウンロードしますhttps://gstreamer.freedesktop.org/data/pkg/android/私は1.18.5をダウンロードしました。https://gstreamer.freedesktop.org/data/pkg/android/1.18.5/下記の圧縮ファイルををダウンロードし、7ZIPで解凍しました。https://gstreamer.freedesktop.org/data/pkg/android/1.18.5/gstreamer-1.0-android-universal-1.18.5.tar.xz7ZIPで解凍する方法は以下を参照してください。7ZIPは管理者権限で実行してください。管理者権限でないと、tarを解凍する時にアクセス権限が足りず失敗します。Kit)をインストールします。NDKにチェックを入れ、Applyを押下します。以下の画面キャプチャではv23をインストールしていますが、Gstreamer1.18.xの推奨はv21でしたので、v21を指定しましょうチュートリアルをcloneするgithubからチュートリアルをcloneします。https://github.com/enthusiasticgeek/Gstreamer_Android_Tutorials.gitGstreamer1.18.xに対応しているのはこちらのリポジトリでした。https://gitlab.freedesktop.org/gstreamer/gst-docs/-/tree/1.18以降Tutorial-2までは、v18に対応していないチュートリアルを頑張って修正していますが、Tutorial-3の途中でリポジトリが間違っていることに気づいて使用するリポジトリを変えました。v18を使用する場合はTutorial-3の記載を参考にしてください。Tutorial-1「Gstreamer_Android_tutorials」には複数のチュートリアルが含まれています。Tutorial-1のプロジェクトを開きます。local.propertiesを開くと「sdk.dir」と「ndk.dir」が記載されていますが、「ndk.dir」は環境に合わせて修正できていないため、「sdk.dir」で指定されてフォルダの下にある「ndk\インストールしたndkバージョン」のフォルダを指定するように変更します。sdk.dir=C\:\\Users\\username\\AppData\\Local\\Android\\Sdkndk.dir=C\:\\Users\\username\\AppData\\Local\\Android\\Sdk\\ndk\\23.1.7779620次にndk-buidのタスクに環境変数「GSTREAMER_ROOT_ANDROID」を追加します。'NDK_APPLICATION_MK=src/main/jni/Application.mk'}次にSyncしようとすると以下のエラーが起きる可能性があります。structureでGradleバージョンを4.8、プラグインのバージョンは対応する3.2.1にしてSyncします。Studioを管理者権限で開いていない場合、gradle用のフォルダ作成でエラーになる可能性があるので、管理者権限で実行してください。Syncが成功した後に私の環境でデバック実行すると、以下のエラーが起きました。'windowsの場合はndk-buidを実行するファイルの拡張子まで記載する必要があるので、build.gradleでndk-buildを実行している箇所に、拡張子を追記します。'NDK_APPLICATION_MK=src/main/jni/Application.mk'実行すると私の環境ではエラーが出ました。‘-fuse-ld=gold.exe’どうも私の環境にはgold.exeというリンカーがないようなので、以下のファイルにアクセスし“C:\android\gstreamer-1.0-android-universal-1.18.5.tar\gstreamer-1.0-android-universal-1.18.5\armv7\share\gst-android\ndk-build\gstreamer-1.0.mk”83行目の記載を以下に変更して、リンカーを指定しないようにしました。-Wl,-soname,lib$(GSTREAMER_ANDROID_MODULE_NAME).so実行すると上記のエラーは解消されましたが、以下のエラーが出ました。exist.ndkLibsToJarをndk-buidタスクの後に実行すれば回避できましたが、以下のエラーが出ました。':app:_internal_aapt2_binary'.build.gradleのjcenterをmavenCentral()に変更し、allprojectsのrepositoriesにもgoogle()を追加することで回避できました。}}次はエミュレータにマッチしたABIがないのでエラーが出ました。INSTALL_FAILED_NO_MATCHING_ABISAndroid.mkとApplication.mkでABIを指定している箇所を、私が利用していたエミュレータのABIである「x86」に変更して実行したところ、ビルドが成功しました。x86Tutorial-2Tutorial-1で実施したことを同様に実施します。gradleを4.8、pluginを3.2.1に変更するjcenter()をmavenCentral()に変更するrepositoriesにgoogle()を追加するndk-buidのタスクに環境変数「GSTREAMER_ROOT_ANDROID」を追加するndk-buildのタスクでndk-buildをコマンドラインで実行するところに拡張子「.cmd」を追加するlocal.propertiesのndkのパスを環境に合わせて修正する(x86のエミュレータを利用する場合)Android.mkとApplication.mkでarmv7をしている箇所をx86に変更する次に以下の順でデバックを開始します。これはデバッグタスクで実行されるので個別の実行は不要なようですデバッグ実行するTutorial-3~5デバッグ実行したときにエラーが出ました。foundAPKにlibc++_shared.soが入っていない場合に起きるエラーらしいです。Application.mkに以下を追記してみましたが、エラーが解消しません。c++_sharedhttps://developer.android.com/ndk/guides/cpp-support#selecting_a_c_runtime以下のページで、Gstreamerのv18からdummy.cppを追加する必要があるとの記載がありました。changeshttps://gitlab.freedesktop.org/gstreamer/gst-docs/-/commit/5441a572d99375fb1a74d84dd3d619a8518d484f上の記事通りにすると、このエラーが起きました。Stop.そして、このエラーの調査中に以下の記事をみて、v18に対応したチュートリアルのリポジトリがあることに気づき、https://github.com/centricular/android_rtsp_example/issues/3このリポジトリをcloneしました。https://gitlab.freedesktop.org/gstreamer/gst-docs/-/tree/1.18Tutorial-3をオープンするとビルドが成功しないので、まずgst-docs\examples\tutorial\androidでプロジェクトを開きます。gradleとプラグインのバージョンをを上げてビルドすると、以下の記事と同じエラーが出ます。https://medium.com/swlh/lets-have-fun-gstreamer-android-tutorial-1-951ebfbb3f1e記事通りに各問題を解消していけば解消しますが、NDKのバージョンは21.xxを指定しないと私の環境では動きませんでした。次に、上記記事にないエラーが発生しました。found.ターゲットsdkをupgradeすることで解消できました。SurfaceViewがないと初期化できない作りになっています。messages:ネットワークの帯域が狭い時は、バッファを利用することで対応できるそう。コメントをキャンセルメールアドレスが公開されることはありません。音楽ポルノグラフィティこのサイトについて製造業のソフトウェア開発部で働くmura-hiroが、ソフトウェアエンジニアの目線で技術とキャリアについてお話します。