레시피 영상이 요리 초보의 진도에 맞춰 재생되게 하고 싶다.
제스쳐/음성 인식부로 들어온 반환값을 참조하여 알맞은 동영상 제어를 수행한다.
PierfrancescoSoffritti YouTube API Github
구글에서 제공해주는 Official YouTube API가 존재한다.
그러나 구글 API의 다음과 같은 두 가지 이유 때문에 Unofficial을 선택했다.
3번을 부연 설명하자면 MediaPipe는 AppCompatActivity를 extends하고 구글 API는 YouTubeBaseActivity를 extends한다.
2개의 클래스를 동시에 extends 하여 사용 가능한지는 잘 모르겠으나 현재의 능력으로는 불가능하다고 판단하여 MediaPipe와 같은 클래스를 상속하는 라이브러리가 필요했다.
추가적으로, 해당 라이브러리는 Google Official YouTube API를 래핑하여 만들어진 라이브러리이므로 유튜브 보안 정책에 위반되지 않는다.
YouTubePlayer.loadVideo(String videoId, float startTime)
YouTubePlayer.cueVideo(String videoId, float startTime)
유튜브를 제어하기 위해서는 가장 먼저 동영상을 불러와야 한다. 이 때, 두 가지 함수를 사용할 수 있다.
loadVideo는 로딩과 동시에 바로 재생을 시켜주는 함수이고, cueVideo는 로딩만 해주는 함수이다.
cueVideo를 사용하면 썸네일 상태로 로딩된다.
// 정지 명령어
Button btnPause = (Button) findViewById(R.id.btn_pause);
btnPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
youTubePlayer.pause();
}
});
// 재생 명령어
Button btnPlay = (Button) findViewById(R.id.btn_play);
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
youTubePlayer.play();
}
});
세부 메서드만 달라지고 전체적인 골격이 비슷한 구조로 반복된다.
youTubePlayer.pause();
youTubePlayer.play();
위 2개의 메서드가 핵심이다.
// 앞으로 점프
Button btnAdvance = (Button) findViewById(R.id.btn_advance);
btnAdvance.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
youTubePlayer.addListener(tracker);
Float cur_time = tracker.getCurrentSecond();
Float flag = cur_time + (float) 10.0;
youTubePlayer.seekTo(flag);
}
});
getCurrentSecond()
= 현재 시각 float 반환
seekTo(float)
= float 시각으로 time bar 이동
// 반속 재생
Button btnHalfSpeed = (Button) findViewById(R.id.btn_half_speed);
btnHalfSpeed.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
youTubePlayer.setPlaybackRate(PlayerConstants.PlaybackRate.RATE_0_5);
}
});
RATE 뒤의 숫자로 속도를 조절한다.
// 타임스탬프 저장을 안 하고 불러오기 먼저 클릭하였을 경우, 에러가 발생하므로
// 이를 위해 타임스탬프 저장 시간을 0으로 초기화 해준다.
time_stamp = tracker.getCurrentSecond();
// 타임스탬프 시각 저장
Button btnSave = (Button) findViewById(R.id.btn_save);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
youTubePlayer.addListener(tracker);
time_stamp = tracker.getCurrentSecond();
int hour = (int) Math.round(time_stamp)/60;
int sec = Math.round(time_stamp) - (hour*60);
String msg = "저장 시각: " + hour + "분" + sec + "초";
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
}
});
로직은 변수에 현재 시각을 담아 언제든지 불러올 수 있도록 하는 단순한 설계이지만 초기 타임 스탬프 변수를 반드시 초기화
해주어야 하는 특징이 있었다.
유익해요!