Java 获取音频文件的持续时间-Android
我试图通过单击Java 获取音频文件的持续时间-Android,java,android,Java,Android,我试图通过单击列表视图来更改音频文件的持续时间。在这个列表视图中,我正确地显示了他们的名字,我可以播放他们,但我想知道它的持续时间 我在Stackoverflow中寻找了不同的问题,这些问题实际上似乎可以回答这个问题,但我不能真正做到这一点,所以我将把我的尝试留在这里。我已经试着遵循这一点,但它不起作用,所以我假设我正在获得或理解Uri 该文件存储在/raw/ JAVA-第一次尝试 listView.setOnItemClickListener(new AdapterView.OnItemCli
列表视图
来更改音频文件的持续时间。在这个列表视图中,我正确地显示了他们的名字,我可以播放他们,但我想知道它的持续时间
我在Stackoverflow中寻找了不同的问题,这些问题实际上似乎可以回答这个问题,但我不能真正做到这一点,所以我将把我的尝试留在这里。我已经试着遵循这一点,但它不起作用,所以我假设我正在获得或理解Uri
该文件存储在/raw/
JAVA-第一次尝试
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// play desired audio
Field[] fields = R.raw.class.getFields();
if(soundMap.selectedEncoder != null) {
//Log.d(TAG, String.valueOf(soundMap.getX()) + " " + String.valueOf(soundMap.getY()));
soundMap.selectedEncoder.play(position, audioFiles[position]);
// Get duration of the audio file
Uri uri = Uri.parse("/raw/"+fields[position].getName());
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(getApplicationContext(), uri);
String durationStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
//int audioFileDuration = Integer.parseInt(durationStr);
}
}
});
File audioFile = new File("/raw/"+fields[position].getName()+ ".mp3");
mmr.setDataSource(context, Uri.fromFile(audioFile));
String time = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long timeInMillisec = Long.parseLong(time );
String path = context.getFilesDir().getAbsolutePath();
try {
mediaPlayer.setDataSource(path + fields[position].getName() + ".mp3");
} catch (IOException e) {
e.printStackTrace();
}
int audioFileDuration = mediaPlayer.getDuration();
编辑-第三次尝试
最后我使用了MediaPlayer
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.andthenturnleft);
if (afd == null) return;
try {
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IOException e) {
e.printStackTrace();
}
int audioFileDuration = mediaPlayer.getDuration();
/*try {
我得到了文件的持续时间。然而,首先我得到以下错误:
E/MediaPlayerActive:尝试在错误状态下调用getDuration:
mPlayer=0xf6f4e7a0,mCurrentState=2
我假设生成错误是因为在第一次尝试获取持续时间时,MediaPlayer
尚未准备就绪。我想停止代码,直到它准备好。然而,最后我得到的audioFileDuration
值为24
,这是不可能的,因为它应该以毫秒为单位返回值,并且文件长度为2秒
第四次尝试
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// play desired audio
Field[] fields = R.raw.class.getFields();
if(soundMap.selectedEncoder != null) {
//Log.d(TAG, String.valueOf(soundMap.getX()) + " " + String.valueOf(soundMap.getY()));
soundMap.selectedEncoder.play(position, audioFiles[position]);
// Get duration of the audio file
Uri uri = Uri.parse("/raw/"+fields[position].getName());
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(getApplicationContext(), uri);
String durationStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
//int audioFileDuration = Integer.parseInt(durationStr);
}
}
});
File audioFile = new File("/raw/"+fields[position].getName()+ ".mp3");
mmr.setDataSource(context, Uri.fromFile(audioFile));
String time = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long timeInMillisec = Long.parseLong(time );
String path = context.getFilesDir().getAbsolutePath();
try {
mediaPlayer.setDataSource(path + fields[position].getName() + ".mp3");
} catch (IOException e) {
e.printStackTrace();
}
int audioFileDuration = mediaPlayer.getDuration();
问题是,这种情况下,我得到的值为0,因为它找不到该文件
打开失败:enoint(没有这样的文件或目录)
如何正确获取文件的路径
已解决
我已经发布了自己的解决方案。我只需要找到一种新的方法来设置文件的路径,最终我成功地做到了。最后,我使用了另一种方法来获取文件的
路径,并且我能够解决这个错误。我在这里复制了我使用的代码:
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.14'
FFmpegMediaMetadataRetriever metadataRetriever = new FFmpegMediaMetadataRetriever();
metadataRetriever = new FFmpegMediaMetadataRetriever();
metadataRetriever.setDataSource(url);
LogMessage.v("1::Duration" + retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));
Uri mediaPath = Uri.parse("android.resource://com.package.name/" + R.raw.audioname);
mmr.setDataSource(context, mediaPath);
String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
Log.d(TAG, duration);
mmr.release();
你在mediametadata检索中遇到问题,我也编辑了你的代码,试试看……如果它不起作用,请使用我下面的答案