我正在发现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

10-07 21:03