文档章节

speex在步知中的应用

C
 Chiigo
发布于 2015/01/10 16:20
字数 1572
阅读 65
收藏 0
speex的应用难点有两点:一,JIN部分的引用,我个人对c不太熟练,不过以前也做过一些JIN的开发,所以按照网上的流程这部分还是搞定了。二.在步知中的应用,因为步知不仅仅需要录音播功能,而speex是基于AudioRecord,所以当要实现一些诸如暂停,继续,计时等功能时就会变得异常棘手。一般而言网络语音计时的不多,所以能从网上找到的思路有限,这里都是我自己想的一些方法。 关于speex网上的相关文章还是很多的,很多人表示用不了,不过我写完后做了些小修改就成功测试了。他的压缩效果确实好。因为涉及jni,所以我当时想过可不可以使用arm格式,因为它同样也很小20s只需要33k。不过查了speex的压缩率后发现speex一分钟只需要34k。查了Speex源码是基于c语音实现的,所以那天花了很多时间去下载ndk等相关应用,从网上找到的使用speex的方法基本上是下面四个步骤。 1、去Speex官网下载最新Speex源码。 2、创建新的android工程,并创建jni文件夹。 3、把speex源码目录下的libspeex和include目录及其子目录文件全部拷贝到$project/jni目录下。 4、在jni目录下新增Android.mk文件,内容繁琐,且涉及很多c语言的,所以我基本上按他们的步骤和代码写的;这里就不一一列出了。 一些具体的东西csdn上的博客讲的很清楚,这里我们主要记录一下和步知相关的一些方法。因为这些都是我自己写的,对以后的优化可能会有帮助。 一.播放与暂停 文章开头就说到了这里的问题,步知这里需要有暂停功能。我当时确实想不到好的思路,对于一个从网上沿袭下来的方法,因为起初对源码的不熟悉所以想起方法来非常困难。哲哥当时给了一个思路,也是我觉得可行的第一种方法,就是将解压缩后的文件存在本地然后再去播放。不知道是不是我操作过程中的错误,总之当时要不就是只有头文件可以播放,要不就是严重的变音,噪音特别大且语速放慢了几倍。也问了哲哥一下,哲哥说变解码边播放确实有些麻烦。这里最终去它的解码类SpeexDecoder中编写相应的方法控制播放与暂停。因为测试界面使用了fragment,所以数据间的传递也有些麻烦。当点击提交页的试听按钮时,第一次点击是正常判断,即正常播放。随后根据奇偶判断播放与暂停,这里自己在SpeexDecoder写了一个锁来控制语音是否继续。(具体方法根据按钮中调用的方法一步步进入查看即可)这里有个问题,就是播放按钮一单点击,随后这个按钮控制的是继续与暂停,包括后来添上的图标等的控制,结束时怎么办?一直播放显示的肯定是暂停图标,直到播放结束依然是暂停图标。这时就要加个条件判断是否结束,这里只能自己想办法。我是采用了一个轮询的方法来判断的,一般来说轮询不是很好,不过暂时也没想其它的。不过除了提交界面,其它语音从服务器获得的语音等,都有一个时间参数,我直接使用时间判断结束。 二.音量的获取 因为录音界面要通过动画提醒用户录音状态,所以一定要去获取音量。这里面遇到的一些困难就不说了,把这个AudioRecord音量获取方法记录在这里,因为很难找到相应方法: while (isGetVoiceRun) { //r是实际读取的数据长度,一般而言r会小于buffersize int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE); long v = 0; // 将 buffer 内容取出,进行平方和运算 for (int i = 0; i < buffer.length; i++) { v += buffer[i] * buffer[i]; } // 平方和除以数据总长度,得到音量大小。 double mean = v / (double) r; double volume = 10 * Math.log10(mean); Log.d(TAG, "分贝值:" + volume); // 大概一秒十次 synchronized (mLock) { try { mLock.wait(100); } catch (InterruptedException e) { e.printStackTrace(); } } } 这个 mAudioRecord.read(buffer, 0, BUFFER_SIZE);应该很熟悉吧,从这里获取即可。不过魅族在这里出了问题,改成我在应用中使用的方法即可。 三.魅族的一些问题 录音时魅族等部分机型的异常,这里是由于AudioRecord资源非正常释放引起的,这个是我自己试了一下午试出来的。从网上写下来的方法里,通过控制一个Boolean值结束录音。其它手机也没事,但魅族却不能重录。这里写个方法,你每次录完音后,去SpeexRecorder类中释放所有资源。 魅族的权限问题,进入录音界面,魅族会询问权限。允许还好,但是拒绝的话就会有异常(这是必然的,一般人真想使用也不会去拒绝)。这个是手机本身控制的,在网上也找了很多方法,想要强行打开权限是行不通的。没办法,最终只能换成提醒的方式,让它正常跳转一下,并弹窗提醒打开权限。 我在看一些第三方项目时,最不想看的就是一些个人的逻辑方法,很多人应该有一样的问题。方法而已,每个人的思维方式不同,写的方法也不同,最终逻辑控制好就可以了,仅供参考。

© 著作权归作者所有

C
粉丝 0
博文 5
码字总数 5531
作品 0
长沙
私信 提问
windows下 vc6.0中使用speex库压缩音频文件

想在windows下使用speex库压缩音频文件 代码使用speex文档中附录A的代码 只是把其中的文件路径修改了 但是编码之后的文件大小只用2K 原文件900K左右,而且解码后无法播放,全是杂音,请问是怎...

geaeu
2014/06/07
1K
1
speex在linux下的编译

@linuxhunter 你好,想跟你请教个问题: 你好 最近看到你的2011年的一篇关于speex的文章,最近做项目刚接触speex和linux,想请教一下如何在linux下编译和使用speex,使用什么集成开发环境,我...

geaeu
2014/05/05
1K
1
使用libspeex实现原始音频文件的编码和解码技术

这几天在单位研究使用libspeex对原始音频文件(PCM文件)进行编解码。在linux下原始音频文件可以通过arecord命令进行采集,使用的采样率是8kHz,量化位数为有符号16位整数(小端存储),单通...

linuxhunter
2011/12/08
3.4K
0
声音压缩库--Speex

Speex是一套专门用于压缩声音的库,由于其专门针对声音,所以压缩声音的性能非常高.Speex由于其压缩性能,及0.80版后的跨平台的性能,所以在网络声音的传输中有很大的价值.但是需要注意的是speex...

匿名
2009/06/18
15K
0
实时Android语音对讲系统架构

本文属于Android局域网内的语音对讲项目系列,《通过UDP广播实现Android局域网Peer Discovering》实现了局域网内的广播及多播通信,本文将重点说明系统架构,音频信号的实时录制、播放及编解...

yhthu
2017/04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sync.Mutex 互斥锁

说明: 互斥锁用来保证在任一时刻,只能有一个例程访问某对象。Mutex 的初始值为解锁状态。Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。Mutex 可...

李琼涛
1分钟前
1
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
4分钟前
2
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
5分钟前
1
0
事假杨晨龙(Z16021)月薪请假单

svn co URL --username xxx-- password yyy ./

桃花飞舞
29分钟前
2
0
当Activity关闭后,网络请求回调的处理

当我们在使用网络请求的时候,一般都是通过回调来获取请求到的数据。对于网络请求的回调需要注意的几个点 比如我们的回调在Activity中处理数据,当我们把Activity关闭后,如果获取到数据时,...

shzwork
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部