Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發學習之錄音同步播放的實現

Android開發學習之錄音同步播放的實現

編輯:關於Android編程

最近看到一篇關於音頻的文章,忽然想起以前有個中國傳媒大學的一位朋友,要我幫她設計一個可以實時播放輸入音頻的程序,我當時想到了要用DirectSound,可是對於這種從來沒有碰過的東西,我內心是多少有些恐懼的,而且是用C#這樣的語言來寫這種相對來說比較底層的東西,所以這件事情最後就不了了之了,好在後來這位朋友順利地完成了畢設。此時此刻,在Android上再次碰到這個問題,我就抱著試試看的決心,來學一學吧。主要代碼如下:

package com.android.record2play;

import java.util.LinkedList;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {

	//寫入緩沖區大小
	private int m_Record_Size;
	//音頻錄制對象
	private AudioRecord mAudioRecord;
	//音頻寫入存儲字節數組
	private byte[] m_Input_Bytes;
	
	//播放緩沖區大小
	private int m_Play_Size;
	//音頻播放對象
	private AudioTrack mAudioTrack;
	
        //主線程
	private Thread Record2Play_Thread;
	//標志變量
	private boolean IsRecording=true;
	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//獲取用於錄制的最小寫入緩存區大小
		m_Record_Size=AudioRecord.getMinBufferSize(44100,
				AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT);
		
		//獲取音頻錄制對象
		mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100,
				AudioFormat.CHANNEL_CONFIGURATION_MONO,
				AudioFormat.ENCODING_PCM_16BIT, m_Record_Size);
		
		//獲取用於播放的最小播放緩沖區大小
		m_Play_Size = AudioTrack.getMinBufferSize(8000,
				AudioFormat.CHANNEL_CONFIGURATION_MONO,
				AudioFormat.ENCODING_PCM_16BIT);
		
		// 實例化播放音頻對象
		mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
				AudioFormat.CHANNEL_CONFIGURATION_MONO,
				AudioFormat.ENCODING_PCM_16BIT, m_Play_Size,
				AudioTrack.MODE_STREAM);
		
		//初始化數組
		m_Input_Bytes = new byte[m_Record_Size];
		
		Record2Play_Thread=new Thread(new Record2Play());
		Record2Play_Thread.start();
	}

	class Record2Play implements Runnable
	{
		@Override
		public void run() 
		{
			try
			{
			   byte[] mBytes;
			   // 開始錄音
			   mAudioRecord.startRecording();
			   mAudioTrack.play();
			   while (IsRecording)
			   {
				   int BytesSize=mAudioRecord.read(m_Input_Bytes, 0, m_Record_Size);
				   mBytes=new byte[BytesSize];
				
				   mBytes=m_Input_Bytes.clone();
                   mAudioTrack.write(mBytes, 0, mBytes.length);
			   }
			   mAudioRecord.stop();
			   mAudioTrack.stop();
			}
			catch(Exception e)
			{
				Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
			}
		}
	}
	
}

這個和以前的基本思路是一樣的,首先通過錄音我們獲取一個音頻流寫入緩沖區,然後再從緩沖區裡取出來,交給播放設備去播放,可是我怎麼感覺在Android這麼簡單呢?這個程序要想真正投入使用,需要解決的問題有:

1、錄音降噪的問題

2、回音消除的問題

3、系統執行的問題

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved