日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android实时声音信号波形_Android输出正弦波音频信号(左右声道对称)-阿里云开发者社区...

發布時間:2023/12/2 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android实时声音信号波形_Android输出正弦波音频信号(左右声道对称)-阿里云开发者社区... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請說明出處!

作者:kqw攻城獅

出處:個人站 | CSDN

需求:左右聲道分別輸出不同的音頻數據,波形要是一個正弦波,左右聲道還要對稱!

對硬件不是很了解,說是要通過音波避障。

效果圖

之前已經介紹了如何在左右聲道輸出不同的音頻數據。

那么這里主要介紹如何模擬出波形是正弦波的音頻數據。

模擬正弦波

/**

* 模擬正弦波音頻數據

*@param isLeft 左右聲道

*@return 音頻數據

*/

private short[] initData(boolean isLeft) {

double phase = 0.0;

int amp = 10000;

short[] data = new short[bufferSize];

double phaseIncrement = (2 * Math.PI * mFrequency) / mSampleRateInHz;

for (int i = 0; i < bufferSize; i++) {

if (isLeft) {

data[i] = (short) (amp * Math.sin(phase));

} else {

data[i] = (short) (-amp * Math.sin(phase));

}

phase += phaseIncrement;

Log.i(TAG, "initData: isLeft = " + isLeft + " buffer[" + i + "] = " + data[i]);

}

return data;

}

主要參數

mFrequency:頻率

mSampleRateInHz:采樣率

// 單聲道

private int mChannelConfig = AudioFormat.CHANNEL_OUT_MONO;

// 頻率

private int mFrequency = 19000;

// 采樣率

private int mSampleRateInHz = 44100;

播放音頻的線程封裝

package kong.qingwei.myapplication;

import android.annotation.TargetApi;

import android.media.AudioFormat;

import android.media.AudioManager;

import android.media.AudioTrack;

import android.os.Build;

import android.util.Log;

/**

* Created by kqw on 2016/8/29.

* 播放音樂的線程

*/

public class ChannelThread extends Thread {

private static final String TAG = "ChannelThread";

private AudioTrack mAudioTrack;

private short[] mData;

/**

* 構造方法

*

*@param channelConfig 聲道

*@param sampleRateInHz 采樣率

*@param data 音頻數據

*@param bufferSize 緩存大小

*@param isLeft 左右聲道

*/

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

public ChannelThread(int channelConfig, int sampleRateInHz, short[] data, int bufferSize, boolean isLeft) {

mData = data;

mAudioTrack = new AudioTrack(

AudioManager.STREAM_MUSIC,

sampleRateInHz,

channelConfig,

AudioFormat.ENCODING_PCM_16BIT,

bufferSize,

AudioTrack.MODE_STREAM);

if (isLeft) {

mAudioTrack.setStereoVolume(AudioTrack.getMaxVolume(), 0);

} else {

mAudioTrack.setStereoVolume(0, AudioTrack.getMaxVolume());

}

}

@Override

public void run() {

super.run();

try {

if (null != mAudioTrack) {

mAudioTrack.play();

while (AudioTrack.PLAYSTATE_STOPPED != mAudioTrack.getPlayState()) {

mAudioTrack.write(mData, 0, mData.length);

}

}

Log.i(TAG, "run: End");

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 釋放AudioTrack

*/

public void releaseAudioTrack() {

if (null != mAudioTrack) {

mAudioTrack.stop();

mAudioTrack.release();

mAudioTrack = null;

}

}

}

播放

mLeftChannelThread = new ChannelThread(mChannelConfig, mSampleRateInHz, mDataLeft, bufferSize, true);

mRightChannelThread = new ChannelThread(mChannelConfig, mSampleRateInHz, mDataRight, bufferSize, false);

mLeftChannelThread.start();

mRightChannelThread.start();

停止

if (null != mLeftChannelThread) {

mLeftChannelThread.releaseAudioTrack();

mLeftChannelThread = null;

}

if (null != mRightChannelThread) {

mRightChannelThread.releaseAudioTrack();

mRightChannelThread = null;

}

不足

這里介紹的是在程序中模擬出一個波形滿足正弦波的音頻數據,還有一種方式,可以事先準備好一個這樣的音頻文件,直接播放就可以了。

在程序中模擬音頻數據有一個缺點,就是不能保證兩個線程完完全全的同步,即便是同時開啟兩個線程也有一先一后,在頻率很高的時候,難免會有一點誤差!像下面這樣:

另外,這個波形和硬件有很大關系,越是低配設備,誤差可能會越大,相同的趨勢,但是波動的幅度會比較大(線很粗),可能和設備本身的噪音有關系。

總結

以上是生活随笔為你收集整理的android实时声音信号波形_Android输出正弦波音频信号(左右声道对称)-阿里云开发者社区...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。