gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:56:25 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com