この記事では、Android(Java開発)にてOpenCVのVideoCaptureを使い、デバイスのストレージから動画を読み込む手順をメモしました。自分でつまづいたところを中心に、方法をまとめました。
OpenCVやAndroidStudioの環境設定については、今回は完了してる前提で説明します。
要点
- UriからFilePathへの変換(ここがむずかった)
- OpenCV 3.4.16ではVideoCaptureできなかった(4.5.4を使用したらできた)
- パーミッションの設定
URIからFilePathへの変換
これについては、細かいことはわかりませんが試行錯誤していたらできたので
ソースコードを載せておきます。あくまでも、動画ファイルを読み込む場合です。
主にここを参考にしました:https://stackoverflow.com/questions/3401579/get-filename-and-path-from-uri-from-mediastore
private String getPictPath(Uri uri) {
String wholeId = DocumentsContract.getDocumentId(uri);
String id = wholeId.split(":")[1];
Log.d("id",id);
ContentResolver cr = getContentResolver();
String[] columns = {
MediaStore.Images.Media.DATA
};
String selection = null;
String[] selectionArgs = null;
selection = "_id=?";
Cursor cursor = cr.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
columns, selection, new String[]{id}, null);
cursor.moveToFirst();
String path = cursor.getString(
cursor.getColumnIndexOrThrow(columns[0]));
cursor.close();
return path;
}
OpenCVのバージョン
Pathが手に入っても、なぜかVideoCaptureが動作しませんでした。
OpenCVのバージョンを”3.4.16″から”4.5.4“に変更したら動きました。
Permissionの設定
Permissionの設定もしなければいけません。
AndroidManifest.xmlに以下のコードを追加。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
さらに、MainActivity.javaのonCreate関数内で以下のコードを追加
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
以上
あとは、
VideoCapture videoCapture = new VideoCapture(path);
で読み込みできます。
自分はこれで動きました。自分でもなぜそうするのかがわかっていない部分もあるので
詳しいことはわかりません。
上記内容は色々調べてもパッとわかるような資料がなかったので、今回記事にしました。
この記事が誰かの役に立つことを祈っております。