GithubHelp home page GithubHelp logo

bogerchan / nier-visualizer Goto Github PK

View Code? Open in Web Editor NEW
563.0 16.0 72.0 11.6 MB

A lightweight and efficient Android visual library.

License: Apache License 2.0

Kotlin 92.73% Java 7.27%
kotlin-android visualizer android-library lightweight android-visualizer visual-effects nier-visualizer kotlin

nier-visualizer's Introduction

Nier Visualizer

Language Switch: English / 中文

Video Preview

Youtube link

Video limit, please click this image.

1. Nier Visualizer

Nier Visualizer is a lightweight and efficient Android visual library written in pure Kotlin.It has an independent rendering thread, compatible with most of the equipment on the market. Nier Visualizer is ideal for audio visualization applications such as music players, recorder, live wallpaper and more.

Nier Visualizer has six kinds of independent visual effects currently. More effects are under development, welcome to star operation to see in time.

2. Effect display (constantly updated)

ColumnarType1Renderer ColumnarType2Renderer ColumnarType3Renderer
ColumnarType1Renderer ColumnarType2Renderer ColumnarType3Renderer
ColumnarType4Renderer(FFT) LineRenderer CircleBarRenderer
ColumnarType4Renderer(FFT) LineRenderer CircleBarRenderer
CircleRenderer Compound effect 1 Compound effect 2
CircleRenderer Compound effect1 Compound effect 2
Compound effect 3 Star this project to see more
Compound effect 3 Coming soon

3. How to

3.1 Dependencies

  1. Add it in your root build.gradle at the end of repositories:
allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
  1. Add the dependency
dependencies {
		compile 'com.github.bogerchan:Nier-Visualizer:v0.1.3'
	}

Tips: The Visualizer requires audio permission (android.permission.RECORD_AUDIO), please declare it in your project.

3.2 Sample project

Nier Visualizer project provides a demo module for reference.

3.3 Use Kotlin

3.3.1 Framework initialization

val visualizerManager = NierVisualizerManager()

// need a param of audioSession, 0 is output mix, AudioRecord user please see 3.3.7
val state = visualizerManager.init(0)
if (NierVisualizerManager.SUCCESS != state) {
   // do something...
}

3.3.2 Framework release

visualizerManager.release()

3.3.3 Start rendering

visualizerManager.start(surfaceView, arrayOf(ColumnarType1Renderer()))

3.3.4 Stop rendering

visualizerManager.stop()

3.3.5 Pause rendering

visualizerManager.pause()

3.3.6 Resume rendering

visualizerManager.resume()

3.3.7 Framework initialization by customized data source

val visualizerManager = NierVisualizerManager()

visualizerManager.init(object : NierVisualizerManager.NVDataSource {

                        // skip some code...

                        /**
                         * Tell the manager about the data sampling interval.
                         * @return the data sampling interval which is millisecond of unit.
                         */
                        override fun getDataSamplingInterval() = 0L

                         /**
                         * Tell the manager about the data length of fft data or wave data.
                         * @return the data length of fft data or wave data.
                         */
                        override fun getDataLength() = mBuffer.size

                         /**
                         * The manager will fetch fft data by it.
                         * @return the fft data, null will be ignored by the manager.
                         */
                        override fun fetchFftData(): ByteArray? {
                            return null
                        }

                        /**
                         * The manager will fetch wave data by it.
                         * @return the wave data, null will be ignored by the manager.
                         */
                        override fun fetchWaveData(): ByteArray? {
                            // skip some code...
                            return mBuffer
                        }

                    })

3.4 Use Java

3.4.1 Framework initialization

final NierVisualizerManager visualizerManager = new NierVisualizerManager();

// need a param of audioSession, 0 is output mix, AudioRecord user please see 3.4.7
final int state = visualizerManager.init(0);
if (NierVisualizerManager.SUCCESS != state) {
   // do something...
}

3.4.2 Framework release

visualizerManager.release();

3.4.3 Start rendering

visualizerManager.start(surfaceView, new IRenderer[]{new LineRenderer(true)});

3.4.4 Stop rendering

visualizerManager.stop();

3.4.5 Pause rendering

visualizerManager.pause();

3.4.6 Resume rendering

visualizerManager.resume();

3.4.7 Framework initialization by customized data source

NierVisualizerManager visualizerManager = new NierVisualizerManager();

visualizerManager.init(new NierVisualizerManager.NVDataSource() {

    // skip some code...

    /**
     * Tell the manager about the data sampling interval.
     * @return the data sampling interval which is millisecond of unit.
     */
    @Override
    public long getDataSamplingInterval() {
        return 0L;
    }

    /**
     * Tell the manager about the data length of fft data or wave data.
     * @return the data length of fft data or wave data.
     */
    @Override
    public int getDataLength() {
        return mBuffer.length;
    }

    /**
     * The manager will fetch fft data by it.
     * @return the fft data, null will be ignored by the manager.
     */
    @Nullable
    @Override
    public byte[] fetchFftData() {
        return null;
    }

    /**
     * The manager will fetch wave data by it.
     * @return the wave data, null will be ignored by the manager.
     */
    @Nullable
    @Override
    public byte[] fetchWaveData() {
        // skip some code...
        return mBuffer;
    }
});

4. Follow-up plan

  • Thinking about implementing visual effects like Siri.
  • Some gallery of visual effects tailored for DJ music.
  • If you are interested in it, welcome to Fork to do it together!

5. Thanks

Ported some of the android-visualizer,visual effects, thanks to felixpalmer!

6. Protocol

Copyright 2018 Boger Chan

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

nier-visualizer's People

Contributors

bogerchan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nier-visualizer's Issues

How to set gradient ColumnarType1Renderer in custom renderer?

Hi
I doing custom ColumnarType1Renderer implement IRenderer. I want to set LinearGradient but i don't know position x0, y0, x1, y1 of wave ColumnarType1Renderer.
mPaint.shader = LinearGradient(
0f,
0f,
0f,
0f,
Color.parseColor("#FF7050"),
Color.parseColor("#B42F8F"),
Shader.TileMode.MIRROR
)
So. I want to know position to set gradient wave music ColumnarType1Renderer. Please , help me
Tks so much

Cannot initialize Visualizer engine, error: -3

Hi. Thanks for this amazing Visualizer.
In the past it worked for me. But for my new app, I am not sure why it happens. I provided a valid audio session ID but still it gives this error. I am on Android 10.

Here is the code

NierVisualizerManager visualizerManager = new NierVisualizerManager();
visualizerManager.init(audioTrack.getAudioSessionId());//this is valid ID. I checked
visualizerManager.start(binding.surfaceView, new IRenderer[]{new ColumnarType1Renderer()});

2021-01-27 17:19:20.868 6620-6620/com.x_bytes E/AudioEffect: set(): AudioFlinger could not create effect e46b26a0-dddd-11db-8afd-0002a5d5c51b / `x��}, status: -1
2021-01-27 17:19:20.868 6620-6620/com.x_bytes E/visualizers-JNI: Visualizer initCheck failed -3
2021-01-27 17:19:20.868 6620-6620/com.x_bytes E/Visualizer-JAVA: Error code -3 when initializing Visualizer.
2021-01-27 17:19:20.869 6620-6620/com.x_bytes D/AndroidRuntime: Shutting down VM
2021-01-27 17:19:20.872 6620-6620/com.x_bytes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.x_bytes, PID: 6620
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.x_bytes/com.x_bytes.ModernAudio}: java.lang.RuntimeException: Cannot initialize Visualizer engine, error: -3
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)
Caused by: java.lang.RuntimeException: Cannot initialize Visualizer engine, error: -3
at android.media.audiofx.Visualizer.(Visualizer.java:257)
at me.bogerchan.niervisualizer.NierVisualizerManager.init(NierVisualizerManager.kt:42)
at com.x_bytes.ModernAudio.onCreate(ModernAudio.java:82)
at android.app.Activity.performCreate(Activity.java:7824)
at android.app.Activity.performCreate(Activity.java:7813)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
at android.os.Handler.dispatchMessage(Handler.java:107) 
at android.os.Looper.loop(Looper.java:214) 
at android.app.ActivityThread.main(ActivityThread.java:7356) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925) 

MediaRecorder does not show rendering

When I try using this along with MediaRecorder as follows:

this.nierVisualizerManager = new NierVisualizerManager();
this.nierVisualizerManager.init(1); // For MIC inout - Is that the right value?
this.nierVisualizerManager.start(this.audioVisualizer,new IRenderer[]{new CircleRenderer(true),new CircleBarRenderer(),new ColumnarType4Renderer()});

I see no activity getting registered in the view, the view stays static.

Does it support the MIC input channel for showing Visualization or is it meant only for Audio Output.

How to use it while Recording Audio?

Hi,
The visualisers are working fine with audio files but doesn't seem to work well with recording audio. Like ColumnarType4Renderer(FFT) is not working when recording audio from mic/speaker.

How to reset the visualizer after playback

When i call mVisualizerManager?.stop() and mVisualizerManager?.release(), i expect it to reset to original position, but it suddenly stop. how to reset the view to zero line after stop pls help

能不能做个时域的效果

终于找到你了,做得很棒,声音反应也实时够快!比Github上其他Android的库都好,而且还是
kotlin写的,完全满足我的需求,谢谢。

能不能做个时域的效果,就是类似ios中语音备忘录那样的效果。

现在好像都是频域的效果吧?

demo里点击录音没效果

准确的说是在录音情况下,这十种动画效果里,所有包含1,2,3,5,7效果的都不会起作用

NoSuchMethodError: android.media.audiofx.Visualizer.setScalingMode

Hi,

Please check the below error:-

Fatal Exception: java.lang.NoSuchMethodError: android.media.audiofx.Visualizer.setScalingMode
       at me.bogerchan.niervisualizer.NierVisualizerManager.init(Unknown Source)
       at com.radios.india.RadioStationActivity.setVisual(Unknown Source)
       at com.radios.india.RadioStationActivity.onCreate(Unknown Source)
       at android.app.Activity.performCreate(Activity.java:4470)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
       at android.app.ActivityThread.access$600(ActivityThread.java:128)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4517)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
       at dalvik.system.NativeStart.main(NativeStart.java)

Not sync with Audio

Animation is still running after audio stop. Animation should stop and play according to Audio stop/play same as I am using Wave visualization project from github.

How to make two animation (two renderers) work with the same visualizerManager?

Hi! This library is awesome. Thank you for that!

I'm working in a project which I need to use a CircleSolidRenderer customized and below that I need to put an ColumnType4Renderer. My problem is that I need both work together, I mean, both shoudl be started by a NierVisualizerManager. I coudn't start them by the same manager and neighter by two separeted managers (using the same media player, only one animation is started)

Could you help me? Is it possible?

sometime wrong

kotlin.UninitializedPropertyAccessException: lateinit property mDestWaveData has not been initialized
at me.bogerchan.niervisualizer.util.KeyFrameMaker.updateWaveData(KeyFrameMaker.kt:32)
at me.bogerchan.niervisualizer.core.NierVisualizerRenderWorker.processUpdateWaveEvent(NierVisualizerRenderWorker.kt:118)
at me.bogerchan.niervisualizer.core.NierVisualizerRenderWorker.access$processUpdateWaveEvent(NierVisualizerRenderWorker.kt:22)
at me.bogerchan.niervisualizer.core.NierVisualizerRenderWorker$mRenderHandler$2$1.handleMessage(NierVisualizerRenderWorker.kt:56)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.os.HandlerThread.run(HandlerThread.java:67)

Output mp4

How to get output from mp4 file from library?

setCaptureSize() called in wrong state: 2

Hi,

I am using your library and got more than 1k bugs from different devices in crashlytics.

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{coders.hub.fm.radio/com.radios.india.RadioStationActivity}: java.lang.IllegalStateException: setCaptureSize() called in wrong state: 2
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2875)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2950)
       at android.app.ActivityThread.-wrap11(Unknown Source)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1616)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6759)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

and second logcat:-

Caused by java.lang.IllegalStateException: setCaptureSize() called in wrong state: 2
       at android.media.audiofx.Visualizer.setCaptureSize(Visualizer.java:315)
       at me.bogerchan.niervisualizer.NierVisualizerManager.init(Unknown Source:11)
       at com.radios.india.RadioStationActivity.setVisual(Unknown Source:15)
       at com.radios.india.RadioStationActivity.onCreate(Unknown Source:340)
       at android.app.Activity.performCreate(Activity.java:6980)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2828)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2950)
       at android.app.ActivityThread.-wrap11(Unknown Source)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1616)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6759)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

Other one...

Fatal Exception: java.lang.NoSuchMethodError: android.media.audiofx.Visualizer.setScalingMode
       at me.bogerchan.niervisualizer.NierVisualizerManager.init(Unknown Source)
       at com.radios.india.RadioStationActivity.setVisual(Unknown Source)
       at com.radios.india.RadioStationActivity.onCreate(Unknown Source)
       at android.app.Activity.performCreate(Activity.java:4470)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
       at android.app.ActivityThread.access$600(ActivityThread.java:128)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4517)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
       at dalvik.system.NativeStart.main(NativeStart.java)

Please check and let me know.

Export to MP4 file

Hi, thank for create this library
I want export the wave sound to mp4 file.
Can you help me?

How I can generate a video

First of all, thanks for the effort you did here but I have one question, I want to generate these effects to video is there a way we can follow.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.