導航:首頁 > 操作系統 > android錄音源碼

android錄音源碼

發布時間:2023-03-08 01:20:34

android x86錄音雜音,怎樣更改源碼能夠消除錄音雜音

打開Audition軟體並將需要處理的音頻拖入多軌(即下圖所示軌道)中

雙擊該音頻的波形圖,即可進入編輯界面

選中有噪音的一小段,(選中這段裡面只能有噪音,而不能有人聲),可以通過上滑滾輪來放大界面波形,進行精細操作

單擊上方選項卡效果>修復>降噪器...彈出下圖所示窗口。

點擊「獲取特性」出現下圖波形,再點擊波形全選,並將左側框中參數調為80(可根據噪音大小適當調整,參數越大處理強度越大。)

⑵ Android實現錄音功能

1 Android錄音需要聲明錄音許可權

<uses-permission android:name="android.permission.RECORD_AUDIO" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

2.錄音文件要寫到文件夾中,創建文件夾,在Application的onCreate方法中創建文件夾

@Override

public void onCreate() {

    super.onCreate();

    CrashHandler mCrashHandler = CrashHandler.getInstance();

    mCrashHandler.init(getApplicationContext(), getClass());

    initFile();

}

private void initFile() {

    //錄音文件

    File audioFile = new File(Constant.UrlAudio);

    if (!audioFile.exists()) {

        audioFile.mkdirs();

    } else if (!audioFile.isDirectory()) {

        audioFile.delete();

        audioFile.mkdirs();

    }

    //拍攝圖片文件

    File imageFile = new File(Constant.UrlImage);

    if (!imageFile.exists()) {

        imageFile.mkdirs();

    } else if (!imageFile.isDirectory()) {

        imageFile.delete();

        imageFile.mkdirs();

    }

}

Constant.UrlImage是個靜態的文件路徑

//錄音文件

public static String UrlAudio = FileUtil.getSdcardPathOnSys()+"/EhmFile/media/audio/";

3.在activity中開始錄音

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.media.MediaRecorder;

import android.text.format.DateFormat;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import java.io.File;

import java.io.IOException;

import java.util.Calendar;

import java.util.Locale;

public class Record2Activity extends AppCompatActivity {

    // 錄音界面相關

    Button btnStart;

    Button btnStop;

    TextView textTime;

    // 錄音功能相關

    MediaRecorder mMediaRecorder; // MediaRecorder 實例

    boolean isRecording; // 錄音狀態

    String fileName; // 錄音文件的名稱

    String filePath; // 錄音文件存儲路徑

    Thread timeThread; // 記錄錄音時長的線程

    int timeCount; // 錄音時長 計數

    final int TIME_COUNT = 0x101;

    // 錄音文件存放目錄

    final String audioSaveDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/audiodemo/";

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_record2);

        btnStart = (Button) findViewById(R.id.btn_start);

        btnStop = (Button) findViewById(R.id.btn_stop);

        textTime = (TextView) findViewById(R.id.text_time);

        btnStart.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

// 開始錄音

                btnStart.setEnabled(false);

                btnStop.setEnabled(true);

                startRecord();

                isRecording = true;

// 初始化錄音時長記錄

                timeThread = new Thread(new Runnable() {

                    @Override

                    public void run() {

                        countTime();

                    }

                });

                timeThread.start();

            }

        });

        btnStop.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

// 停止錄音

                btnStart.setEnabled(true);

                btnStop.setEnabled(false);

                stopRecord();

                isRecording = false;

            }

        });

    }

    // 記錄錄音時長

    private void countTime() {

        while (isRecording) {

            Log.d("mediaRe","正在錄音");

            timeCount++;

            Message msg = Message.obtain();

            msg.what = TIME_COUNT;

            msg.obj = timeCount;

            myHandler.sendMessage(msg);

            try {

                timeThread.sleep(1000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

        Log.d("mediaRec", "結束錄音");

        timeCount = 0;

        Message msg = Message.obtain();

        msg.what = TIME_COUNT;

        msg.obj = timeCount;

        myHandler.sendMessage(msg);

    }

    /**

    * 開始錄音 使用amr格式

    * 錄音文件

    *

    * @return

    */

    public void startRecord() {

// 開始錄音

        /* ①Initial:實例化MediaRecorder對象 */

        if (mMediaRecorder == null)

            mMediaRecorder = new MediaRecorder();

        try {

            /* ②setAudioSource/setVedioSource */

            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 設置麥克風

            /*

            * ②設置輸出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式

            * ,H263視頻/ARM音頻編碼)、MPEG-4、RAW_AMR(只支持音頻且音頻編碼要求為AMR_NB)

            */

            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

            /* ②設置音頻文件的編碼:AAC/AMR_NB/AMR_MB/Default 聲音的(波形)的采樣 */

            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

            fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";

            //注意文件夾要創建之後才能使用

            filePath = Constant.UrlAudio + fileName;

            /* ③准備 */

            mMediaRecorder.setOutputFile(filePath);

            mMediaRecorder.prepare();

            /* ④開始 */

            mMediaRecorder.start();

        } catch (IllegalStateException e) {

            Log.i("mediaEr", "call startAmr(File mRecAudioFile) failed!" + e.getMessage());

        } catch (IOException e) {

            e.printStackTrace();

            Log.i("mediaEr", "call startAmr(File mRecAudioFile) failed!" + e.getMessage());

        }

    }

    /**

    * 停止錄音

    */

    public void stopRecord() {

//有一些網友反應在5.0以上在調用stop的時候會報錯,翻閱了一下谷歌文檔發現上面確實寫的有可能會報錯的情況,捕獲異常清理一下就行了,感謝大家反饋!

        try {

            mMediaRecorder.stop();

            mMediaRecorder.release();

            mMediaRecorder = null;

            filePath = "";

        } catch (RuntimeException e) {

            Log.e("mediaR", e.toString());

            mMediaRecorder.reset();

            mMediaRecorder.release();

            mMediaRecorder = null;

            File file = new File(filePath);

            if (file.exists())

                file.delete();

            filePath = "";

        }

    }

    // 格式化 錄音時長為 秒

    public static String FormatMiss(int miss) {

        return "" + miss;

    }

    Handler myHandler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            switch (msg.what) {

                case TIME_COUNT:

                    int count = (int) msg.obj;

                    Log.d("meidaRe","count == " + count);

                    textTime.setText(FormatMiss(count));

                    break;

            }

        }

    };

    @Override

    protected void onDestroy() {

        super.onDestroy();

        myHandler.removeCallbacksAndMessages(null);

    }

}

布局文件很簡單

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".Record2Activity">

    <Button

        android:id="@+id/btn_stop"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="結束"

        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintEnd_toEndOf="parent"

        app:layout_constraintHorizontal_bias="0.5"

        app:layout_constraintStart_toEndOf="@+id/btn_start"

        app:layout_constraintTop_toTopOf="parent" />

    <Button

        android:id="@+id/btn_start"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="開始"

        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintEnd_toStartOf="@+id/btn_stop"

        app:layout_constraintHorizontal_bias="0.5"

        app:layout_constraintStart_toStartOf="parent"

        app:layout_constraintTop_toTopOf="parent" />

    <TextView

        android:id="@+id/text_time"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginStart="11dp"

        android:layout_marginTop="47dp"

        android:text="時間"

        app:layout_constraintStart_toStartOf="@+id/btn_start"

        app:layout_constraintTop_toBottomOf="@+id/btn_start" />

</androidx.constraintlayout.widget.ConstraintLayout>

這樣就可以使用錄音功能了

⑶ android編程 如何調用系統錄音機進行錄音並存放在指定文件夾

如果學過就知道這是一個相對簡單的問題,

  1. 首先進行布局,就是設置寫按鈕,文字之類的。


2.寫個activity,調用系統錄音程序

er{

privateButtonbtnStart;
privateButtonbtnStop;
privateButtonbtnPlay;

;
privateFilerecAudioFile;
privateMusicPlayermPlayer;

@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

setupViews();
}

privatevoidsetupViews(){
btnStart=(Button)findViewById(R.id.start);
btnStop=(Button)findViewById(R.id.stop);
btnPlay=(Button)findViewById(R.id.play);

btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
btnPlay.setOnClickListener(this);

recAudioFile=newFile("/mnt/sdcard","new.amr");
}

@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.start:
startRecorder();
break;
caseR.id.stop:
stopRecorder();
break;
caseR.id.play:
mPlayer=newMusicPlayer(SoundRecorderActivity.this);
mPlayer.playMicFile(recAudioFile);
break;
default:
break;
}
}

privatevoidstartRecorder(){
mMediaRecorder=newMediaRecorder();
if(recAudioFile.exists()){
recAudioFile.delete();
}

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setOutputFile(recAudioFile.getAbsolutePath());
try{
mMediaRecorder.prepare();
}catch(IllegalStateExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}

mMediaRecorder.start();
}

privatevoidstopRecorder(){
if(recAudioFile!=null){
mMediaRecorder.stop();
mMediaRecorder.release();
}
}
}</span>
如何保存到特定的目錄,只需要得到recAudioFile=newFile("/mnt/sdcard","new.amr");就可以了。


3.設置播放類,也是調用播放方法。MediaPlayer


4添加許可權

⑷ 如何使Android錄音實現內錄功能

之前在做直播的時候需要使用到內錄功能,比如經常看到游戲主播在直播玩游戲,游戲的聲音不是通過MIC錄制的,而是內錄完成的。故在此記錄一下。

相信大家都很熟悉Android如果錄音的了:

int frequency = 44100; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int minBufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); int audioSource = MediaRecorder.AudioSource.MIC;
AudioRecord audioRecord = new AudioRecord(audioSource, frequency,
channelConfiguration, audioEncoding, minBufferSize);
audioRecord.startRecording();
...

AudioSource輸入源介紹

項目

介紹

許可權

DEFAULT 默認。在源碼 system/media/audio/include/system/audio.h配置默認項 無

MIC 麥克風 無

VOICE_UPLINK 電話錄音上行線路 android.permission.CAPTURE_AUDIO_OUTPUT,系統許可權不允許第三方app使用

VOICE_DOWNLINK 電話錄音下行線路 android.permission.CAPTURE_AUDIO_OUTPUT,系統許可權不允許第三方app使用

VOICE_CALL 電話錄音上下線路 android.permission.CAPTURE_AUDIO_OUTPUT,系統許可權不允許第三方app使用

CAMCORDER 攝像頭的麥克風 無

VOICE_RECOGNITION 語音識別 無

VOICE_COMMUNICATION 網路電話 無

REMOTE_SUBMIX 傳輸到遠程的音頻混合流。默認情況下如何用該項錄音,本地揚聲器或者耳機的聲音將會被截走 android.permission.CAPTURE_AUDIO_OUTPUT,系統許可權不允許第三方app使用

好了,現在我們知道了REMOTE_SUBMIX可以實現內錄功能了。有兩點比較麻煩:

閱讀全文

與android錄音源碼相關的資料

熱點內容
760貼片機編程視頻 瀏覽:333
歐姆龍plc編程第36講 瀏覽:915
我的世界如何將一個伺服器弄崩 瀏覽:8
php網站訪問量代碼 瀏覽:431
怠速壓縮機咔咔響 瀏覽:176
怎麼才能修改APP中的數據 瀏覽:688
哪裡有搶單的app 瀏覽:462
演算法概率題 瀏覽:465
長方形拉伸的命令 瀏覽:279
python代碼函數編程技術 瀏覽:194
java正則式 瀏覽:429
外包程序員好進嗎 瀏覽:384
雲伺服器服務模型架構 瀏覽:901
刪文件夾什麼指令 瀏覽:509
極速抖音已加密怎麼辦 瀏覽:603
matlab拉格朗日演算法框圖 瀏覽:430
華為公司計算機視覺演算法顧問 瀏覽:254
夏老師講的單片機 瀏覽:298
在編程中如何將圖片放大 瀏覽:163
appstore怎麼看是否付費 瀏覽:603