#目前遇到的问题是,在安卓中播放视频流,并且监听视频流里面的声音大小,如果视频流里面有声音则通过计算音频数据来获取音量大小。
#但是目前遇到的问题是,在安卓中播放视频流的这个插件是,vlc for unity安卓版本的这个插件,他在安卓中播放声音是通过调用安卓代码播放的声音,不走unity内部的音频组件,这也导致我无法通过获取音频数据来获取视频流里面的声音大小,请问有什么方法能解决这个问题吗。
#我尝试拦截vlc for unity这个插件的声音,并且在unity中进行播放,不知道是我设置有问题还是哪里的问题,播放出来的声音和原本的声音是不一样的。
#我也尝试在调用安卓的代码,来录制他的声音,可是一直生成不了程序, 老是报错。
下面是java的代码,我想转换成jar或者是aar,但是转换出来的jar无法使用,导入到unity的时候一生成就报错。
// Assets/Plugins/Android/AudioCapturePlugin.java
package com.yourcompany.audiocapture;
import android.Manifest;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;
import androidx.annotation.RequiresPermission;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class AudioCapturePlugin extends UnityPlayerActivity {
private static final String TAG = "AudioCapturePlugin";
private static final int SAMPLE_RATE = 44100;
private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(
SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT);
private AudioRecord audioRecord;
private boolean isRecording = false;
private Thread recordingThread;
@RequiresPermission(Manifest.permission.RECORD_AUDIO)
public void startRecording() {
if (isRecording) return;
audioRecord = new AudioRecord(
MediaRecorder.AudioSource.VOICE_RECOGNITION, // 使用VOICE_RECOGNITION可以捕获程序自身声音(需要API 21+)
SAMPLE_RATE,
CHANNEL_CONFIG,
AUDIO_FORMAT,
BUFFER_SIZE);
if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
Log.e(TAG, "AudioRecord initialization failed");
return;
}
audioRecord.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
short[] buffer = new short[BUFFER_SIZE / 2];
while (isRecording) {
int read = audioRecord.read(buffer, 0, buffer.length);
if (read > 0) {
// 在这里处理音频数据
// 可以发送回Unity
UnityPlayer.UnitySendMessage("AudioManager", "OnAudioData", convertShortArrayToString(buffer, read));
}
}
}
}, "AudioRecorder Thread");
recordingThread.start();
}
public void stopRecording() {
if (!isRecording) return;
isRecording = false;
try {
recordingThread.join();
} catch (InterruptedException e) {
Log.e(TAG, "Interrupted while stopping recording", e);
}
audioRecord.stop();
audioRecord.release();
audioRecord = null;
}
private static String convertShortArrayToString(short[] array, int length) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.append(array[i]).append(",");
}
return sb.toString();
}
}