-
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()); } }