在 Android 上实时更改曲目的播放速率

发布于 2024-08-30 15:31:14 字数 946 浏览 15 评论 0原文

我想知道是否有人知道一个可以实时更改曲目播放速率的库。我的想法是加载曲目并将其播放速率更改为一半或两倍。首先,我尝试使用 MusicPlayer,但根本不可能,然后我尝试使用 SoundPool。问题是,使用 SoundPool,一旦加载曲目,我就无法更改速率。这是我正在使用的代码(概念证明):

float j = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button b = (Button)findViewById(R.id.Button01);
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            j = (float) (j +.5);

        }
    });

    AssetFileDescriptor afd;
    try {

        SoundPool sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

        afd = getAssets().openFd("wav/sample.wav");
        int id = sp.load(afd, 1);
        sp.play(id, 1, 1, 1, 0, j);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

当我按下按钮时,播放速率应该增加,但它不会发生。知道如何实时改变汇率吗?

提前致谢。

I would like to know if somebody knows a library to changing the playback rate of a track in real time. My idea is to load a track and change its playback rate to half or double. Firstly, I tried with MusicPlayer but is was not possible at all and then I tried with SoundPool. The problem is that with SoundPool I can´t change the rate once the track is loaded. Here is the code I am using (proof of concept):

float j = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button b = (Button)findViewById(R.id.Button01);
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            j = (float) (j +.5);

        }
    });

    AssetFileDescriptor afd;
    try {

        SoundPool sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

        afd = getAssets().openFd("wav/sample.wav");
        int id = sp.load(afd, 1);
        sp.play(id, 1, 1, 1, 0, j);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

When I press the button, the playback rate should increase but it does not happen. Any idea of how change the rate in real time?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

音盲 2024-09-06 15:31:14

您调用 sp.play 一次,在调用该函数时,j 的值将复制到该函数中。

之后更改 j 不会更改函数中 j 的值(这称为按值传递)。

要更改播放速率,您需要在按钮单击侦听器中调用 sp.setRate(StreamID,j)。

请注意,StreamID 由 sp.play 函数返回,因此将其存储为类中的变量。

这段代码应该可以工作(我没有测试它):

float j = 1.0f;
SoundPool sp = null;
int sID = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button b = (Button)findViewById(R.id.Button01);
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            j = (float) (j +.5f);
            sp.setRate(sID,j);

        }
    });

    AssetFileDescriptor afd;
    try {

        sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

        afd = getAssets().openFd("wav/sample.wav");
        int id = sp.load(afd, 1);
        sID = sp.play(id, 1, 1, 1, 0, j);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

虽然按下几次按钮后它可能会崩溃,但 SoundPool 仅支持 0.5 到 2.0 的速率。您应该添加检查以确保 j 保持在这些范围内。

you call sp.play once, at the time that function is called the value of j is copied into that function.

Changing j afterward doesn't change the value of j in the function (this is called pass by value)

To change the rate of play afterward you need to call sp.setRate(StreamID,j) within your button click listener.

Note that the StreamID is returned by the sp.play function, so store this as a variable in the class.

This code should work ( i didn't test it):

float j = 1.0f;
SoundPool sp = null;
int sID = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button b = (Button)findViewById(R.id.Button01);
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            j = (float) (j +.5f);
            sp.setRate(sID,j);

        }
    });

    AssetFileDescriptor afd;
    try {

        sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

        afd = getAssets().openFd("wav/sample.wav");
        int id = sp.load(afd, 1);
        sID = sp.play(id, 1, 1, 1, 0, j);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

although it will probably crash after a couple button presses, SoundPool only supports rates from 0.5 to 2.0. You should add checking to make sure j stays within those bounds.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文