はじめに
株式会社THIRD IT開発部でモバイル開発チームでアプリ(Android及びiOS)の開発を行なっているエンジニアです。
弊社では不動産の点検や作業報告などをスマートフォンで行うためのアプリとして,管理ロイド等のアプリを開発及びリリースしています。
管理ロイドではマンション等の各種点検業務でビデオデータを添付する事があります。
添付したビデオデータがごく稀に壊れている場合があるためMediaExtractor
を使用しメディアデーター内のソースを確認する事としました。
ビデオ撮影について
ビデオ撮影についてはACTION_VIDEO_CAPTUREを使用してカメラアプリに撮影してもらっています。
カメラアプリ呼び出し例
val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
startActivity(intent)
撮影されたビデオデータが問題ないかのチェック
ビデオデータが正しいかどうかを確認するために下記を確認する
- Videoソース及びAudioソースがある事を確認
- 各ソースのdurationが0より大きいこと
実装方法
MediaExtractorを使用し、Video及びAudioデーターソースを確認します。
下記がサンプルコードになります。
fun checkVideoSource(path: String): Boolean {
val extractor = MediaExtractor()
extractor.setDataSource(path)
val trackCount = extractor.trackCount
if (trackCount < 2) return false
var audioFormat: MediaFormat? = null
var videoFormat: MediaFormat? = null
for (i in 0 until trackCount) {
val format = extractor.getTrackFormat(i)
val mime = format.getString(MediaFormat.KEY_MIME)
if (mime?.startsWith(MIMETYPE_AUDIO) == true) {
audioFormat = format
} else if (mime?.startsWith(MIMETYPE_VIDEO) == true) {
videoFormat = format
}
}
var result = false
if (audioFormat != null && videoFormat != null) {
result = (audioFormat.getLong(MediaFormat.KEY_DURATION) > 0L) && (videoFormat.getLong(MediaFormat.KEY_DURATION) > 0L)
}
extractor.release()
return result
}
まとめ
ACTION_VIDEO_CAPTURE
で撮影したデータが壊れていたという事はそうそう発生しないとは思いますが、
後で確認したらデータが壊れていたとなると、再度現場へ行き撮影するのは多大なコストになるため、
撮影後に簡単なチェックをし、問題がある場合には再度撮影してもらうためのアラートを出す事で不足の事態に備えています。