android - 是否可以在不下载的情况下获得远程音频文件的持续时间?

标签 android android-mediaplayer

我有一个远程音频文件的 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/

相关文章:

android - 如何在 android studio 3.0 中让 logcat 标签编辑器变大?

android - 手动更改手机连接的手机

Android:音频流延迟期间的 prepareAsync()

Android:使用硬件键控制 STREAM_ALARM 音量

android - 如何以编程方式设置 TextView 的边框颜色?

java - 在 isActionMove() 上执行单点触摸

java - ActionBarSherlock 自定义 NavigationDrawer 图标

Android MediaPlayer 不播放声音

android - Exoplayer Mediaplayer Android延迟应用PlaybackParameters

java - 由 java.lang.IllegalArgumentException : MediaButtonReceiver component may not be null 引起