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;

}

时间: 2024-12-11 10:16:54

MediaRecord断点录音的相关文章

Android基础入门教程——9.4 使用MediaRecord录音

Android基础入门教程--9.4 使用MediaRecord录音 标签(空格分隔): Android基础入门教程 本节引言 本节是Android多媒体基本API调用的最后一节,带来的是MediaRecord的简单使用, 用法非常简单,我们写个例子来熟悉熟悉~ 1.使用MediaRecord录制音频 运行结果: 实现代码: 布局代码:activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/a

iOS开发之音频播放、录音

iOS的音频播放可以分为短音频播放(例如:音效等点缀音频)和长音频播放(例:音乐等主音频).前者不需要对进度.循环等进行控制,而后者需要精确的控制.在iOS中播放这两种音频分别使用AudioToolbox.framework和AVFoundation.framework来完成. 短音频音效 AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service).System Sound Service是一

MediaRecord一些使用记录

今天学习了MediaRecord的使用,第一次使用做个记录. MediaRecord作用是声音录制,使用步骤如下: 1.新建出音频文件代码如下: 先创建出用于存储音频文件 File dir = new File(Environment.getExternalStorageDirectory(), "sounds");if (!dir.exists()) { dir.mkdirs();}File soundFile = new File(dir, System.currentTimeMi

Android之AudioRecord录音实现

前言: 其实在Android中录音可以用MediaRecord录音,操作比较简单.但是不能对音频进行处理.考虑到项目中做的是实时语音只能选择AudioRecord进行录音. 本文算是对AudioRecord来个回顾: public class AudioRecordManager { public static final String TAG = "AudioRecordManager"; private AudioRecord mRecorder; private DataOutp

python学习笔记二:if语句及循环语句,断点,模块,pyc

if语句 注意:语句块中的内容要强制缩进,否则出错.IndentationError,缩进错误 所有代码,如果是顶级的,必须顶格写,前面不能有空格 if - : - elif - : - else: - while语句 while -: - else: - for语句 for i in range(10)--i默认0,步长默认1,最大为9 for i in range (0,2,10)--从0开始,步长为2,最大为8 for  i   in range(-): - else: - break--

Chrome 中的 JavaScript 断点设置和调试技巧

你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容.嗯~,用这两种土办法确实解决了很多小型 JavaScript 脚本的调试问题.不过放着 Chrome 中功能越发强大的开发者工具不用实在太可惜了.本文主要介绍其中的 JavaScript 断点设置和调试功能,也就是其中的 Sources Panel(以前叫 Scripts).如果你精通 Eclipse 中的

通过服务监控手机呼叫状态并进行录音

两个服务互相守护 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:or

多线程断点下载原理(java代码实例演示)

其实多线程断点下载原理,很简单的,那么我们就来先了解下,如何实现多线程的断点下载,首先:你必须明白第一点,那么就是,什么是多线程下载,该知识点可以查看本博客上一篇文章,Android之多线程下载原理,断点下载呢,其实就是在这个的基础之上添加了一些东西,那么添加了什么东西了,现在来做一个详细的了解. 1.在下载的过程中,边下载,变用一个文件来记录下载的位置,也就是下载了多少的数据 1.创建文件 2.记录下载多少数据 3.存储数据 2.第二次下载的时候,就去读取文件中是否存有数据,读取上次下载的位置

&#24494;&#20449;JSSDK&#19982;&#24405;&#38899;&#30456;&#20851;&#30340;&#22353;

微信JSSDK与录音相关的坑 最近一直在做微信JSSDK与录音相关的功能开发, 遇到了各种奇尺大坑, 时不时冷不丁地被坑一道, 让我时常想嘶吼: "微信JSSDK就是个大腊鸡!!!!!!!!!!" 现在工作得到阶段性成果, 有时间休息总结下, 故来整理一下这段时间碰到的bug, 希望做个前车之鉴, 劝大家谨慎入坑. checkJsApi 功能: 判断当前客户端版本是否支持指定JS接口 转载:  http://www.fwqtg.net/%E5%BE%AE%E4%BF%A1jssdk%E