Androidでgstreamerのチュートリアルを動かす

謝辞：本環境作成にあたり、mura_hiro様の
「<a href="https://mura-hiro.com/android-gstreamer/">AndroidアプリでGstreamerを使ってみる</a>」
を参考にさせていただきました。本当にありがとうございます。

基本的には、mura_hiro様の記事で出来るのですが、所々自分の環境と違ってたところがあり、
そういったところって後々絶対忘れるので、備忘録として残します。
まあ、試される方がいれば参考になるかもしれません。いないか・・・。
また、なんでこの記述が必要なの？とか、このエラーが出る原因は？を聞かれても、正直分かりません！
見様見真似でやってるのでご容赦を。

**環境**
--

ホストOS - Windows11 Pro
ターゲット - Android 12 tablet

Android Studio Arctic Fox | 2020.3.1 Patch 4

※Android tabletとはUSBで接続し、Android Studioで認識できているものとします。
※インターネット接続必須です。

**ホストPCでの追加ファイル等**
--

**1) Android NDKのインストール**
Tools -> SDK Managerから、右下黄線の[Show Package Details]をチェック、画面中上部にある、[SDK Tools]を選択し、
[NDK(Side by side)]のリスト内から、[21.4.7075529]をチェックして、[Apply]をクリック。
確認画面が表示されたら[OK]をクリックします。
<BR>ダウンロードサイズは1.0GB程度です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754664/6af0b811-67c9-4655-97f0-5656f69094c3.png)

**2) gstreamerを入手**
<a href="https://gstreamer.freedesktop.org/pkg/android/1.18.5/">https://gstreamer.freedesktop.org/pkg/android/1.18.5/</a>
にある
**gstreamer-1.0-android-universal-1.18.5.tar.xz**(391MB)
をダウンロードして適当なフォルダに解凍します。
解凍したフォルダは後々出てくるので、覚えておきます。

**3) gstreamerチュートリアルをCloneする**
https://github.com/GStreamer/gst-docs
自分はForkしてから、適当なフォルダにCloneしました。

**トラブルシューティング**
--

この手のものって、クローンした～、プロジェクト開いた～、ビルドした～、できたー＼( ^_^)／
って一度で出来たためしがありません・・・。ので、ビルド成功させるために、トラブルシュートから入ります。

まず、Androis Studioを起動し、gstreamerチュートリアルプロジェクトを開きます。
自分の環境では以下ですが、適宜読み替えてください。
```
C:\git\gst-docs_study\examples\tutorials\android
```

**1) Gradleのバージョン**
プロジェクトを読み込むと、いきなり怒られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754664/9cac3247-a8c1-d9f9-3ae3-82b5e52bb5fa.png)

**[解決方法]**
File -> Project Structure -> ProjectのGradle Versionを4.8にしてApplyします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754664/448d899d-3d09-8daf-76ad-24b14617a14f.png)

**2) 環境変数**
1)をApplyした後、自動でsyncが走るんですが、Event Logにエラーが吐かれてsyncがstopします。
```
"Gradle sync failed: GSTREAMER_ROOT_ANDROID must be set, or "gstAndroidRoot" must be defined in your gradle.properties in the top level directory of the unpacked universal GStreamer Android binaries (20 s 215 ms)"
```
gradle.propertiesに"GSTREAMER_ROOT_ANDROID"か"gstAndroidRoot"を定義しろってことなので、定義します。

①そもそもgradle.propertiesが無いので作成します。プロジェクトのトップレベルを右クリックで、New -> Fileを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754664/db9cccd0-8fae-0668-2bec-ec7106d8485a.png)
②ファイル名は、"gradle.properties"とする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754664/560d9f76-9b95-88f1-059e-82606bab08a1.png)
③作成されたファイルに以下を記述します。
1行目のパスは、先の作業でgstreamerを解凍した先を指定します。適宜変更してください。
2-5行目、このトラブルシュートとは関係ないのですが、後々入力する必要があるので、ついでにここで入れておきます。
(なぜ必要かは分かりません。)

```
gstAndroidRoot=C\:\\android\\gstreamer-1.0-android-universal-1.18.5
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
kotlin.code.style=official
android.useAndroidX=true
android.enableJetifier=true
```

syncします。
File -> Sync Project with Gradle Files

**3)NDKパスの指定**
syncがまたもや失敗します。
```
Gradle sync failed: A problem occurred configuring project ':android-tutorial-1'. (10 s 639 ms)
```
'android-tutorial-1'プロジェクトを設定中に、問題が発生しました。。。。
これは、NDKのパスが正しく設定されてないことで発生するようですので、設定します。

①local.propertiesを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754664/c247754a-5321-67d4-b2c8-6aba0c394bea.png)

②sdk.dirの下に、以下の通り1行追加します。
```
ndk.dir=[sdk.dirの=以降全て]\\ndk\\21.4.7075529
```
ndk.dir=以降の[]内には、sdk.dir=以降がそのまま入ります。

例）
sdk.dir=c\\:\\\hoge\\\sdk
だった場合、
ndk.dir=c\\:\\\hoge\\\sdk\\\ndk\\\21.4.7075529
になります。

**sync**
--
**!注意! 以下を実行すると、時間がかかります。(筆者環境では、18分弱ぐらい)**
syncします。
File -> Sync Project with Gradle Files

**実行**
--
syncが終わると、デバッグ実行できるようになってるはずです。
確認したいtutorialを選んで、実行してください。

さいごに
--
今時わざわざプレイヤー作らなくても・・・と思いますが、
それはさておき、これで土俵はできたので、やっと戦えるようになりました。
mura_hiro様、重ねてお礼申し上げます。
ありがとうございました。