`
bcolaq
  • 浏览: 8001 次
文章分类
社区版块
存档分类
最新评论

android语音录制和压缩

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

    本压缩包提供了关于Android语音压缩的源码示例,帮助开发者实现将语音数据压缩50%的功能,从而节省存储空间并提高传输效率。以下是根据标题和描述所涉及的知识点的详细说明: 1. **Android音频录制**: Android...

    android 语音识别转文字.zip

    总的来说,这个"android 语音识别转文字.zip"压缩包是一个集成了多种语音处理功能的DEMO,包括语音识别、文字转语音、录音、播放和文件管理等,对于学习和开发Android语音应用的开发者来说,是一个非常有价值的参考...

    Android应用源码之语音压缩,android开发语音功能较多使用的时候,压缩大小50%-IT计算机-毕业设计.zip

    在Android应用开发中,语音功能已经变得非常普遍,如语音识别、语音合成、语音消息等。本项目"Android应用源码之语音压缩,android开发...对于想要深入学习Android语音功能开发的开发者来说,这是一个极好的实践案例。

    语音压缩,android开发语音功能较多使用的时候,压缩大小50%.zip

    总的来说,Android开发中的语音压缩是一个涉及音频编码理论、平台API使用、性能优化和用户体验等多个方面的复杂任务。通过合理选择和配置编解码器,以及利用合适的工具和策略,开发者可以创建高效且音质良好的语音...

    Android-基于speex的语音录制

    在Android平台上进行语音录制时,开发者常常会遇到各种挑战,如音质、压缩效率和兼容性等。"基于speex的语音录制"是解决这些问题的一种有效方案。Speex是一种开源的音频压缩格式,专为语音通信优化,尤其适合低带宽...

    Android 端语音录制成MP3格式,已经封装好,可以直接使用

    在提供的资源中,“Android 端语音录制成MP3格式,已经封装好,可以直接使用”的标题暗示了存在一个预先封装好的解决方案,它简化了开发过程,只需引入特定的库(jar和so文件)并调用API即可。下面将详细介绍这个过程...

    android Speex语音压缩(协议压缩,编码部分)【1】

    **三、语音录制** 在Android中,使用`MediaRecorder`类可以方便地进行音频录制。设置好输出文件路径、音频源、音频编码格式等参数,例如: ```java MediaRecorder recorder = new MediaRecorder(); recorder....

    安卓Android源码——语音压缩,android开发语音功能较多使用的时候,压缩大小50%.zip

    在安卓(Android)平台上开发应用时,涉及到语音处理是一个常见的需求,尤其是对于音频录制、语音识别、实时通信等场景。本资源"安卓Android源码——语音压缩,android开发语音功能较多使用的时候,压缩大小50%"提供...

    安卓Android源码——语音压缩,开发语音功能较多使用的时候,压缩大小50%.zip

    在安卓(Android)平台上开发应用程序时,特别是在涉及音频处理,如语音识别、语音聊天或语音录制等场景,处理音频文件的压缩技术显得尤为重要。本文将深入探讨如何在Android中实现语音压缩,特别是如何将语音文件的...

    android语音视频通话源码.rar

    4. **媒体编码与解码**:如AAC(Advanced Audio Coding)和H.264(High Profile),用于音频和视频的高效压缩和传输。 5. **音频处理**:包括回声消除、噪声抑制和增益控制,以提高通话质量。 6. **视频渲染**:...

    android仿微信语音录音demo

    通过以上知识点的运用,我们可以构建出一个基本的Android语音录音Demo,模拟微信的录音功能。在实际开发中,还可能需要考虑到更多细节,例如录音质量的调整、录音文件的上传、后台录音等问题,以提供更加完善的用户...

    android 音频录制

    在Android平台上进行音频录制涉及到许多核心技术和组件,包括MediaRecorder、AudioRecord以及音频编码格式等。下面将详细探讨这些知识点。 一、MediaRecorder类 MediaRecorder是Android系统提供用于捕捉多媒体数据...

    android p2p 语音对话

    在Android平台上实现P2P(点对点)语音对话,主要涉及到网络通信、音频处理以及实时...总的来说,实现Android P2P语音对话涉及多个技术领域,需要深入理解Android系统的音频和网络特性,并通过不断优化来提升用户体验。

    android仿微信语音聊天案例

    1. **Android语音录制**: Android系统提供了MediaRecorder类用于录音,它可以设置录音的音频源、编码格式、比特率等参数。在录制过程中,我们需要创建MediaRecorder对象,配置参数,然后启动和停止录音。同时,还...

    Android高级应用源码-语音压缩,android开发语音功能较多使用的时候,压缩大小50%.zip

    总的来说,Android语音压缩涉及音频编码、比特率控制、采样率调整等多个环节,通过源码学习,我们可以掌握实现这一功能的具体步骤和技巧。结合提供的源码和上述知识点,开发者可以创建出高效、节省空间的语音处理...

    语音压缩,可达50%

    例如,JavaApk源码说明可能包含了使用Java编程语言实现的语音压缩算法,这可能涉及到对Android平台的音频API的调用,如AudioRecord和AudioTrack,用于录制和播放语音。GaussRecorder可能是某种语音记录器的名称,它...

    Android 音视频录制程序

    在Android平台上开发音视频录制程序是一项常见的任务,它涉及到多媒体处理、硬件访问和编码解码等技术。在本项目中,我们关注的是使用H.263视频编码和AMR_NB音频编码进行录制。以下是对这些关键技术点的详细说明: ...

    仿微信按住录制语音,上滑取消录制

    在Android开发中,实现“仿微信按住录制语音,上滑取消录制”的功能,主要涉及到的是音频录制与播放的相关技术。微信的语音消息功能利用了Android的多媒体框架,特别是`MediaPlayer`类,来处理音频的播放,以及`...

    用Android studio写仿微信语音聊天功能

    首先,我们需要了解语音录制与播放的基础。Android提供了MediaRecorder和MediaPlayer类用于录音和播放音频。MediaRecorder负责设置录音参数(如音频源、编码格式、质量等),开始和停止录音;MediaPlayer则用来加载...

Global site tag (gtag.js) - Google Analytics