我正在发现vlcj,并尝试使用这些方法和教程。我正在寻找“声压级”(如VUMeters)。在AudioTrackInfo中,我发现了一个有趣的方法,称为“ Level”。但是它返回0。为什么?这个水平是我要寻找的“声压”吗?如果没有,如何获得该价值?
这是我用于试用的简单(脏)代码:
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”属性是什么,但这有点像用于准备轨道的编码器级别。
不管是什么,它都不是您想要的。
要获得所需的“压力”数据,您需要使用“直接”音频播放器-这使您可以访问本地音频样本缓冲区,然后可以对其进行频率分析。
不利的一面是,如果您像这样捕获音频样本数据,则VLC实际上不会播放音频-您必须自己播放。
对于vlcj,这基本上意味着要使用Java API进行播放。例如,JavaSound API可以播放它。 vlcj测试源中有一个示例显示了这一点。在此答案中有太多代码无法重现,您可以在这里找到:
https://github.com/caprica/vlcj/tree/master/src/test/java/uk/co/caprica/cj/test/directaudio