36

ボイスレコーダーアプリを作成しましたが、録音の長さをリストビューで表示したいと思います。私はこのように録音を保存します:

MediaRecorder recorder = new MediaRecorder();
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
folder = new File(Environment.getExternalStorageDirectory()
            + File.separator + "Audio recordings");
String[] files = folder.list();
    int number = files.length + 1;
    String filename = "AudioSample" + number + ".mp3";
    File output = new File(Environment.getExternalStorageDirectory()
            + File.separator + "Audio recordings" + File.separator
            + filename);
    FileOutputStream writer = new FileOutputStream(output);
    FileDescriptor fd = writer.getFD();
    recorder.setOutputFile(fd);
    try {
        recorder.prepare();
        recorder.start();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        Log.e(LOG_TAG, "prepare() failed");
        e.printStackTrace();
    }

このファイルの期間を秒単位で取得するにはどうすればよいですか?

前もって感謝します

---編集動作させました。MediaPlayer.setOnPreparedListener()メソッド内でMediaPlayer.getduration()を呼び出したため、0が返されました。

4

12 に答える 12

91

MediaMetadataRetrieverこれを行うための軽量で効率的な方法です。MediaPlayer重すぎて、スクロール、ページング、リストなどの高パフォーマンス環境でパフォーマンスの問題が発生する可能性があります.

さらに、重いため、再起動を何度も行う必要がある場合があるため、Error (100,0)発生する可能性があります。MediaPlayer

Uri uri = Uri.parse(pathStr);
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(AppContext.getAppContext(),uri);
String durationStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
int millSecond = Integer.parseInt(durationStr);
于 2015-10-02T05:31:01.757 に答える
20

ミリ秒単位で期間を取得するには、これを試してください。

MediaPlayer mp = MediaPlayer.create(yourActivity, Uri.parse(pathofyourrecording));
int duration = mp.getDuration();

または、経過時間をナノ秒単位で測定しrecorder.start()ますrecorder.stop()

long startTime = System.nanoTime();    
// ... do recording ...    
long estimatedTime = System.nanoTime() - startTime;
于 2013-03-13T19:35:46.940 に答える
13

使ってみる

long totalDuration = mediaPlayer.getDuration(); // to get total duration in milliseconds

long currentDuration = mediaPlayer.getCurrentPosition(); // to Gets the current playback position in milliseconds

秒に変換する 1000 の除算。

これがお役に立てば幸いです。

于 2013-03-13T19:35:01.687 に答える
0

このreadyMadeメソッドを使用できます。これが誰かの役に立てば幸いです。

例 1:getAudioFileLength(address, true); // if you want in stringFormat 例 2:getAudioFileLength(address, false); // if you want in milliseconds

public String getAudioFileLength(String path, boolean stringFormat) {

            Uri uri = Uri.parse(path);
            MediaMetadataRetriever mmr = new MediaMetadataRetriever();
            mmr.setDataSource(Filter_Journals.this, uri);
            String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
            int millSecond = Integer.parseInt(duration);

            if (millSecond < 0) return String.valueOf(0); // if some error then we say duration is zero

            if (!stringFormat) return String.valueOf(millSecond);

            int hours, minutes, seconds = millSecond / 1000;

            hours = (seconds / 3600);
            minutes = (seconds / 60) % 60;
            seconds = seconds % 60;

            StringBuilder stringBuilder = new StringBuilder();
            if (hours > 0 && hours < 10) stringBuilder.append("0").append(hours).append(":");
            else if (hours > 0) stringBuilder.append(hours).append(":");

            if (minutes < 10) stringBuilder.append("0").append(minutes).append(":");
            else stringBuilder.append(minutes).append(":");

            if (seconds < 10) stringBuilder.append("0").append(seconds);
            else stringBuilder.append(seconds);

            return stringBuilder.toString();
        }
于 2020-10-08T12:58:29.447 に答える
0

私にとっては、AudioGraph クラスが助けになりました。

public static async Task<double> AudioFileDuration(StorageFile file)
        {
            var result = await AudioGraph.CreateAsync(new AudioGraphSettings(Windows.Media.Render.AudioRenderCategory.Speech));
            if (result.Status == AudioGraphCreationStatus.Success)
            {
                AudioGraph audioGraph = result.Graph;
                var fileInputNodeResult = await audioGraph.CreateFileInputNodeAsync(file);
                return fileInputNodeResult.FileInputNode.Duration.TotalSeconds;
            }
            return -1;
        }
于 2021-01-18T04:07:23.323 に答える
-1

ファイルを書き込んだ後、MediaPlayerで開き、getDurationを呼び出します。

于 2013-03-13T19:29:40.633 に答える
-1

Ringdroidを見たことがありますか。かなり軽量で、統合は簡単です。VBR メディア ファイルでも同様に機能します。

期間を取得する際の問題については、Ringdroid を使用して以下のようなことを行うことができます。

public class AudioUtils
{
    public static long getDuration(CheapSoundFile cheapSoundFile)
    {
        if( cheapSoundFile == null)
            return -1;
        int sampleRate = cheapSoundFile.getSampleRate();
        int samplesPerFrame = cheapSoundFile.getSamplesPerFrame();
        int frames = cheapSoundFile.getNumFrames();
        cheapSoundFile = null;
        return 1000 * ( frames * samplesPerFrame) / sampleRate;
    }

    public static long getDuration(String mediaPath)
    {
        if( mediaPath != null && mediaPath.length() > 0)
            try 
            {
                return getDuration(CheapSoundFile.create(mediaPath, null));
            }catch (FileNotFoundException e){} 
            catch (IOException e){}
        return -1;
    }
}

それが役立つことを願っています

于 2013-08-03T11:06:26.560 に答える