Androidアプリ開発の話
こういう感じで動画カット機能を実装したい
- ユーザーに動画を端末から選ばせる
- カットの始点・終点時間を選択させる
- それを別動画ファイルとして保存
探したらピッタリなライブラリがありました。
その名も Android-Video-Trimmer というライブラリ
MITライセンスだから安心して使えるし、
そのAndroid-vide-trimmerの使い方コード例を記録します
このページの目次
1.まずAndroid-Video-Trimemrをインストールする
Android Studio上での手順です。
まずアプリレベルのbuild.gradleを開きます。
▼ そこに次のライブラリを追加
1 2 |
/// ライブラリ追加 implementation 'com.github.a914-gowtham:android-video-trimmer:1.7.0' |
次にプロジェクトレベルのbuild.gradleを開きます。
▼ 次のようにrepositoryを追加する
1 2 3 4 5 6 |
allprojects { repositories { /// 次のリポジトリ追加 maven { url 'https://jitpack.io' } } } |
あとは[Sync Now]を押して同期させれば完了
2.動画取得&トリマー起動用のActivityResultLauncher作成
ここからはActivity上でのコードです。
カット対象の動画を選択させないといけません。
そのために次のコードを書きました。
▼ 動画取得&トリマー起動のActivityResultLauncher
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
val openVideoLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == Activity.RESULT_OK && result.data != null) { val uri: Uri? = result.data?.data try { /// 動画の幅・高さの調整 val wAndh = TrimmerUtils.getVideoWidthHeight(this,uri) var width=wAndh[0] var height=wAndh[1] if(wAndh[0]>800){ /// 幅800を越えてたら半分に width/=2; height/=2 } /// フレームレート(FPS) val frameRate = 30 /// ビットレート val bitRate = "150K" /// 動画カットのアクティビティを起動 TrimVideo.activity(uri.toString()) .setAccurateCut(true) .setCompressOption( /// 圧縮オプション CompressOption(frameRate,bitRate,width,height) ) .setHideSeekBar(true) /// 以下の部分は後述 .start(this,videoTrimmerLauncher); }catch(e: IOException){ /// 起動失敗時 } } } |
▼ そしてこのランチャーを次コードで起動させる
1 2 3 4 5 |
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) intent.type = "*/*" val title = "Select video format" val chooser = Intent.createChooser(intent, title) openVideoLauncher.launch(chooser) |
※ Kotlinによるコード
細かい所はコメントなどを参照
ひとまずユーザーから動画を選んでもらうため、 Intent.ACTION_OPEN_DOCUMENT からファイルピッカーを起動させてます。
▼ ACTION_OPEN_DOCUMENTの詳細/別の使用例
単一・複数のファイルを開くのに便利なAPIです。
今までは onActivityForResult でコールバックを受け取ってたけど、これからはActivityResultLauncherを使うのが推奨のやり方みたいです。(従来の方法もdeprecatedだけど使えるので心配なし)
3.カット・トリミングされた動画の場所(URI)を取得
そして動画カットのアクティビティが起動します。
▼ このような画面でカットができる
そしてカット完了後、動画が次の場所に保存されます。
▼ 例えばとある端末では以下のパスに保存される
1 |
/Android/data/[アプリパッケージ名]/files/TrimmedVideo/[保存された動画ファイル名] |
カット後にこのURLを取得したいですよね?
そのために次のようなコードが書けます。
▼ カット後に保存された動画URIを取得コード
1 2 3 4 5 6 7 8 9 10 |
val videoTrimmerLauncher = registerForActivityResult( StartActivityForResult() ) { result: ActivityResult -> if (result.resultCode == RESULT_OK && result.data != null) { /// カットされた保存動画URI val uri: Uri = Uri.parse(TrimVideo.getTrimmedVideoPath(result.data)) } else { /// エラー時処理 } } |
このコードのように Uri.parse(TrimVideo.getTrimmedVideoPath(result.data)) から保存された動画URIを取得することができます。
あとはその動画をよしなに処理してください
4.Android12以降でも動作することは確認済み(動画)
ちなみに互換性についてです。
少なくともAndroid12でもしっかり動きました。
▼ 実際の動画トリミングの様子
ここに動画は張りたくないのでnoteを利用しました。
マウス表示から分かるようにエミュレータです。
実機確認がベストなのは承知ですが、動画・画像関係ならエミュレータでも十分ですね。ただし特定分野(例えば3Dモデル・CG描画)はエミュレータでは役に立たない場合が多いです。
今回はひとまずエミュレータで確認済み
Android12(APIレベル31)でも動作してくれます
以上、Android-video-trimmerについてでした。ではまた
5.ちなみに動画のメタ情報の取得について
この記事とは直接は関係ないです。
でもカット動画のメタ情報が知りたい場面もあるはず
- 幅や高さなどのサイズ
- フレームレート(FPS)
- ビットレート(BPS)
- 再生時間(マイクロ秒)
こういうメタ情報の取得にライブラリは不要です。
▼ 動画フレームレート・ビットレートを取得する方法
取得にはMediaExtractorというAPIを使います。
こういった標準APIも活用していきたいですね。