Использование аудиовизуализатора в AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Использование аудиовизуализатора в Android

Сообщение Anonymous »

Я пытаюсь получить визуализацию Waveform для звука на моем локальном устройстве и пытаюсь использовать пакет Visualizer (import android.media.audiofx.Visualizer) , но он постоянно вылетает, выдавая следующие журналы:
E/AudioEffect: set(): AudioFlinger could not create effect e46b26a0-dddd-11db-8afd-0002a5d5c51b / NULL, status: -1
E/visualizers-JNI: Visualizer initCheck failed -3
E/Visualizer-JAVA: Error code -3 when initializing Visualizer.
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.musicit.player, PID: 7181
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:473)
at android.view.View.performClick(View.java:7750)
at android.view.View.performClickInternal(View.java:7727)
at android.view.View.access$3700(View.java:858)
at android.view.View$PerformClick.run(View.java:29115)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.app.ActivityThread.main(ActivityThread.java:8168)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1037)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:468)
at android.view.View.performClick(View.java:7750) 
at android.view.View.performClickInternal(View.java:7727) 
at android.view.View.access$3700(View.java:858) 
at android.view.View$PerformClick.run(View.java:29115) 
at android.os.Handler.handleCallback(Handler.java:938) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loopOnce(Looper.java:210) 
at android.os.Looper.loop(Looper.java:299) 
at android.app.ActivityThread.main(ActivityThread.java:8168) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1037) 
Caused by: java.lang.RuntimeException: Cannot initialize Visualizer engine, error: -3
at android.media.audiofx.Visualizer.(Visualizer.java:238)
at com.musicit.player.playerVisualizer.setAudioSessionId(playerVisualizer.kt:49)
at com.musicit.player.MainActivity.playSong(MainActivity.kt:89)
at java.lang.reflect.Method.invoke(Native Method) 
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:468) 
at android.view.View.performClick(View.java:7750) 
at android.view.View.performClickInternal(View.java:7727) 
at android.view.View.access$3700(View.java:858) 
at android.view.View$PerformClick.run(View.java:29115) 
at android.os.Handler.handleCallback(Handler.java:938) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loopOnce(Looper.java:210) 
at android.os.Looper.loop(Looper.java:299) 
at android.app.ActivityThread.main(ActivityThread.java:8168) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1037) 


Я сделал это очень просто, просто чтобы посмотреть, как это работает:
У меня есть это:
class MainActivity : AppCompatActivity() {

fun onPlayClick(view: View) {
var song = '/path/that/definitelyexists.mp3';
playMusic(song);
}

fun playMusic(song: String){
val mediaPlayerInstance = MediaPlayer();
mediaPlayerInstance.setAudioAttributes(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
);
mediaPlayerInstance.setDataSource(audioPath);
mediaPlayerInstance.prepare();
mediaPlayerInstance.start();

val visualiz = findViewById(R.id.musicitviz);
visualiz.setAudioSessionId(mediaPlayerInstance.audioSessionId);
}
}




class Visualizer(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
private var paint = Paint();
private var visualizer: Visualizer? = null;
private var waveformByteArray: ByteArray? = null;

init {
paint.color = Color.rgb(244, 40, 30);
}

override fun draw(canvas: Canvas?) {
super.draw(canvas);

waveformByteArray?.let { waveformByteArray ->
if(waveformByteArray.isEmpty()) {
Log.d(": ", "waveformbytearray is null.");
return;
}else{
Log.d(": ", "waveformbytearray is not null.");
}
}

}

fun setAudioSessionId(audioSessionId: Int) {
if(visualizer != null){
visualizer?.release();
}

val newVisualizer = Visualizer(audioSessionId);
newVisualizer.enabled = true;
newVisualizer.captureSize = Visualizer.getCaptureSizeRange()[1];
newVisualizer.setDataCaptureListener(object: Visualizer.OnDataCaptureListener {
override fun onWaveFormDataCapture(
visualizer: Visualizer?,
waveform: ByteArray?,
samplingRate: Int
) {
waveformByteArray = waveform;
Log.d("TAG: ", "I am updating the waveform")
invalidate();
}

override fun onFftDataCapture(
visualizer: Visualizer?,
fft: ByteArray?,
samplingRate: Int
) {
}
}, Visualizer.getMaxCaptureRate() / 2, true, false);
newVisualizer.enabled = true;
visualizer = newVisualizer;
}
}

Я пробовал добавить разрешение:

перезапускаю устройство, а также обновляю уровень API до >=29:
android {
compileSdk 33

defaultConfig {
applicationId "com.musicit.music"
minSdk 29
targetSdk 33
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
namespace 'com.musicit.music'
}

как было предложено в сообщениях с похожей проблемой, но на самом деле ничего не работает, интересно, как я могу решить эту проблему.
РЕДАКТИРОВАТЬ: Я также попробовал включить подготовить прослушиватель, но безрезультатно, сообщение об ошибке все то же, с кодом ошибки -3:
val mediaPlayerInstance = MediaPlayer();
mediaPlayerInstance.setAudioAttributes(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
);
mediaPlayerInstance.setDataSource(audioPath);

mediaPlayerInstance.setOnPreparedListener(object: MediaPlayer.OnPreparedListener {
override fun onPrepared(mp: MediaPlayer?) {
if(mp == null) {
return;
}

val visualiz = findViewById(R.id.musicitviz);
visualiz.setAudioSessionId(mp.audioSessionId);
visualiz.enableVisualization();
mp.start();
}
});

mediaPlayerInstance.prepare();


Подробнее здесь: https://stackoverflow.com/questions/757 ... in-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»