在 vlcj 中,AudioTrackInfo 得到的 "level" 是什么?
In vlcj, what's the "level" get by the AudioTrackInfo?
我正在探索 vlcj 并尝试使用这些方法和教程。我正在寻找 "sound pressure level"(就像在 VUMeters 中一样)。在 AudioTrackInfo 中,我发现了一个名为 "Level" 的有趣方法。但是它 returns 0。为什么?这个级别是我要找的 "sound pressure" 吗?如果不是,如何获得该值?
这是我用于试用的简单(而且很脏)代码:
import java.util.List;
import uk.co.caprica.vlcj.component.AudioMediaPlayerComponent;
import uk.co.caprica.vlcj.player.AudioTrackInfo;
import uk.co.caprica.vlcj.player.MediaPlayer;
import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter;
import uk.co.caprica.vlcj.player.TrackInfo;
import uk.co.caprica.vlcj.player.TrackType;
public class BasicAudioPlayer {
private final AudioMediaPlayerComponent mpc;
private static String[] playList = new String[] {
"Sam Brown - Stop (Official Music Video) - YouTube.mp3",
"Bon Jovi - Bed Of Roses - YouTube.mp3",
"Kendji Girac - Conmigo - YouTube.mp3",
"http://live.radiooxygene.fr:7710/"};
private BasicAudioPlayer() {
mpc = new AudioMediaPlayerComponent();
mpc.getMediaPlayer().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
@Override
public void stopped(MediaPlayer mediaPlayer) {
exit(0);
}
@Override
public void finished(MediaPlayer mediaPlayer) {
exit(0);
}
@Override
public void error(MediaPlayer mediaPlayer) {
exit(1);
}
});
}
private void prepare(String mrl) {
mpc.getMediaPlayer().prepareMedia(mrl);
mpc.getMediaPlayer().parseMedia();
}
private void start(String mrl) {
mpc.getMediaPlayer().playMedia(mrl);
//I introduce a threadsleep just for the trial
//to be sure that I'm not in the fade-in of the song
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
List<TrackInfo> trackInfo = mpc.getMediaPlayer().getTrackInfo(TrackType.AUDIO);
for (TrackInfo track : trackInfo) {
if (track instanceof AudioTrackInfo) {
AudioTrackInfo audioTrack = (AudioTrackInfo) track;
System.out.println(audioTrack.toString());
System.out.println(audioTrack.level());
}
}
}
private void exit (int result) {
mpc.release();
System.exit(result);
}
public static void main(String[] args) {
BasicAudioPlayer bap = new BasicAudioPlayer();
bap.prepare(playList[2]);
bap.start(playList[2]);
try {
Thread.currentThread().join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
感谢您的所有回答。问候。
我不太清楚 "level" 属性是什么,但它类似于用于准备轨道的编码器级别。
无论是什么,都不是您要找的。
要获得您想要的 "pressure" 数据,您需要使用 "direct" 音频播放器 - 这使您可以访问本机音频样本缓冲区,然后您可以对其进行频率分析。
缺点是,如果您像这样捕获音频样本数据,那么 VLC 将不会实际播放音频 - 您必须自己播放。
对于 vlcj,这基本上意味着使用 Java API 播放它。例如,JavaSound API 可以播放它。 vlcj 测试源中有一个示例显示了这一点。在这个答案中有太多代码无法重现,你可以在这里找到它:
https://github.com/caprica/vlcj/tree/master/src/test/java/uk/co/caprica/cj/test/directaudio
我正在探索 vlcj 并尝试使用这些方法和教程。我正在寻找 "sound pressure level"(就像在 VUMeters 中一样)。在 AudioTrackInfo 中,我发现了一个名为 "Level" 的有趣方法。但是它 returns 0。为什么?这个级别是我要找的 "sound pressure" 吗?如果不是,如何获得该值?
这是我用于试用的简单(而且很脏)代码:
import java.util.List;
import uk.co.caprica.vlcj.component.AudioMediaPlayerComponent;
import uk.co.caprica.vlcj.player.AudioTrackInfo;
import uk.co.caprica.vlcj.player.MediaPlayer;
import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter;
import uk.co.caprica.vlcj.player.TrackInfo;
import uk.co.caprica.vlcj.player.TrackType;
public class BasicAudioPlayer {
private final AudioMediaPlayerComponent mpc;
private static String[] playList = new String[] {
"Sam Brown - Stop (Official Music Video) - YouTube.mp3",
"Bon Jovi - Bed Of Roses - YouTube.mp3",
"Kendji Girac - Conmigo - YouTube.mp3",
"http://live.radiooxygene.fr:7710/"};
private BasicAudioPlayer() {
mpc = new AudioMediaPlayerComponent();
mpc.getMediaPlayer().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
@Override
public void stopped(MediaPlayer mediaPlayer) {
exit(0);
}
@Override
public void finished(MediaPlayer mediaPlayer) {
exit(0);
}
@Override
public void error(MediaPlayer mediaPlayer) {
exit(1);
}
});
}
private void prepare(String mrl) {
mpc.getMediaPlayer().prepareMedia(mrl);
mpc.getMediaPlayer().parseMedia();
}
private void start(String mrl) {
mpc.getMediaPlayer().playMedia(mrl);
//I introduce a threadsleep just for the trial
//to be sure that I'm not in the fade-in of the song
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
List<TrackInfo> trackInfo = mpc.getMediaPlayer().getTrackInfo(TrackType.AUDIO);
for (TrackInfo track : trackInfo) {
if (track instanceof AudioTrackInfo) {
AudioTrackInfo audioTrack = (AudioTrackInfo) track;
System.out.println(audioTrack.toString());
System.out.println(audioTrack.level());
}
}
}
private void exit (int result) {
mpc.release();
System.exit(result);
}
public static void main(String[] args) {
BasicAudioPlayer bap = new BasicAudioPlayer();
bap.prepare(playList[2]);
bap.start(playList[2]);
try {
Thread.currentThread().join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
感谢您的所有回答。问候。
我不太清楚 "level" 属性是什么,但它类似于用于准备轨道的编码器级别。
无论是什么,都不是您要找的。
要获得您想要的 "pressure" 数据,您需要使用 "direct" 音频播放器 - 这使您可以访问本机音频样本缓冲区,然后您可以对其进行频率分析。
缺点是,如果您像这样捕获音频样本数据,那么 VLC 将不会实际播放音频 - 您必须自己播放。
对于 vlcj,这基本上意味着使用 Java API 播放它。例如,JavaSound API 可以播放它。 vlcj 测试源中有一个示例显示了这一点。在这个答案中有太多代码无法重现,你可以在这里找到它:
https://github.com/caprica/vlcj/tree/master/src/test/java/uk/co/caprica/cj/test/directaudio