android语音录制和压缩

Android音视频开发:音频非压缩编码和压缩编码 音视频在开发中,最重要也是最复杂的就是编解码的过程,在上一篇的《Android音视频开发:踩一踩“门槛”》中,我们说音频的编码根据大小划分有两种:压缩编码和非压缩编码,那到底是怎么实现的这两中编码的呢?这一次就详细了解Android中如何使用这两种方式进行音频编码 前景提要 这里先回顾一下音频的压缩编码和非压缩编码: 非压缩编码:音频裸数据,也即是我们所说的PCM 压缩编码:对数据进行压缩,压缩不... 阅读详情

因为上一篇博客代码有点太多,就单开了,这两天主要在看android语音录制和压缩转码相关知识,前端时间看见腾讯官方微博宣布,已经开放出即使聊天软件正在等待审批,但这个直接影响电话运营商,能通过的可能性应该不大,但我对这方面的技术很有兴趣,所以就试试看。其中涉及到很多声音方面的处理问题,在android中有两个类可以录制语音:AudioRecord和MediaRecorder,MediaRecorder主要是录制音频并写入文件,而AudioRecord主要是录制音频流,录制的音频流为pcm格式,关于pcm格式可以自行搜索一下,在传输过程中可以转换为amr格式,但没有相关可以类库有点麻烦,另外iphone不支持播放amr格式音频,如果需要跨两个平台可以使用AAC,压缩比也不错,音质也很好,我还没有测试过,网上评议而已。编码方面大家都推荐speex,我看了一下,需要是用System.loadLibrary加载进speex提供的类库。下面记录一下写的一个边录制边播放的一段代码吧

package voice.hcent.com;
 
import java.io.IOException;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Looper;
import android.os.Process;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
 
public class VoiceHcentActivity extends Activity {
 
    static {
        System.loadLibrary("media_jni");
    }
 
    public int frequency = 8000;
    private int rBufferSize, pBufferSize;
    private Button startSpeech;
    private AudioRecord recorder;
    private VoiceSpeech vspeech;
    private AudioTrack player;
    private boolean stopSpeech = false;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        init();
 
        test();
    }
 
    public void init(){
        try{
            startSpeech = (Button)findViewById(R.id.StartSpeech);
 
            //设置播放器缓冲区大小
            pBufferSize = AudioTrack.getMinBufferSize(frequency, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                    AudioFormat.ENCODING_PCM_16BIT);
 
            //获取播放器对象
            player = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, 
                    AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    pBufferSize, AudioTrack.MODE_STREAM);
 
            //设置录音缓冲区大小
            rBufferSize = AudioRecord.getMinBufferSize(frequency, 
                    AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
 
            //获取录音机对象
            recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 
                    frequency, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                    AudioFormat.ENCODING_PCM_16BIT, rBufferSize);
 
        }catch (Exception e) {
            String msg = "ERROR init: "+e.getStackTrace();
            VoiceHcentActivity.this.toastMsg(msg);
        }
    }
 
    /**
     * 开始录音
     */
    public void startRecord(){
        stopSpeech = false;
        vspeech = new VoiceSpeech();
        vspeech.start();
    }
 
    /**
     * 结束录音
     */
    public void stopRecord() {
        stopSpeech = true;
    }
 
    /**
     * 开始播放录音
     */
    public void startPlay(){
 
        //设置播放器音量
        player.setStereoVolume(0.7f, 0.7f);
 
        player.play();
    }
 
    /**
     * 结束播放录音
     */
    public void stopPlay(){
        player.stop();
    }
 
    public void test(){
 
        startSpeech.setOnTouchListener(new View.OnTouchListener() {
 
            public boolean onTouch(View arg0, MotionEvent arg1) {
 
                switch (arg1.getAction()) {
 
                    case MotionEvent.ACTION_DOWN: //开始说话
                        startPlay();
                        startRecord();
 
                        toastMsg("starting record!");
                        break;
 
                    case MotionEvent.ACTION_UP: //停止说话
                        Log.i("hcent", "111");
                        stopPlay();
                        Log.i("hcent", "222");
                        stopRecord();
                        toastMsg("stoped record!");
                        break;
 
                    default:
                        break;
                }
 
                return false;
            }
        });
 
    }
 
    public class VoiceSpeech extends Thread{
 
        @Override
        public void run() {
            super.run();
            try {
                byte[] tempBuffer, readBuffer = new byte[rBufferSize];
                int bufResult = 0;
                recorder.startRecording();
                while(!stopSpeech){
                    bufResult = recorder.read(readBuffer, 0, rBufferSize);
                    if(bufResult>0 && bufResult%2==0){
                        tempBuffer = new byte[bufResult];
                        System.arraycopy(readBuffer, 0, tempBuffer, 0, rBufferSize);
                        player.write(tempBuffer, 0, tempBuffer.length);
                    }
                    Log.d("hcent", "get read:"+bufResult+"___"+readBuffer.length);
                }
                recorder.stop();
                Looper.prepare();
                VoiceHcentActivity.this.toastMsg("AudioSpeech have ended!");
                Looper.loop();  
            } catch (Exception e) {
                String msg = "ERROR AudioRecord: "+e.getStackTrace();
                Looper.prepare();
                VoiceHcentActivity.this.toastMsg(msg);
                Looper.loop();
            }      
        }
    }
    @Override
    protected void onDestroy(){
        player.release();
        recorder.release();
        super.onDestroy();
        Process.killProcess(Process.myPid());
    }
    public void toastMsg(String msg){
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        Log.e("hcent", msg);
    }  
}


android附件上传下载(图片,语音,视频) 上传 所有的上传都是一样的都是转成流的形式发送给服务器,注意写入body是一个异步操作,我写的网络发送(okhttp+rxjava)也是异步的,所以在部分机型上会报错,java.net.ProtocolException: expected 6137 bytes but received 7081 ,这是因为还没有把所有数据写入body就发送了,所有可以在写入完成之后再发送。 final Fil... 阅读详情

相关推荐

Speex音频压缩处理AndroidDemo

本例是利用speex来进行音频压缩,按码率可分为5级,将这些归档比较,方便对speex进行内容深入了解

Android音频压缩方法

Android音频压缩的方法 音频基础知识 采样和采样频率: 一秒钟内采样的次数称为采样频率。采样频率越高,越接近原始信号,但是也加大了运算处理的复杂度。根据Nyquist采样定理,要想重建原始信号,采样频率必须大于信号中最高频率的两倍。人能感受到的频率范围为20HZ--20kHZ, 一般音乐的采样频率为44.1kHZ, 更高的可以是48kHZ和96kHZ,不过一般人用耳听感觉不...

kexinxin1的博客 4215

android录音压缩

语音压缩,android开发语音功能较多使用的时候, 压缩大小50%,还是不错的。根据使用情况不同源码可自行修改。

Android网络对讲机的实现

  上个星期公司给出了一个项目需求,做一个基于socket通讯协议的网络对讲机。于是在项目开始前计划了一下基本的实现流程。   1、从手机麦中采集音频数据;2、将PCM音频数据编码压缩;3、将压缩好的音频通过无线网络发送出去;4、其他手机接收音频数据并解码;5、将音频数据写入到音轨中播放。项目虽然简单,但其中的一些小问题也折腾了我不少时间。   首先我们创建一个线程用来采集音频数据,...

Android_19930720的博客 1871

基于Speex的语音压缩和解压在Android中的实现

在Android中使用Speex中的语音压缩和解压,压缩效果很好,适合与将语音文件进行网络传输。

Fluent UDF实战:除了速度入口,你的DEFINE_PROFILE宏还能搞定这些边界条件(温度、组分、壁面接触角全解析)

本文深入解析Fluent UDF中DEFINE_PROFILE宏在复杂边界条件中的高阶应用,涵盖温度场、组分浓度和壁面接触角等关键场景。通过实战代码示例,展示如何实现空间梯度温度场、动态组分控制和接触角动态调整,助力CFD工程师突破标准界面限制,提升仿真精度和效率。

weixin_28688385的博客 450

2024年Android最全Android音视频开发之——音频非压缩编码和压缩编码(1),2024年最新程序员必学之一

跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。

2401_84563465的博客 562

模糊高清修复真王炸!ComfyUI-SeedVR2-Kontext(画质修复+P图)本地部署教程

SeedVR2_comfyUI 是由字节跳动 Seed 实验室与南洋理工大学 S-Lab 联合开源的,专为 ComfyUI 用户开发的插件版本,官方项目名为。它主打,在图像超分上表现尤其亮眼,被多位实测者称为“目前模糊图像修复最强模型“。SeedVR2 在图像超分任务中表现突出,尤其擅长恢复模糊图像的细节,被称为“模糊高清修复真王炸”。特别的,也适合用于文字密集图像(如截图、扫描文档、老照片字幕)修复。模型通过对抗训练 + 特征匹配损失提升细节真实感,理论上对文字边缘锐化也有帮助。

SJJS_1的博客 2683

Android音视频开发之——音频非压缩编码和压缩编码(1)

thread?.start()开启录音线程将录音数据通过AudioRecord写入文件} else {!if (ret!

2401_84149836的博客 368

Unidbg逆向阿里系App签名:从环境补全到算法还原实战

在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算

weixin_42525738的博客 939

Computers & Security 投稿实战:从零到一详解避坑指南

本文详细解析了向《Computers & Security》投稿的全流程避坑指南,包括ORCID账号注册、文件格式统一、Editorial Manager®系统操作技巧等关键步骤。特别强调了cover letter撰写、Declaration of Interest Statement准备以及PDF生成后的检查要点,帮助研究者高效完成投稿流程。

weixin_29228203的博客 675

android使用speex进行语音录制和压缩

JNI调用speex 使用cmake编译so库 参考文章audio-speex 记录一下,方便自己查阅。 —————————–感谢前辈——————————–

wxz的博客 2064

Halcon那些事:Halcon缺陷检测检测印刷数字完整性

创建模板 create_shape_model模板匹配 find_shape_model。

十多年IT经验,专注机器视觉,智能制造半导体行业 764

Android实现微信语音发送交互的实战优化:从录制到压缩的完整方案

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959838的博客 307

图机器学习(1)——图论基础

图 (Graph) 是一种描述实体间关系的数学结构,几乎在各个领域都有应用。例如,社交网络就是图,其中用户之间的连接取决于一个用户是否“关注”另一个用户。图论,即对图的研究,一直以来广受关注,包含了大量算法、性质分析方法和数学模型,以解析复杂系统的行为特征。本节将介绍图数据结构的核心概念,通过理论阐述与实例演示相结合的方式,理解基础理论用以实践应用。重点介绍用于创建、操作和研究复杂网络结构与功能的 Python 库。

盼小辉丶的博客 9122

Android16 动态隐藏systemUI右侧音量条

本文介绍了如何屏蔽SystemUI系统音量条并显示自定义音量控制条的实现方法。主要通过两个步骤:1)在编译脚本中定义控制属性persist.rp.show.volume.dialog=off来隐藏系统音量条;2)修改SystemUI源码中的VolumeDialogImpl.java文件,在showH方法中根据属性值判断是否显示系统音量条。当属性值为off时直接return,从而屏蔽系统音量条的显示,实现自定义音量控制条的替代显示。该方法通过系统属性控制显示状态,具有灵活可控的特点。

tzj1058756809的博客 779

AhMyth麦克风监听:实时音频流传输与处理技术全解析

AhMyth作为一款跨平台Android远程管理工具,其麦克风监听功能通过高效的音频捕获与传输技术,实现了对目标设备环境声音的实时获取。本文将深入剖析AhMyth麦克风监听模块的核心技术原理,包括音频录制流程、数据传输机制以及关键实现细节,帮助读者全面了解这一功能的工作方式。 [![AhMyth远程管理工具logo](https://raw.gitcode.com/GitHub_Trending

gitblog_00754的博客 989

LPDDR6与LPDDR5 ZQ Calibration技术探讨

LPDDR6与LPDDR5 ZQ Calibration技术探讨

zilan23的博客 1104

android录制音频通过网络传输到服务器播放

暂时假象的2种场景,一种是android实时录制音频,通过编码rtp打包到服务器,服务器接收并转发,客户端能够实时播放。这个是单向音频传输的想法,与spydroid处理音频类似,但由于spydroid本身的音频在我小米1s上测试不成功,故自己考虑用其他方式来实现。为什么没有把spydroid源码分析系列写下去,主要原因是,spydroid源码本身还存在不少问题。比如h263编码在我机子androi

子晓聊技术 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

手机视频开发技术for Android and IOS

手机视频开发包 产品概述 AnyChat手机视频开发包是面向集成或软件开发商使用,用于开展手机视频相关的产品开发和系统集成。 开发包提供手机端音视频采集、编码、压缩、音视频传输等功能;通过与后端服务器对接,优先P2P通讯,实现手机视频即拍即传、手机视频直播,手机视频录制和手机视频通话。 当前手机视频SDK开发包支持iOS和Android平台。   手机开发包功能列表 ·   提供手机

little_rui的专栏 1167

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

安卓音频开发新选择:Opus编码器的高效集成方案

还在为安卓音频开发中的复杂编码问题头疼吗?想要实现高质量的音频录制和播放,却被繁琐的底层操作困扰?今天我要向你介绍一个宝藏项目——《Opus for Android》,这个项目将官方Opus编解码器完美移植到安卓平台,让你的音频处理工作变得前所未有的简单。 ## 🎯 架构设计与实现思路 这个项目的核心智慧在于它的模块化设计。`opuslib`库作为基础层,封装了所有底层编解码逻辑,而上层的`

gitblog_01119的博客 1142

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android音频处理实战:使用LAME高效压缩PCM为MP3

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960193的博客 402

告别卡顿!Android音频录制+实时压缩方案:FFmpeg+Lame混合使用指南

本文深度解析了Android音频录制中FFmpeg与Lame混合使用的实时压缩方案。针对纯FFmpeg方案在中低端设备上易出现的卡顿与高CPU占用问题,提出通过分工协作的混合架构,结合缓冲区优化、自适应比特率调整及多架构适配等技巧,有效提升录制流畅度与压缩效率,实现高质量的音频处理体验。

weixin_29200485的博客 422

Android音视频开发(四)MediaRecorder录制音频

Android中,音频的采集通常使用AudioRecord相关的API,下面我来介绍一下AudioRecord:

king的专栏 558
上一篇: Android提高第十篇之AudioRecord实现"助听器"[转]
下一篇: SPEEX ON ANDROID
聪明叔
博客等级 码龄22年 20粉丝 13原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值