首页 > 代码库 > MediaRecord断点录音

MediaRecord断点录音

MediaRecord在录音的过程中,当你暂停录音后,再重新录音而不出现异常,那么必须得调用reset、prepare重置录音状态。

假如你调用的setOutputFile(path)方法的参数不变的话,那么你之前的录音将不会保存,只会保存第二段录音。如何实现断点

录音呢?我在网上看到有说是拼接文件,及将每段录音存在不同的文件中,到最后拼接在一起,具体可参见:

http://www.shangxueba.com/jingyan/1865347.html

这种做法可行,但是后面文件的文件头去掉了,只留第一段录音的文件头,那么我们在播放音频文件时,会发现,我们通过

MediaPlayer的getDuration方法获取的播放时长是第一段录音的文件播放时长,这样的话,我们就不好控制该音频的播放了。

获取音频文件,我一般是从MediaStore媒体库中获得,这个媒体库存放了系统中多媒体文件,我们可以通过查询数据库,就

可以获取多媒体文件的详细信息。

为了让我们的录音文件的时长得以保存,我们也可以将我们录音总时长保存到数据库中(及先求每段录音文件总时长,再拼接)

文件。

然后将相关信息一并保存到该数据库中。

private Uri addToMediaDB(File file) {
        LogUtils.i(TAG, "<addToMediaDB> begin");
        if (null == file) {
            LogUtils.i(TAG, "<addToMediaDB> file is null, return null");
            return null;
        }
        SoundRecorderUtils.deleteFileFromMediaDB(getApplicationContext(), file.getAbsolutePath());
        Resources res = getResources();
        long current = System.currentTimeMillis();
        Date date = new Date(current);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(getResources().getString(
                R.string.audio_db_title_format));
        String title = simpleDateFormat.format(date);
        final int size = 8;
        ContentValues cv = new ContentValues(size);
        cv.put(MediaStore.Audio.Media.IS_MUSIC, "0");
        cv.put(MediaStore.Audio.Media.TITLE, title);
        cv.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / FACTOR_FOR_SECOND_AND_MINUTE));
        LogUtils.v(TAG, "<addToMediaDB> File type is " + mCurrentRecordParams.mMimeType);
        cv.put(MediaStore.Audio.Media.MIME_TYPE, mCurrentRecordParams.mMimeType);
        cv.put(MediaStore.Audio.Media.ARTIST, res.getString(R.string.unknown_artist_name));
        cv.put(MediaStore.Audio.Media.ALBUM, res.getString(R.string.audio_db_album_name));
        cv.put(MediaStore.Audio.Media.DATA, file.getAbsolutePath());
        cv.put(MediaStore.Audio.Media.DURATION, mTotalRecordingDuration);
        LogUtils.d(TAG, "<addToMediaDB> Reocrding time output to database is :DURATION= "
                + mCurrentFileDuration);
        ContentResolver resolver = getContentResolver();
        Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Uri result = null;
        /** M: add exception process @{ */
        try {
            result = resolver.insert(base, cv);
        } catch (UnsupportedOperationException e) {
            LogUtils.e(TAG, "<addToMediaDB> Save in DB failed: " + e.getMessage());
        }
        /** @} */
        if (null == result) {
            mOnErrorListener.onError(ErrorHandle.ERROR_SAVE_FILE_FAILED);
        } else {
            LogUtils.i(TAG, "<addToMediaDB> Save susceeded in DB");
            if (PLAYLIST_ID_NULL == getPlaylistId(res)) {
                createPlaylist(res, resolver);
            }
            int audioId = Integer.valueOf(result.getLastPathSegment());
            int playlistId = getPlaylistId(res);
            if (PLAYLIST_ID_NULL != playlistId) {
                addToPlaylist(resolver, audioId, playlistId);
            }
            // Notify those applications such as Music listening to the
            // scanner events that a recorded audio file just created.
            /**
             * M: use MediaScanner to scan record file just be added, replace
             * send broadcast to scan all
             */
            mFilePathToScan = file.getAbsolutePath();
            mConnection.connect();
        }
        return result;
    }

MediaRecord断点录音