vlcj - 如何在播放前更改音频的音量?
vlcj - How to change the volume of audio before playing it?
我试过了
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,但它们的工作方式相同。
不幸的是,这在 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" 事件.
就绪事件所做的就是等待第一个位置更改事件,而该事件是专门为此类目的而创建的折衷方案。
我测试了媒体播放器可用的所有本机事件回调,没有任何东西在实际开始播放之前设置音量。
正如您已经发现的那样,这给您留下了以下内容:
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();
}
}
一个完全横向的替代方案可能是播放尽可能短的无声媒体作为一种预滚动 - 当该媒体结束时(有一个结束或停止的事件你可以收听)然后你应该能够设置音量并播放您的实际媒体。这个我没试过。
我试过了
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,但它们的工作方式相同。
不幸的是,这在 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" 事件.
就绪事件所做的就是等待第一个位置更改事件,而该事件是专门为此类目的而创建的折衷方案。
我测试了媒体播放器可用的所有本机事件回调,没有任何东西在实际开始播放之前设置音量。
正如您已经发现的那样,这给您留下了以下内容:
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();
}
}
一个完全横向的替代方案可能是播放尽可能短的无声媒体作为一种预滚动 - 当该媒体结束时(有一个结束或停止的事件你可以收听)然后你应该能够设置音量并播放您的实际媒体。这个我没试过。