精华内容
下载资源
问答
  • Android、iOS录音时音量大小计算
    2021-02-27 08:55:38

    经常有人问我如何计算录音时音量大小。iOS平台是有api可以直接调用的,但是Android平台上没有比较好的办法,因此我们就不得不自己计算了。

    之所以有计算音量这个需求,是因为很多应用希望根据音量的大小实现一些动画效果。因此,从这个需求出发,只要能根据说话时声音的大小,获取到的音量值有变化即可,而不必过分纠缠于到底范围多少才是准确的。因为计算的方法有很多种,不同的方法计算出来的值肯定是不同的,但是只要能反映出大小变化,我们的目的就达到了。

    下面我以Android录音为例,介绍一下其中的一种计算方法。大家可以根据自己的需要重新计算,或者是对我这个计算出来的值做一些数学变换,从而满足自己的需要。

    需要提前说明的是,网上也有类似的一些计算方法,但是千万不能照搬过来,因为这个和录音的编码和录音数据的类型是有关系的。

    录音的编码主要有两种:8位pcm和16位pcm。8位pcm用一个字节表示语音的一个点,16位pcm用两个字节,也就是一个short来表示语音的一个点。需要特别注意的是,如果你用的16位pcm编码,而取录音数据用的是byte的话,需要自己将两个bye转换成一个short。将两个byte转换成一个short,有小端和大端两种,一般默认情况都是小端,但是有的开源库,比如lamemp3需要的就是大端,这个要根据不同的情况进行不同的处理。

    下面以Android为例,介绍一下用平均值计算音量的方法。

    privatedouble calculateVolume(short[] buffer){

    double sumVolume = 0.0;

    double avgVolume = 0.0;

    double volume = 0.0;

    for(short b : buffer){

    sumVolume += Math.abs(b);

    }

    avgVolume = sumVolume / buffer.length;

    volume = Math.log10(1 + avgVolume) * 10;

    return volume;

    }

    这个方法传递的是short类型的数据,所以录音的编码肯定是16位pcm,这样可以直接计算而不需要转换了。相信大家都听过声波这个东西,大家用音频编辑软件Adobe audition 打开一段声音:

    4965516aa7f61503078a0df9dd1893f9.png

    从这里我们可以看到,声音是高低起伏变化的,有波峰波谷,说白了就是有正有负。因此在计算的时候,我们需要先求绝对值,要不然就上下抵消。求完绝对值然后进行累加,再除以整个数据的长度,就得到了这段语音数据的平均值了。

    但是这样直接计算出来的结果比较大,不利于我们使用,因此对它进行了取对数再乘以10:

    volume = Math.log10(1 + avgVolume) * 10;

    这些可以根据自己的需要进行运算,我这边只是一个简单的例子。

    还有一个特别需要注意的问题是:如果你录音的编码是16为pcm,而录音数据数据是byte,需要将两个byte转为一个short进行处理,建议用小端的方式。

    privatedoublecalculateVolume(byte[] buffer){

    double sumVolume = 0.0;

    double avgVolume = 0.0;

    double volume = 0.0;

    for(int i = 0; i < buffer.length; i+=2){

    int v1 = buffer[i] & 0xFF;

    int v2 = buffer[i + 1] & 0xFF;

    int temp = v1 + (v2 << 8);// 小端

    if (temp >= 0x8000) {

    temp = 0xffff - temp;

    }

    sumVolume += Math.abs(temp);

    }

    avgVolume = sumVolume / buffer.length / 2;

    volume = Math.log10(1 + avgVolume) * 10;

    return volume;

    }

    关于用小端的方式,将两个byte转为一个short的那些移位运算,应该不难,这里不做过多的解释了。

    以上就是用平均值的方法计算音量大小的方法,但是在iOS中,你自己不需要计算了,直接调用系统的api即可。

    iOS获取录音是系统音量的步骤:

    1、在开始录音之前,要设置获取系统音量的属性

    //设置获取音量大小的属性

    UInt32 enabledLevelMeter = true;

    AudioQueueSetProperty(_audioQueue, kAudioQueueProperty_EnableLevelMetering, &enabledLevelMeter, sizeof(UInt32));

    2、调用系统api获取音量,此方法可以在 缓冲器的回调函数中调用,也可以自己用一个定时器来调用

    AudioQueueLevelMeterState levelMeter;

    UInt32 levelMeterSize = sizeof(AudioQueueLevelMeterState);

    AudioQueueGetProperty(_audioQueue, kAudioQueueProperty_CurrentLevelMeterDB, &levelMeter, &levelMeterSize);

    double volume = levelMeter.mAveragePower

    当然,你如果不想用系统的音量值,也可以像上面那样自己计算,这取决于你的需要。

    最后我把android的获取录音音量大小的demo上传到附件中了,大家可以参考。

    更多相关内容
  • 《跟我唱简谱》软件,是一款依靠键盘及鼠标,快速输入简谱,在...录音时,注意所输入的时长应该比实际录制时长稍大,单位是秒。 录音保存的文件为Wav格式,但播放时的量音比软件播放简谱文件时的低,这是正常现象。
  • 这个界面有三个功能:根据字幕分割视频、根据大小分割视频、根据时长分割视频。 根据字幕分割视频是个神级功能,尤其适合于制作外语学习的视频素材。将例如美剧的视频放进去,再把相应的字幕文件放进去,就可以将每...
  • 特别是导入电脑里的编辑操作简直太难了。咳咳,小编要敲黑板划重点了,三招教你迅速get此技能。第一招 利用网络分享1、 打开iPhone的语音备忘录,点击已经存储的录音文件名称2、 点击导出的iPhone录音名称后,下方会...

    Iphone的功能强大,但难用程度也是逆天。脑海里灵光一现的想法,领导口若悬河的规划,想用语音备忘录录下来,生怕丢了一个细节就错过了一个亿。录完却发现录音导!不!出!来!特别是导入电脑里的编辑操作简直太难了。咳咳,小编要敲黑板划重点了,三招教你迅速get此技能。

    第一招 利用网络分享

    1、 打开iPhone的语音备忘录,点击已经存储的录音文件名称

    2、 点击导出的iPhone录音名称后,下方会弹出几个操作按键,点击第一个分享按钮

    3、有多种分享渠道,包括可以使用Airdrop功能与附近的人共享、使用短信或者邮箱分享出去。录音时m4a格式的文件,一小时录音约30兆,建议在wifi网络下进行,如果你是壕,不在乎流量,小编很想问你,还缺朋友吗,很会玩iphone的那种。

    如果手机和PC端同时登陆QQ或者微信,选择联系人,也可以通过QQ和微信的文件传输功能直接分享到电脑哦。

    第二招 ituns批量操作

    录音文件一大摞,单个导出太浪费时间,iTunes就派上用场了。

    1、 首先将iPhone通过数据线连接电脑

    2、电脑中打开iTunes工具,在iTunes中点击顶部的“音乐” 选项,勾选“同步音乐”和“包括语音备忘录” ,点击“应用”按钮开始同步资料

    3、接下来在设备下拉列表就可以看到语音备忘录,右方的列表界面中就看到录制的音频文件了。点击录音名称或者多选文件,可以直接复制粘贴到电脑上,另外“我的电脑—文档—音乐”文件夹下,也可以找到同步到电脑中的iPhone录音文件。

    第三招 第三方手机助手软件

    还有使用第三方软件来同步录音文件的方法,比如安装iFunbox、iexplorer、pp助手等等的手机助手软件,直接访问手机的对应文件夹(不需要越狱)。每个不同的助手软件使用方法不尽相同,ituns也是相当于一个助手功能,小编不在这累述了。

    有人问小编录音导出来还想转成文字怎么办?

    小编亲测了一个录音整理神器—讯飞听见网站。领导讲话,会议纪要,采访录音,培训课程,精彩演讲…录音上传讯飞听见网站(www.iflyrec.com),1小时音频5分钟即可收到文本,环境安静清晰的普通话录音,准确度更可高达90%以上。步骤简单易操作,注册登录—上传音频—订单转写—获得文字,更能在线编辑、按句回听。不用熬夜加班整理录音,不怕记不住重点错过一个亿!

    喏,知道你还想要彩蛋!

    小编了解,现在讯飞听见网站新用户注册狂送5小时免费转写时长!推荐新用户,时长送不停!

    展开全文
  • 幸运的是,录音开始只有几秒钟的嗡嗡声,而没有其他声音。 起初应用降噪效果有点令人困惑。 首先,我选择了一些嗡嗡声的样本来告诉Audacity需要减少什么声音,然后导航到“ 效果”>“降噪” 。 这将打开“ 降噪”...

    audacity使用

    在这个全球大流行的奇怪而艰难的时期,我们都被要求做不同的事情,改变我们的惯例,学习新的事物。

    我已经在家工作了很多年,所以这对我来说并不新鲜。 即使据称已退休,我仍为Opensource.com撰写文章,并启用S​​ysadmin和书籍。 我还管理着自己的家庭网络,它比您想像的还要大,以及教堂的网络和Linux主机,并且我为Linux的一些朋友提供了帮助。 所有这些使我忙于做自己喜欢做的​​事,而且通常都在我的舒适范围内。

    但是COVID-19改变了所有这一切。 而且,与许多其他类型的组织一样,我的教会必须Swift转向新的服务提供范例。 这就是教会所做的—提供特定的服务。 作为教堂的系统管理员,并具有一些音频记录和编辑的知识(在20世纪70年代,我混合了声音,并且是俄亥俄州托莱多的几个区域性民间摇滚乐队的唯一马路),所以我决定学习开放音乐源音频录制和编辑软件Audacity可帮助应对这一挑战。

    这不是有关使用Audacity的综合性how-to文章。 这是关于我使用此功能强大的音频编辑工具入门的经验,但是这里应该有足够的信息来帮助您入门。

    我已经学会了完成任务所需的知识:将几个单独的音频片段组合到一个MP3音频文件中。 如果您已经了解Audacity并以其他方式做事或不了解我所不知道的事,那是可以预期的。 如果您有任何建议可以帮助我更轻松地完成任务,请在评论中分享。

    旧的方式

    我现在尽量不使用“正常”一词,因为很难确切知道那是什么(如果甚至存在这种状态)。 但是,我们为关闭人员,旅行中的成员以及其他任何人制作录音的旧方法是,录制我们常规的现场教会活动的讲道部分,并将其发布在我们的网站上。

    为此,我安装了TASCAM SS-R100固态记录器,将讲道作为MP3文件存储在拇指驱动器上。 我们将录音上传到我们网站的特殊目录,以便人们下载。 使用我为该任务编写的Bash 程序上传了录音。 自动化一切! 如果没有我,我训练了其他一些人使用sudo执行这些任务。

    这一切都很好。 直到没有。

    新方法

    第一次对大型聚会的限制发生时,我们进行了一些更改。 我们仍然可以举行小型聚会,因此我们四个人在周日早上见面,并使用内部记录仪录制了简短的服务,然后以通常的方式进行上传。 这行得通,但是随着危机加深,与甚至很少的人会面的风险也越来越大,我们不得不做出更多的改变。

    像大量其他组织一样,我们意识到我们每个人都需要在与自己家不同的位置执行创建服务的部分。

    现在,根据服务的结构,我收到了一些录音,需要将它们结合起来以创建完整的教会服务。 我们的音乐总监会使用iPhone录制每首歌和插曲,并以M4A(MPEG-4音频)格式向我发送录音。 它们的长度从几秒钟到五分钟不等,最大为3MB。 同样,我们的导演向我发送了2到6张同样为M4A格式的录音,其中包含他的部分服务。 有时,我们教会中的其他音乐家会与重要的其他人一起录制独奏或二重奏; 这些可以是MP3或M4A格式。

    然后,我将所有这些汇总到一个记录中,可以将其上载到我们的服务器以供人们下载。 我之所以使用Audacity,是因为它在我的仓库中可用,并且很容易上手。

    Audacity入门

    在此之前,我从未使用过Audacity ,因此,与当今其他许多人一样,我需要及时学习一些新知识来完成我需要做的事情。 起初我有点挣扎,但事实证明这很有趣并且很有启发性。

    Audacity易于安装在我的Fedora 31工作站上,因为在许多发行版中,都可以从Fedora存储库中获得。

    我第一次使用程序启动器图标打开Audacity时,该应用程序的窗口为空,没有项目或曲目。 Audacity项目具有AUP扩展名,因此,如果您有现有项目,则可以在您喜欢的文件管理器中单击文件,然后以这种方式启动Auda​​city。

    将M4A转换为MP3

    如Fedora所安装,Audacity无法识别M4A文件。 无论您如何进行,都需要安装LAME MP3编码器和FFmpeg导入/导出库,这两个库都可以从Fedora存储库(很可能是其他发行版的存储库)中获得。

    您可以选择其他方法,但是我喜欢脚本化的解决方案。 它速度很快,而且无论需要重命名多少文件并将其转换为MP3,我都只需运行一次脚本。

    创建一个新项目

    无论是否加载了任何音轨,您都可以创建一个新项目。 我建议先创建项目,然后再导入任何音频文件(也称为“片段”)。 在菜单栏中,选择文件>保存项目>将项目另存为 。 这将打开一个警告对话框,显示“保存项目”用于Audacity项目,而不是音频文件。 单击确定按钮以继续到标准文件保存对话框。

    我发现我需要做两次。 第一次,警告对话框没有显示任何按钮,因此我不得不使用窗口菜单或标题栏中的x图标关闭对话框。

    随便给项目命名,Audacity会自动添加AUP扩展名。 您现在有一个空项目。

    将音频文件添加到您的项目

    第一步是将音频文件添加到项目中。 使用菜单栏,打开文件>导入>音频 ,然后使用文件对话框选择一个或多个要导入的文件。 对于我的第一个测试项目,我一次加载了所有文件,没有对轨道进行排序,也没有沿时间轴按所需顺序对齐剪辑。 这次,我首先按照从上到下的顺序一次加载音频文件。 导入每个文件时,会将其放置在任何现有轨道下方的新轨道中。 下图显示了一次加载的所有文件,它们的顺序是它们出现在工作目录中的顺序。

    Tracks loaded in Audacity

    窗口的跟踪区域顶部有一条时间表。 窗口底部还有一个滚动条,因此当轨道超出Audacity窗口的宽度时,您可以沿时间轴滚动。 如果有更多的轨道超出了窗口的容纳范围,则还有一个垂直滚动条。

    注意每个轨道的波形部分的左上角的名称,它们是每个轨道的文件名,不带扩展名。 这些默认情况下不存在,但是我发现它们会有所帮助。 要显示这些名称,请使用菜单栏选择“ 编辑”>“首选项”,然后在“将音频轨道名称显示为覆盖”框中打勾。

    订购音频剪辑

    将一些文件加载​​到Audacity工作区后,就可以开始操作它们了。 要订购音频片段,请选择其中一个,然后使用“ 时移”工具(↔)将其沿轨道水平滑动; 继续执行此操作,直到所有剪辑按照所需的顺序首尾排列。 请注意,您正在移动的剪辑是由一对垂直对齐线结尾的。 当它们完美对齐时,两条对齐轨道的终点线会更改颜色以提醒您。

    您可以将鼠标指针悬停在Audacity工具栏中的工具图标上,以查看显示该工具名称的弹出窗口。 这有助于初学者了解每种工具的功能。

    Audacity toolbox

    在这里, 选择工具   在Audacity工具栏中选择。 时移工具在底行的左数第二。

    下图显示了将音频片段滑入项目时间轴上的位置而未将音轨按特定顺序排序时会发生的情况。 对于您喜欢的工作方式,这可能不是最佳选择。 不适合我

    Audio clips in Audacity

    要删除(或完整)音频片段的片段,请使用“ 选择”工具选择它们-您还可以选择多个相邻的轨道。 然后,您可以按键盘上的Delete(删除)按钮删除选定的段。

    在上图中,您可以在轨道1中看到一条垂直的黑线,并在所有轨道上看到一条垂直的绿线。 这些是音频光标,显示轨道或整个项目的播放位置。 选择选择工具,然后单击轨道中的所需位置,然后单击传输控件上的“ 播放”按钮(在Audacity窗口的左上角)开始播放。 播放将持续到所选曲目的结尾,一直到项目结束。 如果曲目在时间轴上重叠,则它们将同时播放。

    要立即开始播放,请在时间轴上单击所需的起点。 要播放曲目的一部分,请按住鼠标左键选择曲目的一小段,然后单击“ 播放”按钮。 其他传输按钮(暂停,停止等)均由通用图标标识,并且按您期望的方式工作。

    您也可以单击“ 静音音频选择”按钮(“ 编辑”工具栏上左侧的第五个按钮,如下所示),以完全静音选定的片段,同时将其保留在适当的位置以用于计时。 这就是我消除许多背景喀哒声和杂音的方式。

    Audacity edit tools

    我花了一些时间弄清楚如何垂直排列轨道,结果发现有几种不同的方法可以完成任务。

    您可以使用曲目菜单重新排列安排。 每个轨道的左侧都有自己的控制面板(如下所示)。 “控制面板”顶部的轨道下拉菜单栏会打开一个菜单,该菜单提供了多个轨道排序选项,可以将轨道上移,下移,移至顶部或移至底部。

    Moving tracks in Audacity

    向上或向下移动轨道的项目将轨道一次移动一个位置,因此您必须根据需要选择多次,以将轨道移至所需位置。

    要拖放轨道,必须单击轨道详细信息占用的空间。 在此屏幕截图中,这是“单声道,48000Hz 32位浮点数”。 这可能很棘手,因为如果单击得太高,您将调整平移(左右立体声位置),如果单击得太低,则可能会折叠或选择音轨。 定位“ Mono”或“ Stereo”标签(无论轨道是什么)标签,然后单击并上下拖动轨道以将其重新放置在工作区中。

    应用放大和降噪效果

    有些曲目需要调整整体音量。 我使用“ 选择”工具双击并选择了整个轨道(但是您也可以选择轨道的一部分)。 在菜单栏上,选择“ 效果”>“放大”以显示一个小的对话框窗口。 您可以使用滑块或输入一个值来指定放大量。 负数会减小音量。 如果尝试增加音量,则需要在“ 允许裁剪”框中打勾。 然后单击确定。

    我发现放大有些棘手; 使用太多或太少都很容易。 首先使用少量数字查看结果。 如果您在任一方向上走得太远,始终可以使用Ctrl + Z撤消更改。

    我发现另一个有用的效果是降噪。 其中一条音轨以60Hz的嗡嗡声录制,通常是由于麦克风或录音机接地不良所致。 幸运的是,录音开始时只有几秒钟的嗡嗡声,而没有其他声音。

    起初应用降噪效果有点令人困惑。 首先,我选择了一些嗡嗡声的样本来告诉Audacity需要减少什么声音,然后导航到“ 效果”>“降噪” 。 这将打开“ 降噪”对话框。 我单击对话框的“步骤1”部分中的“ 获取噪声配置文件”按钮,该按钮使用选定的样本作为一组过滤器预设的基础。 但是,在收集了所选样本之后,对话框消失了(这是设计使然)。 我重新打开对话框,使用滑块选择降噪级别(以分贝为单位)(我将其设置为15dB,而其他滑块则保持不变),然后单击“ 确定”

    效果很好-只有知道残留的嗡嗡声,您才能听到它的声音。 我需要对此进行更多的试验,但是由于结果是可以接受的,因此我不再使用这些设置了。

    实际上,为了方便起见,对话框在获取噪声配置文件后关闭的原因。 如果要处理许多音轨或音频片段,每个音轨或音频片段具有不同的噪声配置文件,则可以打开“ 降噪”效果,获取当前的噪声配置文件,然后选择要清除的音频。 然后,您可以使用Ctrl + R (运行最新过滤器的键盘快捷键)运行“降噪”过滤器。 但是,Audacity不会使用新的噪声配置文件,而是使用您刚存储的配置文件,而是执行过滤器。 这样,您只需单击几下即可获得一个样本,而仅需一个键盘快捷键即可清理大量音频。

    还有更多

    我只使用了一些基础知识,甚至还没有开始触及Audacity的表面。 我已经看到它具有更多的功能和工具,使我能够创建听起来更专业的项目。

    例如,除了使用现有的音频文件外,Audacity还可以通过线路输入,桌面声音流和麦克风输入进行录音。 它可以产生特殊的效果,例如淡入淡出和交叉淡入淡出。 而且,我什至没有尝试找出许多其他效果和工具所能提供的功能。

    我觉得我将需要在不久的将来学习更多。 希望这个关于我在Audacity的有限经验的故事会促使您检查一下。 有关更多信息,您可以在线找到Audacity手册

    翻译自: https://opensource.com/article/20/4/audacity

    audacity使用

    展开全文
  • Android完美实现录音编辑器一、目标二、准备工作三、功能分析1. 界面组成2. 事件处理四、实现过程五、一些技术问题1. MediaPlayer2. Chronometer3. 保持屏幕长亮4. 关闭编辑器六、开发过程回顾七、接下来八、Finally...

    一、目标

    实现录音编辑器,为神马笔记增加录音功能做准备。
    在这里插入图片描述

    二、准备工作

    序号准备工作描述
    1Android实现录音功能汇总全面了解Android实现录音功能的各种方式,并且比较方式的优劣,最终选择MediaRecorder来实现录音。
    2Android低仿iOS Messages录音波形效果使用MediaRecorder实现录音,并封装成TapeRecordView方便调用。
    3Android高仿iOS Messages声音播放波形效果使用MediaPlayer播放录音,并封装成TapePlayView方便调用。
    4Android高仿iOS Messages录音操作按钮实现ActionLayout作为滑动按钮。
    5Android使用PopupWindow高仿iOS Messages录音弹出界面选择录音编辑器的容器,比较了Activity、Dialog、PopupWindow、FrameLayout,并选择PopupWindow作为容器。

    通过5个阶段的准备工作,解决了录音相关的所有技术问题。

    最后一步便是把所有功能组合到一起。

    三、功能分析

    1. 界面组成

    整个录音编辑器界面分为2个部分。

    1. 波形
    2. 操作
    界面组成控件组成
    波形关闭按钮
    录音波形、播放波形
    时间显示
    操作发送按钮
    停止录音、播放录音,暂停播放

    2. 事件处理

    事件触发条件处理方式
    布局变化通常情况下,布局不会发生变化。
    长按电源键或者来电时,会隐藏软键盘,从而引起布局变化。
    调整编辑器位置。
    切换到后台用户按下多任务键或者Home键,或者来电时,将应用切换到后台。停止录音、停止播放
    截图描述
    在这里插入图片描述长按电源键,将会隐藏软键盘。

    四、实现过程

    序号过程
    1定义PopupTape作为编辑器类,并实现show方法以显示界面
    2实现录音及停止功能
    3实现播放及暂停功能
    4显示录音及播放时间进度
    5实现关闭功能,通过关闭按钮以及用户按下返回键
    6处理dispatchTouchEvent事件,实现弹出界面后可以继续操作。
    7处理onGlobalLayout事件,对编辑器重新布局。
    8处理onStop事件,切换到后台时自动停止录音及播放。
    9增加对外事件回调接口BiConsumer<PopupTape, Integer>,用于告知用户操作结果。
    10增加属性访问接口,以插叙PopupTape属性。

    五、一些技术问题

    1. MediaPlayer

    MediaPlayer播放过程中,调用getCurrentPosition方法获取当前播放进度。

    出现时间回退的情况,出现在250毫秒~300毫秒之间。

    // ..., 256, 257, 258, 258, 224, 225, 226, 227, ...
    

    导致了绘制波形时,出现闪烁的情况。

    int current = mMediaPlayer.getCurrentPosition();
    this.currentPosition = (current > this.currentPosition)? current: this.currentPosition;
    
    current = this.currentPosition;
    

    增加一个变量用于跟踪进度,防止回退。

    2. Chronometer

    使用Chronometer显示播放进度时,出现时间跳动的情况。

    Chronometer虽然1秒回调一次,但并不是严格的1000毫秒,因此会出现累加的误差,最终导致时间跳动。

    自定义Chronotimer,采用每帧刷新的方式保证时间的准确性。

    public class Chronotimer extends androidx.appcompat.widget.AppCompatTextView {
    
        boolean isRunning = false;
    
        long base = 0; // base time in milliseconds
    
        long start; // start time in milliseconds
        long end; // end time in milliseconds
    
        PreDrawListener preDrawListener;
        private boolean mPreDrawRegistered;
    
        public Chronotimer(Context context) {
            this(context, null);
        }
    
        public Chronotimer(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs, android.R.attr.textViewStyle);
        }
    
        public Chronotimer(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
    
            this.preDrawListener = new PreDrawListener();
        }
    
        public void start() {
            this.isRunning = true;
    
            this.start = System.currentTimeMillis();
            this.end = start;
    
            this.registerForPreDraw();
            this.invalidate();
        }
    
        public void stop() {
            this.isRunning = false;
    
            this.end = System.currentTimeMillis();
    
            this.unregisterForPreDraw(); // must unregister OnPreDrawListener, or else draw all the time.
            this.invalidate();
        }
    
        public void setBase(long base) {
            this.base = base;
        }
    
        @Override
        protected void onAttachedToWindow() {
            super.onAttachedToWindow();
    
            if (isRunning) {
                registerForPreDraw();
            }
        }
    
        @Override
        protected void onDetachedFromWindow() {
            super.onDetachedFromWindow();
    
            this.unregisterForPreDraw();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            if (isRunning) {
                this.invalidate();
            }
    
    //        Log.w("AA", "Chronotimer onDraw = " + isRunning);
        }
    
        public CharSequence format(long milliseconds) {
            long elapse = milliseconds;
            elapse /= 1000; // seconds
    
            int hours = (int)(elapse / 3600);
            int seconds = (int)(elapse % 3600);
            int minute = (seconds / 60);
            seconds = seconds % 60;
    
            String text;
            if (hours > 0) {
                text = String.format("%d:%02d:%02d", hours, minute, seconds);
            } else {
                text = String.format("%d:%02d", minute, seconds);
            }
    
            return text;
        }
    
        private void registerForPreDraw() {
            if (!mPreDrawRegistered) {
    
                getViewTreeObserver().addOnPreDrawListener(preDrawListener);
    
                mPreDrawRegistered = true;
            }
        }
    
        private void unregisterForPreDraw() {
            getViewTreeObserver().removeOnPreDrawListener(preDrawListener);
    
            mPreDrawRegistered = false;
        }
    
        /**
         *
         */
        private class PreDrawListener implements ViewTreeObserver.OnPreDrawListener {
    
            @Override
            public boolean onPreDraw() {
                if (isRunning) {
                    end = System.currentTimeMillis();
                }
    
                long duration = (end - start);
                duration += base;
    
                CharSequence text = format(duration);
                setText(text);
    
                return true;
            }
        }
    }
    
    

    3. 保持屏幕长亮

    为防止锁屏自动停止录音,因此保证录音过程中屏幕长亮。

    4. 关闭编辑器

    与iOS Messages点击操作按钮外部区域管理编辑器不同。

    必须点击关闭按钮才能关闭编辑器。

    iOS Messages是聊天工具,录音内容通常较短。

    神马笔记是笔记工具,用户可能进行长时间录音。

    为防止用户误操作关闭编辑器,因此采用关闭按钮的方式。

    六、开发过程回顾

    集合了前面的所有功能,终于完成录音编辑器。

    高仿了iOS Messages的录音功能:)

    效果还算满意。

    七、接下来

    完成录音显示,及RecyclerView中多个录音的播放功能。

    神马笔记实现录音笔记元素做准备。

    八、Finally

    佛说是经已。
    长老须菩提。
    及诸比丘。比丘尼。
    优婆塞。优婆夷。
    一切世间天人阿修罗。
    闻佛所说。皆大欢喜。信受奉行。

    展开全文
  • Android录音支持的格式有amr、aac,但这两种音频格式在跨平台上表现并不好。MP3显然才是跨平台的最佳选择。项目地址实现思路概述在分析代码前,我们需要明确几个问题1. 如何最终生成MP3实现MP3格式最好是借助Lame这...
  • 开篇闲扯前一段时间的一个案子是开发一个有声课件,大致就是通过导入文档、图片等资源后,页面变为类似 PPT 的布局,然后选中一张图片,可以插入音频,有单页编辑和全局编辑两种模式。其中音频的导入方式有两种,一...
  • MP3智能音乐播放系统:采用世界最先进的微电脑控制、MP3、FLASH录音技术。将广播自动播放、音源选播、录音下载/音频和麦克风录音存储等先进功能综合为一体。高标准的产品定位,多功能的超前设计,成为广播设备的典范...
  • 我们在接听重要的电话或者参加重要的会议,都会用到录音功能。但对于大部分人来讲,随身携带录音笔并不现实,因此手机中的录音功能就显得尤为重要。对于普通用户而言,手机录音功能最重要的就是两点:1. 操作简单...
  • 很 【厂房降噪隔音步步菲】 多人首先想到的是满屋令人眼花缭乱的设备、象飞机驾驶舱般密密麻麻的按钮、硕大无朋的调音台以及它们动辄上万甚至几十万元的天价……是的,「录音棚」这个词汇在过去很一段时间里,是...
  • 可以设置录音质量。 11.EXE录像播放自动扩帧功能,更加平滑,即使是1帧/秒也有平滑的效果。 12.AVI扩帧功能,可以制作25帧/秒的AVI动画。 13.鼠标点击自动提示功能。 14.自由设置EXE录制播放各种参数,比如位置...
  • 录音机HD - 旗舰录音软件...改进了编辑录音的功能,通过把图标放置在显眼的位置,而不是折叠到“更多”选项以至于用户找不到或难以找到。 使用户更便捷的对录音进行修剪、拆分、合并、混合、变声、铃声、升高音...
  • 录音笔这款产品熟悉,大概是它曾经是很多大学生上课的标配,对于脑极体这样的文字工作者来说,更是采访必不可少的工具。但说它陌生,是因为不知不觉间,这款产品似乎已经远离主流电子消费品市场很久了。据新思...
  • 小程序完成版长按录音/播放/停止

    千次阅读 2019-06-24 11:07:54
    认真思考少言寡语,头脑空白喋喋不休。 有别人艳羡的事业,却无自己想要的幸福 一枚凡人,十足情种。 特想变坏,无奈品种。 还有续章,来日方长。" }], recod_color: "#333", }, methods: { // 打开 ...
  • 标准19寸机架式设计,可以安装在机柜里面节省空间,完全独立无须依赖电脑即可工作的录音设备,采用最新的C/S架构,可外接显示器、扬声器和键鼠等,网络接口,用户通过外设即可完成基本的操作,以及对线路使用情况...
  • 前端教程:如何实现前端录音功能

    万次阅读 2018-09-04 13:30:37
    前端实现录音有两种方式,一种是使用MediaRecorder,另一种是使用WebRTC的getUserMedia结合AudioContext,MediaRecorder出现得比较早,只不过Safari/Edge等浏览器一直没有实现,所以兼容性不是很好,而WebRTC已经...
  • 原标题:语音项目——Android录音学习一、引言小编所在的语音SDK项目,提供的是AI服务,录音是基础,识别是品质。录音方式选择,录音参数设置,录音策略的制定(如解决首字吞字问题),录音架构选择,对识别都有着重要...
  • Tags:视频剪辑音频录音剪辑软件是一款音频剪辑APP个,该应用以录音剪辑为中心,为用户提供高清录制、MP3录制、多轨道剪辑、游戏录制、培训录制、英语课录制、网课录制、演讲、讲座、会议纪要、电话录制、现场录制等...
  • 因为经常开会都会用到"录音笔"功能,尤其是一些比较重要的会议,因为会议结束老板总会说。小王,今天的会议内容整理一份,下班之前发到群里面。重听录音内容并整理,实在太慢了,于是经过多次会议的千锤百炼,我...
  • 专业的电脑版录音软件哪个最好用

    千次阅读 2018-12-24 10:05:17
    在工作中,经常会碰到会议或者授课培训等情况,没有电脑大多数人都会选择使用录音笔,如果有电脑肯定会使用电脑录音软件。而很多的主播、游戏解说也是会使用到电脑录音软件的。既然大家都会有录音的需求,那么专业...
  • 一、使用都叫兽™ 音频编辑录制音频• 可同时或单独录制电脑、麦克风的声音。• 可制定录制计划,在指定时间内运行。• 高质量录制,支持调整录音质量。• 支持多种汇出格式,可直接汇出为MP3、VOC、WMA、WAV等音频...
  • 录音软件哪个好用?8款好用的录音软件 日常生活中,不管我们是记录会议、课堂学习还是录制歌曲等等,很多情况下我们都需要用到录音软件。当然,相信网上的录音软件很多,有的朋友就在问小编:录音软件哪个好用?...
  • 可以设置录音质量。 11.EXE录像播放自动扩帧功能,更加平滑,即使是1帧/秒也有平滑的效果。 12.AVI扩帧功能,可以制作25帧/秒的AVI动画。 13.鼠标点击自动提示功能。 14.自由设置EXE录制播放各种参数,比如位置...
  • 原标题:百度AI长语音识别技术免费开放,调用时长不再受限前几天看到一条祝福:祝大家早日成为可以在公司群里随心所欲发语音的人 。显然,微信群聊(特别是家族群、客户群、公司群)里的语音消息,并不是谁想发就能...
  • recorder录音 1、下载依赖包yarn add recorder-core 2、新建文件recode.js //recode.js import Recorder from "recorder-core/recorder.mp3.min"; var rec; rec = Recorder({ //本配置参数请参考下面的文档,有...
  • 因为最近项目当中用到了录音的功能,所以就Android 录音来试试。 Android 小白 ,大神请多指教。 参考链接 https://blog.csdn.net/hesong1120/article/details/79043482 https://www.cnblo...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,707
精华内容 3,082
关键字:

如何编辑录音时长

友情链接: ProducerConsumer.rar