16
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Android でオーディオファイルの再生時間(長さ)を取得する方法

Last updated at Posted at 2014-04-28

遅いけど MediaPlayer を使いましょう

:notes: Android で mp3 やらの再生時間が欲しいときにどうやったらスマートに再生時間(長さ)を取得できるのか?という疑問はときどき出てくるんだけど、車輪の再発明的なアプローチは大変だから、遅いけどMediaPlayer使いましょうという話。

ぜんてい

  • オーディオファイルの再生時間を知りたい
  • MediaStore が効いていない場合(ダウンロード直後等)

サンプル

public static int getDuration(File audioFile) {
  MediaPlayer mp = new MediaPlayer();
  FileInputStream fs;
  FileDescriptor fd;
  fs = new FileIputStream(audioFile);
  fd = fs.getFD();
  mp.setDataSource(fd);
  mp.prepare(); 
  int length = mp.getDuration()
  mp.release();
  return length;
}

このコードは MediaPlayer#prepare() しているので遅い。でもこれが確実でいいよ♪

FileDescriptor について

FileDescriptor って、Javaのずっと昔からあるクラスなんだけど、知られていないクラス。良くある初心者向けの解説書なんかには絶対出てこないレベル。で、MediaPlayer#setDataSource が引数に File を取らないのは何故だろう?FileDescriptor なのは何故?という話。

MediaPlayer#setDataSource(String path) というのもあって、path はファイルのパスもOKだし、http, rtsp といったプロトコルのURLでもOK。Android なんかはネットに接続されたデバイスで、ローカルのファイルもネット上の何かも同じように扱うという思想が反映された実装。FileDescriptor 自体は実行環境のInputもOutputも扱うより抽象的な概念で、それがローカルファイルであろうと、インターネット上のものであろうと抽象的に取り扱う。だから、 MediaPlayer#setDataSource(File file) はあるだけできもい。

さんこう

  • android - Determining the duration and format of an audio file - Stack Overflow - http://goo.gl/sDjn7X
  • FileDescriptor について丁寧に解説したURLが・・・消えた

あとがき

  • グロースハッカーはいなくなっていいよ
16
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?