AudioTrack的使用

AudioTrack 一般用来实现播放原始音频数据(PCM)

public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,
            int bufferSizeInBytes, int mode);
			
/** 默认声音 **/
public static final int DEFAULT = 0;
/** 麦克风声音 */
public static final int MIC = 1;
/** 通话上行声音 */
public static final int VOICE_UPLINK = 2;
/** 通话下行声音 */
public static final int VOICE_DOWNLINK = 3;
/** 通话上下行声音 */
public static final int VOICE_CALL = 4;
/** 根据摄像头转向选择麦克风*/
public static final int CAMCORDER = 5;
/** 对麦克风声音进行声音识别,然后进行录制 */
public static final int VOICE_RECOGNITION = 6;
/** 对麦克风中类似ip通话的交流声音进行识别,默认会开启回声消除和自动增益 */
public static final int VOICE_COMMUNICATION = 7;
/** 录制系统内置声音 */
public static final int REMOTE_SUBMIX = 8;

streamType    这个参数表示使用哪种音频管理策略
      STREAM_VOCIE_CALL         电话声音
            STREAM_SYSTEM       系统声音
            STREAM_RING         铃声 
            STREAM_MUSCI        音乐声
            STREAM_ALARM         警告声
            STREAM_NOTIFICATION  通知声


sampleRateInHz,     采样率
channelConfig,      声道数 
audioFormat,        量化精度
bufferSizeInBytes,  缓存大小
mode                播放模式:一种是static方式,另一种是streaming方式。
                        static方式:需要一次性将所有的数据都写入播放缓冲区,适合播放铃声,较短的音频片段。
                        streaming方式:按照一定的时间间隔不间断的写入音频数据。(常用这种方式)

    private AudioTrack track;
    // 音频获取源
    private int audioSource = MediaRecorder.AudioSource.MIC;
    // 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
    private static int sampleRateInHz = 8000;
    //private static int sampleRateInHz = 44100;
    // 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
    private static int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
    // 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
    private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
    // 缓冲区字节大小
    private static final int AUDIO_FREQUENCY = 44100;
	
	
	int bufferSize = AudioTrack.getMinBufferSize(sampleRateInHz,
                    channelConfig, audioFormat);
					
	track = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                    sampleRateInHz,
                    channelConfig, audioFormat, bufferSize,
                    AudioTrack.MODE_STREAM);
					
					
	audioTrack.play();

开启子线程,向AudioTrack缓冲区写入数据

AudioTrackPlayThread()
        {
            setPriority(Thread.MAX_PRIORITY);//设置线程拥有的最大优先级
            byte[] CallBackVoice;


            state = WindState.PLAYING;

            //notifyState(state);
            try {
                track.play();
                while (state.equals(WindState.PLAYING) &&
                        track  != null) {
                    CallBackVoice = MainActivity.voice_stream();
                    track.write(CallBackVoice, 0, CallBackVoice.length);
                    Log.d("lsx test", "CallBackVoice.length: " + CallBackVoice.length + ", CallBackVoice: " + Arrays.toString(CallBackVoice));
                }
                track.stop();
                track.release();
            } catch (Exception e) {
                Log.e(TAG, "AudioTrackPlayThread:", e);
                //notifyState(WindState.ERROR);
            }
            state = WindState.STOP_PLAY;
            //notifyState(state);
            state = WindState.IDLE;
            //notifyState(state);

        }
    }

需要在xml之中申请权限,要储存声音需要存储权限,读取声音需要录音权限

	<!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>

    <!-- 读取声音权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
发布了37 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/double_lee3/article/details/100517649