Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取音频文件的持续时间-Android_Java_Android - Fatal编程技术网

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检索中遇到问题,我也编辑了你的代码,试试看……如果它不起作用,请使用我下面的答案