プログラミング

Android studio|FFmpegでやりたい放題するための準備

投稿日:2020年6月26日 更新日:

動画を利用したアプリを作成するにあたりFFmpegを使用できると大変便利です。Web上に多数の情報がありますが、数年前の記事は役に立たなかったり、実用的な情報が少なかったりします。本記事ではAndroid studioにて「mobile-ffmpeg」を使用して自由に動画操作を行うための準備について述べます。
(ライセンスの問題についてはご自分の責任で判断願います)

Android studio 3.4
mobile-ffmpeg 4.3.2
実機検証:Huawei p10 lite (Android 8.0)

Mobile-ffmpegの導入

数年前の情報だと「FFmpegをビルド」なんてものが出てきます。現行ではそんな難しい操作は必要なく、「Mobile-ffmpeg」というライブラリがgradleに数行記述するだけで利用可能です。

dependencies {
implementation ‘com.arthenica:mobile-ffmpeg-full:4.3.2’
}

バージョンが多数用意されているので自分の利用状況にあったものを選択すれば良いです。詳細は以下をご参照ください。

https://github.com/tanersener/mobile-ffmpeg/releases


データアクセス可能なディレクトリを作成する

mobile-ffmpegの使用方法はGithubのページに記載されています。
https://github.com/tanersener/mobile-ffmpeg

上記ページの「2.1 Android」の「2. Execute FFmpeg Command」にてサンプルコードがあります。一部抜粋すると

int rc = FFmpeg.execute("-i file1.mp4 -c:v mpeg4 file2.mp4");

非常にシンプルなコードですがこのままでは実行できません。「file1.mp4」がアクセス可能な場所にある必要があります。rawフォルダなどに置いた動画ファイルを直接使おうとしても「No such file or directory」となります。アクセス可能なディレクトリの作成方法として容易な方法は外部ディレクトリに自アプリ固有のフォルダを作成する事です。

String myDirName = "Android/data/(パッケージ名)/tmp";
File myDir = new File(Environment.getExternalStorageDirectory(), myDirName);


以下、FFmpegによる入出力は上記フォルダにて行います。

ファイル選択した動画のパスを取得

アプリでの動作の流れとしては「端末内に保存された画像/動画」を読み込んで処理をする事になると思われます。しかし、「Intent」を使用して選択したファイルのパスまたはUriを「onActivityResult」内にて取得しても、絶対パスの形式になっておらず使用することができません。
絶対パスを取得する方法は以下のリンクが参考になりました。

https://kimagureneet.hatenablog.com/entry/2019/03/14/203118

「/storage/emulated/0/〜」のパスが得られればFFmpegコマンド内で使用することができます。

asset下の素材ファイルはコピーして使用

やりたい放題やるためには自分で用意した素材ファイルなどもFFmpegコマンド内で参照できる必要があります。res/rawフォルダなどに置いたファイルは絶対パスが取得できないのでFFmpegコマンドで使用できません。解決策の一つとしては上述で用意した「自アプリ固有のフォルダ」にコピーして使用する事です。
以下の例に習って素材ファイルはassetフォルダを作成してその中に置きます。そしてassetフォルダ内のファイルを「自アプリフォルダ」にコピーすれば、絶対パスが取得できる状態となりFFmpegコマンド内で使用できます。

https://stackoverflow.com/questions/3851712/android-how-to-create-a-directory-on-the-sd-card-and-copy-files-from-res-raw-t

記事内の「copyClipart()」という関数がそのまま使用できると思います。


以上、Android studioにてFFmpegを利用するための準備に関する記事でした。


-プログラミング

執筆者:

関連記事

Admob アプリ起動時広告(Open ad)は使わない事にした話 – 例題通りやっても審査落ち?

Admob広告は初期にはバナーとインタースティシャルしかなかったと記憶しています。その後、少し複雑なリワード広告が登場しました。新しい広告タイプについてはWebに情報が増えてきたら実装に挑戦しています …

サイトの仕様: ナビゲーションを解決する方法。Admobポリシーセンター広告制限

一年ほど前、突如としてAndroidアプリのAdmob広告に配信制限がかかりました。理由は「サイトの仕様: ナビゲーション」。これが厄介で、一体何を修正すべきなのかが全く分かりません。Web検索をかけ …

Mac miniに移行して世界が変わった。MacBook Proは2度と買わない

MacBook Pro(2016)からMac miniに移行して半年くらいが経ちました。何の問題もなく快適に使用できています。移行の経緯とMac Mini使用の感想などについて述べたいと思います。 目 …

Xcode iOSアプリでGUIをコードだけで作成する Storyboard, Sceneなし

アプリメンテナンスをしている際、どうしようもないビルドエラーに遭遇して解決できず、新規プロジェクトで作り直すという事がありました。私のiPhoneアプリ開発歴は結構長く、始めたのは2013年あたりです …

Railway.appでついにRegion選択が可能になった – 2023年版PaaS選び

PaaS選びの際、Web検索で情報収集をすると多くの記事が見つかりますが、料金情報などを並べただけで実際に利用した情報がないように思われます。本記事では実際に身銭を切っている立場からPaaS選びについ …