vlcj-播放之前如何更改音频的音量?

问题描述 投票:1回答:1

我尝试过此

val player: MediaPlayer = MediaPlayerFactory("-vvv").mediaPlayers().newMediaPlayer()
val result0: Boolean = player.audio().setVolume(50) // result0: true
player.media().play("/path/to/audio.ogg")
val result1: Boolean = player.audio().setVolume(50) // result1: false

和此

val player: MediaPlayer = MediaPlayerFactory("-vvv").mediaPlayers().newMediaPlayer()
val result0 = player.audio().setVolume(50) // result0: true
player.media().prepare("/path/to/audio.ogg")
val result1: Boolean = player.audio().setVolume(50) // result1: false
player.controls().play()
val result2: Boolean = player.audio().setVolume(50) // result2: false

但是音量保持在100%。我发现的唯一方法是制作这样的东西

val player: MediaPlayer = MediaPlayerFactory("-vvv").mediaPlayers().newMediaPlayer()
player.events().addMediaPlayerEventListener(object : MediaPlayerEventAdapter() {
    override fun mediaPlayerReady(mediaPlayer: MediaPlayer) {
        mediaPlayer.submit {
            mediaPlayer.audio().setVolume(50)
        }
    }
})
player.media().play("/path/to/audio.ogg")

但是解决方案离理想还差得远。因为它开始播放,播放了一段时间,然后飞快移动,所以音量已更改。

我尝试了vlcj 4.4.0和4.5.2,VLC 3.0.8和3.0.10,jdk8和14,但是它以相同的方式工作。

kotlin libvlc vlcj
1个回答
1
投票

不幸的是,这在VLC 3.x中不起作用,但是在即将推出的VLC 4.x中起作用(在编写此答案时,VLC 4仍在开发中。]]

以下代码使用从源构建的最新VLC 4和最新的vlcj-5快照为我工作:

import uk.co.caprica.vlcj.player.component.AudioPlayerComponent;
import uk.co.caprica.vlcj.test.VlcjTest;

public class AudioMediaPlayerComponentTest extends VlcjTest {

    public static void main(String[] args) throws Exception {
        String mrl = "/home/music/some-cool-synthwave-tune.mp3";

        AudioPlayerComponent audioMediaPlayerComponent = new AudioPlayerComponent();
        audioMediaPlayerComponent.mediaPlayer().audio().setVolume(5);
        audioMediaPlayerComponent.mediaPlayer().media().play(mrl);

        Thread.currentThread().join();
    }
}

媒体播放器的初始音量来自OS音量设置,实际上OS音量设置是双向链接到媒体播放器的。一处更改音量反映在另一处。

通过LibVLC进行音量处理通常在VLC 4中似乎要好得多。

[如果您目前停留在VLC 3上,这很合理,那么不幸的是,您还会遇到某种折衷解决方案,例如使用已经发现的“ ready”事件。

[ready事件的全部作用是等待第一个位置改变的事件,而该事件是专门为达成这样的目的而创建的。

我测试了可用于媒体播放器的所有本机事件回调,并且nothing

试图在实际开始播放之前设置音量。

这将为您提供以下内容,就像您已经发现的一样:

import uk.co.caprica.vlcj.player.base.MediaPlayer;
import uk.co.caprica.vlcj.player.component.AudioPlayerComponent;
import uk.co.caprica.vlcj.test.VlcjTest;

public class AudioMediaPlayerComponentTest extends VlcjTest {

    public static void main(String[] args) throws Exception {
        String mrl = "/home/music/some-cool-synthwave-tune.mp3";

        AudioPlayerComponent audioMediaPlayerComponent = new AudioPlayerComponent() {
            @Override
            public void mediaPlayerReady(MediaPlayer mediaPlayer) {
                mediaPlayer.audio().setVolume(30);
            }
        };

        audioMediaPlayerComponent.mediaPlayer().media().play(mrl);

        Thread.currentThread().join();
    }
}

一种完全横向的替代方法可能是播放尽可能短的无声媒体,作为一种前期准备-当该媒体播放完毕(您可以听完播放完成或停止的事件)后,您应该可以设置音量并播放您的实际媒体。我没有尝试过。

© www.soinside.com 2019 - 2024. All rights reserved.