ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • javaFX 컨트롤 - 미디어 컨트롤 (MediaPlayer, MediaView)
    카테고리 없음 2020. 5. 23. 11:55

    미디어 컨트롤

     

    MediaView : 비디오를 재생

     

     - Slider : 볼륨 조절 및 재생 위치 조절

     

     - ProgressBar와 ProgresIndicator : 현재 진행 상태

     

     - Slider,ProgressBar와 ProgresIndicator는 미디어말고도 다른 용도로 사용 가능.


     

    MediaPlayer와 MediaView 컨트롤

     

    MediaView : 특별한 UI는 따로 없고 레이아웃상에 비디오가 위치할 영역 표시.

     

    <MediaView fitHeight="200.0" fitWidth="200.0" preserveRatio="false" />

     

    * 비디오를 재생하는 기능이 없으므로 미디어를 재생하는 MediaPlayer가 있어야 함.

     

    MediaPlayer : 비디오, 오디오 재생 가능.

     

    미디어 소스 경로를 Media 객체 형태로 전달해서 생성

     

    ex)

     

    Media m = new Media("미디어 소스 경로");

     

    MediaPlayer mp = new MediaPlayer(m);

     

    * 비디오, 오디오 파일이 클래스 경로가 있을 경우.

     

    Media m = new Media( getClass().getResource("media/abc.m4v").toString());

     

    MediaPlayer mp = new MediaPlayer(m);

     

    - 미디어 소스가 비디오일 경우 MediaView의 setMediaPlayer()메서드로 MediaPlayer 객체 등록가능.

     

    오디오 소스라면 MediaView는 필요 없음.

     

    mediaView.setMediaPlayer(mediaPlayer);

     

    생성 후 바로 재생하는 것이 아니라 재생할 상태가 될 때까지 대기해야함.

    UNKNOWN : Mediaplayer가 생성된 직 후 상태. 

     

    READY : 미디어 소스를 재생할 준비가 되었을 때 상태.

     

    PLAYING : READY 상태에서 setAutoPlay(true).play() 나 play()를 호출하면.

     

    PAUSED : PLAYING 상태에서 pause() 호출 시

     

    STOPPED : PLAYING 상태에서 stop() 호출 시

     

    STALLED : PLAYING 상태에서 재생 버퍼에 충분한 데이터가 없을 때.

     

    위 상태들은 MediaPlayerStatus 열거 타입으로 정의되어 있음.

     

    getStatus() 의 리턴값으로 확인 가능.

     

    *EndOfMedia 상태도 알아야 함. : MediaPlayer가 미디어 소스를 모두 재생했을 때 상태.

     

    EndOfMedia 상태에서 play()를 호출하면 다시 PLAYING 상태가 될 수 있다. 단, 먼저 seek()메서드로 재생위치를

     

    처음올 돌려 놓아야 함.

     

    * 상태가 변경되면 자동 실행해야 할 코드가 있음.

     

    -> 이 코드들은 Runnable 의 run() 메서드에 작성하고 setOnXXX()메서드로 등록.

     

    -> 해당 상태가 되었을 때 Runnable의 run() 메서드 자동 실행.

     

    자바1)
    
    package thisisjava;
    
    
    
    import javafx.application.Application;
    
    import javafx.fxml.FXMLLoader;
    
    import javafx.scene.Parent;
    
    import javafx.scene.Scene;
    
    import javafx.stage.Stage;
    
    
    
    public class AppMain extends Application {
    
    @Override
    
    public void start(Stage primaryStage) throws Exception {
    
    Parent root = (Parent)FXMLLoader.load(getClass().getResource("root.fxml"));
    
    Scene scene = new Scene(root);
    
    
    primaryStage.setTitle("미디어뷰 컨트롤");
    
    primaryStage.setScene(scene);
    
    primaryStage.show();
    
    }
    
    
    public static void main(String[] args) {
    
    launch(args);
    
    }
    
     
    
    }
    
    
    자바2)
    
    package thisisjava;
    
    
    
    import java.net.URL;
    
    import java.util.ResourceBundle;
    
    
    
    import javafx.fxml.FXML;
    
    import javafx.fxml.Initializable;
    
    import javafx.scene.control.Button;
    
    import javafx.scene.image.ImageView;
    
    import javafx.scene.media.Media;
    
    import javafx.scene.media.MediaPlayer;
    
    import javafx.scene.media.MediaView;
    
    
    
    public class RootController implements Initializable {
    
    @FXML private MediaView mediaView;
    
    @FXML private ImageView imageView;
    
    @FXML private Button btnPlay;
    
    @FXML private Button btnPause;
    
    @FXML private Button btnStop;
    
    
    private boolean endOfMedia;
    
    
    @Override
    
    public void initialize(URL location, ResourceBundle resources) {
    
    //미디어 객체 생성
    
    Media media = new Media(getClass().getResource("media/video.m4v").toString());
    
    //Media media = new Media(getClass().getResource("media/audio.wav").toString());
    
    
    //미디어 플레이어 생성 및 미디어 뷰에 설정
    
    MediaPlayer mediaPlayer = new MediaPlayer(media);
    
    mediaView.setMediaPlayer(mediaPlayer);
    
    
    //해당 상태가 되면 실행할 Runnable 설정
    
    mediaPlayer.setOnReady(new Runnable() {
    
    @Override
    
    public void run() {
    
    btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(true);
    
    if(mediaPlayer.isAutoPlay()) {mediaView.setVisible(false);}
    
    }
    
    });
    
    mediaPlayer.setOnPlaying(()->{
    
    btnPlay.setDisable(true); btnPause.setDisable(false); btnStop.setDisable(false);
    
    });
    
    mediaPlayer.setOnPaused(()->{
    
    btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(false);
    
    });
    
    mediaPlayer.setOnEndOfMedia(()->{
    
    endOfMedia = true;
    
    btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(true);
    
    });
    
    mediaPlayer.setOnStopped(()->{
    
    mediaPlayer.seek(mediaPlayer.getStartTime());
    
    btnPlay.setDisable(false); btnPause.setDisable(true); btnStop.setDisable(true);
    
    });
    
    
    //버튼 ActionEvent 처리
    
    btnPlay.setOnAction(event->{
    
    if(endOfMedia) { 
    
    mediaPlayer.stop(); 
    
    mediaPlayer.seek(mediaPlayer.getStartTime());
    
    }
    
    mediaPlayer.play();
    
    endOfMedia = false;
    
    });
    
    btnPause.setOnAction(event->mediaPlayer.pause());
    
    btnStop.setOnAction(event->mediaPlayer.stop());
    
    }
    
    }

    댓글

Designed by Tistory.