首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中使用滑块MP3音频文件的持续时间?

如何在Java中使用滑块MP3音频文件的持续时间?
EN

Stack Overflow用户
提问于 2017-07-17 18:31:33
回答 1查看 1.1K关注 0票数 0

我想用Java做一个播放MP3文件的程序。我使用JLayer jar播放MP3文件,使用mp3agic jar显示mp3文件标签,如艺术家姓名等。我想问大家的一件事是,我如何在我的代码中使用JSlider来使用滑块查找我的MP3文件的持续时间(时间)?也请让我知道如果我必须使用外部jar

代码如下:

代码语言:javascript
复制
import javazoom.jl.decoder.JavaLayerException;
import com.mpatric.mp3agic.InvalidDataException;
import com.mpatric.mp3agic.Mp3File;
import com.mpatric.mp3agic.UnsupportedTagException;
import javazoom.jl.player.advanced.*;
import java.awt.FileDialog;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class MP3Player extends JFrame implements ChangeListener{
JFrame f;
JSlider sl;
FileInputStream fis;
AdvancedPlayer pl;
Mp3File mp3tags;
String s;
MP3Player() throws JavaLayerException,IOException, UnsupportedTagException, InvalidDataException
{
    f=new JFrame();
    f.setTitle("MP3 Player");
    f.setBounds(250, 150, 500, 500);
FileDialog fd=new FileDialog(f,"Select Audio File",FileDialog.LOAD);
fd.setVisible(true);
FileInputStream fis=new FileInputStream(new File(fd.getDirectory(),fd.getFile()));
pl=new AdvancedPlayer(fis);
s=fd.getDirectory()+fd.getFile();
mp3tags=new Mp3File(s);
System.out.println(mp3tags.getId3v2Tag().getArtist());
new Thread()
{
    public void run()
    {
        try {
            pl.play();
        } catch (JavaLayerException e) {
            e.printStackTrace();
        }
    }
}.start();
sl=new JSlider();
sl.setBounds(250, 500, 500, 500);
f.add(sl);
sl.setMinimum(0);
sl.setValue(0);
sl.addChangeListener(this);
}
public static void main(String asrar[]) throws JavaLayerException,IOException, UnsupportedTagException, InvalidDataException
{
    MP3Player mp3=new MP3Player();
    mp3.f.setVisible(true);
}
@Override
public void stateChanged(ChangeEvent e) {

}
}
EN

回答 1

Stack Overflow用户

发布于 2017-07-17 21:54:23

首先,你需要知道你的文件中有多少帧,以及这些帧的总持续时间。

代码语言:javascript
复制
int totalFrames = mp3Tags.getFrameCount();
long timeInMillis = mp3Tags.getLengthInMilliseconds();

一旦我们做到了这一点,就有很多事情可以做。您可以设置滑块的最大值。

代码语言:javascript
复制
sl.setMaximumValue(totalFrames);

然后当你移动滑块时,你就让你的球员从那个点开始玩了.

代码语言:javascript
复制
@Override
public void stateChanged(ChangeEvent e) {
    int value = ((JSlider)e.getSource()).getValue();
    pl.play(value, totalFrames); #or Integer.MAX_VALUE to play to end for certain.
}

javafx的一种方式是使用媒体/媒体播放器。

代码语言:javascript
复制
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;

import java.nio.file.Paths;

/**
 * Created by melkor on 7/30/17.
 */
public class PlayMediaFx extends Application {
    MediaPlayer player;
    @Override
    public void start(Stage primaryStage) throws Exception {
        Pane root = new Pane();
        Pane pane = new VBox();

        Button button = new Button("play");
        button.setOnMouseClicked(evt->{
            if(player==null){
                loadSound();
            }
            player.play();
        });

        Button seek = new Button("seek 3 seconds");
        seek.setOnMouseClicked(evt->{
            if(player!=null){
                Duration d = player.getCurrentTime();
                player.seek(d.add(new Duration(3000)));
            }
        });

        Button pause = new Button("pause");
        pause.setOnMouseClicked(evt->{
            if(player!=null){

                player.pause();
            }
        });

        Button stop = new Button("stop");
        stop.setOnMouseClicked(evt->{
            if(player!=null){
                player.stop();
            }
        });

        pane.getChildren().addAll(button, pause, seek, stop);
        root.getChildren().addAll(pane);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public void loadSound(){
        Media media = new Media(Paths.get("test.aif").toUri().toString());
        player = new MediaPlayer(media);
        player.setOnReady(()->{
            player.setStopTime(player.getTotalDuration());
        });
    }

    public static void main(String[] args){
        launch(args);
    }
}

除了Slider之外,它包含了所有的成分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45141876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档