首页 > 代码库 > 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断点录音