我有一个远程音频文件的 URL。我需要为带有跟踪详细信息的适配器列表构建数据。这是这部分代码
Log.d("audioURL", audio.getUrl());
MediaPlayer tmpMedia;
tmpMedia = MediaPlayer.create(getContext(), Uri.parse(audio.getUrl()));
holder.txtDuration.setDuration(tmpMedia.getDuration()/1000);
tmpMedia.release();
但它工作得太慢了。 LogCat 是这样写的:
15:05:51.783: D/audioURL(776): http://cs4859.vk.me/u14195999/audios/0cbd695ddf50.mp3
15:05:51.783: D/MediaPlayer(776): Couldn't open file on client side, trying server side
15:05:53.813: D/audioURL(776): http://cs4859.vk.me/u14195999/audios/0cbd695ddf50.mp3
15:05:53.823: D/MediaPlayer(776): Couldn't open file on client side, trying server side
15:05:55.373: D/audioURL(776): http://cs4859.vk.me/u14195999/audios/0cbd695ddf50.mp3
15:05:55.383: D/MediaPlayer(776): Couldn't open file on client side, trying server side
15:05:58.143: D/audioURL(776): http://cs1626.vk.me/u149968/audios/04298447cd3c.mp3
15:05:58.153: D/MediaPlayer(776): Couldn't open file on client side, trying server side
...等等。因此,我的大约 30 首轨道的播放列表在大约 7 分钟内初始化。
我猜,MediaPlayer类方法
getDuration()
按顺序下载这些轨道(或其中的某些部分)以获得它们的持续时间。有没有办法在不下载轨道的情况下快速获得这些持续时间?
Halim Qarroum,这似乎是一个正确的方法,但我对
MediaMetadataRetriever
有一些麻烦类(class)。这是我上面的代码:
if (android.os.Build.VERSION.SDK_INT < 10){
holder.txtDuration.setDuration(audio.getTrackDuration());
} else {
MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
Log.d("URI", Uri.parse(audio.getUrl()).toString());
mRetriever.setDataSource(getContext(), Uri.parse(audio.getUrl()));
String s = mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
holder.txtDuration.setDuration(Long.parseLong(s));
mRetriever.release();
}
应用程序终止于
mRetriever.setDataSource(getContext(), Uri.parse(audio.getUrl()));
因为IllegalArgumentException
. audio.getURl()
字符串是 http://cs4859.vk.me/u14195999/audios/134dfe90d1ec.mp3
.为什么会出现异常?
最佳答案
Dheeb 发布了一个非常详细的答案。但是,ID3 tags
并不总是存在于 mp3 文件中。您可以使用 MediaMetadataRetriever
,而不是寻找这些标签,这将迫使您将此方法限制为 mp3 文件。 Android 框架自带的类。
此类可以为您提供来自某些类型的音频/视频文件的多个元数据,其中一个信息是持续时间。这种方法的优点是标准,因为它带有 Android SDK 并且不限于一种音频格式。
来自 Android 开发者相关页面:
MediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file.
使用此类的代码的简单示例:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(your_data_source);
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long timeInmillisec = Long.parseLong( time );
long duration = timeInmillisec / 1000;
long hours = duration / 3600;
long minutes = (duration - hours * 3600) / 60;
long seconds = duration - (hours * 3600 + minutes * 60);
关于android - 是否可以在不下载的情况下获得远程音频文件的持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552098/