| 자 바 기술은 새로운 고선명 비디오 표준인 블루레이 디스크 표준의 중요한 부분입니다. 총 2부로 구성된 이번 시리즈에서는 자바 언어를 사용하여 블루레이 디스크 플레이어용 애플리케이션(예: 매우 인기 있는 PlayStation 3 게임 콘솔) 작성과 관련된 여러 가지 요소를 다룹니다. |
자 바 개발자에게는 매우 유용한 시간이 될 것입니다. JavaOne 2008 컨퍼런스에서 제공한 최신 통계에 따르면 전세계에 배포된 자바 사용 장치가 60억 가지 이상입니다. 이러한 장치는 대규모 엔터프라이즈급 서버로부터 지갑 속에 넣어 가지고 다니는 작은 스마트 카드에 이르기까지 광범위합니다. 자바 기술은 수십 억 개의 전화기에 내장되어 있을 뿐 아니라 전통적인 데스크톱 컴퓨터를 비롯하여 수 없이 많은 다른 장치에 내장되어 있습니다. 그림 1은 오늘날 존재하는 다양한 자바 플랫폼을 보여 줍니다.

블루레이 디스크 플레이어용 자바 플랫폼은 BD-J라고 합니다. 이 시리즈의 1부에서는 다음 항목을 살펴 보겠습니다.
- BD-J 개발에 필요한 기본 요구 사항
- BD-J 플랫폼에서 수행할 수 있는 작업
- BD-J 규격 및 API
- 블루레이 프로파일에 대한 이해
- Xlet 및 Xlet 수명 주기(lifecycle)
- 첫 번째 BD-J 애플리케이션 만들기
독자들이 Java ME 또는 비디오 콘텐츠 작성 경험이 없다고 간주하고 설명하겠습니다. 그럼 시작하겠습니다.
BD-J 표준이 Java ME 플랫폼의 일부이지만 PC에서 BD-J 애플리케이션을 재생하려면 좀 더 강력한 컴퓨터가 필요하다는 사실을 알면 놀라실 수 있을 것입니다. 다음은 PC에서 BD-J 애플리케이션을 만들고, 굽고, 재생하는 데 필요한 물리적 요구 사항 목록입니다.
- Windows Vista 또는 XP를 실행하는 데스크탑 또는 랩탑 컴퓨터. 안타깝지만 현재로서는 BD-J 개발을 위한 Mac OS나 Linux용 도구와 하드웨어는 많지 않습니다. Mac 사용자라면 가상화 소프트웨어를 사용하는 것보다 Windows에서 Bootcamp를 사용하는 것이 좋습니다. 비디오 드라이버와 디스플레이에 대한 요구 사항이 높기 때문입니다.
- 최소 256MB의 메모리가 장착된 그래픽 카드. HD 비디오를 렌더링하는 데 필요한 작업을 메인보드의 CPU가 아니라 그래픽 카드의 GPU에서 수행하기 때문에 중요한 요구 사항입니다.
- HD 비디오를 렌더링할 수 있는 비디오 디스플레이. 완전 HD 비디오 해상도는 1920x1080픽셀입니다.
- 블루레이 굽기 드라이브. 다행히 일부 드라이브는 다시 쓰기가 가능한 블루레이 디스크(BD-RE라고도 함)도 함께 제공하므로 디스크를 계속해서 반복 사용하여 애플리케이션이나 동영상을 만들 수 있습니다.
즉, 일반적인 \500,000대의 데스크탑 PC나 \1,000,000대의 랩탑에서는 BD-J 애플리케이션을 만들고 블루레이 디스크를 구울 수 있을지 모르지만 HD(고선명) 비디오에 필요한 비디오 요구 사항이 높기 때문에 블루레이 디스크를 재생할 수는 없습니다. 다행히 CyberLink Corporation에서 간편한 진단 도구를 만들어 컴퓨터에서 블루레이를 재생할 수 있는지 확인할 수 있게 되었습니다. 아래의 그림 2는 제 랩탑 중 하나에서 실행 중인 도구의 스냅샷을 보여 줍니다.

그러면 BD-J 플랫폼에서는 구체적으로 어떤 작업을 수행할 수 있을까요? 좋은 질문입니다. 그러나 BD-J 플랫폼의 기능을 살펴보기 전에 BD-J 애플리케이션을 만들 때 자주 사용하는 용어를 살펴보는 것이 좋을 것 같습니다.
- 디스크: 디스크는 HD 비디오 콘텐츠와 BD-J jar 파일이 포함된 물리적인 매체입니다.
- 타이틀: 디스크에는 하나 이상의 타이틀이 포함될 수 있습니다. 보통 사람들은 타이틀을 동영상이라고 합니다. 그러나 요리 프로그램 10회 분량이 들어 있는 블루레이 디스크를 만들려는 경우 각 회를 동영상이라고 할 수는 없습니다. 그러므로 디스크에 포함된 비디오 콘텐츠의 구성 단위를 타이틀이라고 합니다.
- 메뉴: 메뉴는 BD-J 애플리케이션의 상호 작용 부분으로, 손에 들고 다니는 리모컨의 입력에 응답합니다. 메뉴를 사용하면 타이틀을 선택하고, 타이틀의 재생을 시작하며, 디스크의 고급 옵션을 활성화하거나 비활성화할 수 있습니다.
BD-J 애플리케이션를 만들고 콘텐츠를 작성할 때 사용하는 용어를 알아보았으니 이제 BD-J 플랫폼의 기능을 살펴보겠습니다. BD-J API를 사용하면 디스플레이에 텍스트, 이미지, 애니메이션을 그릴 수 있습니다. 이런 기능을 통해 다음 작업을 수행할 수 있는 애플리케이션을 만들 수 있습니다.
- 현재 표시된 프레임에서 트리거하는 화면에 간단한 텍스트를 씁니다. 여러분이 생각하는 바와 같이 자막을 렌더링하는 데 유용합니다.
- 현재 표시된 비디오 콘텐츠 위의 디스플레이에 모양이나 이미지를 그립니다.
- 대화식 게임의 디스플레이에 이미지를 그리거나 애니메이션을 만듭니다.
- 흐리게 만들기 및 전환 같은 효과를 사용하여 애니메이션 버튼을 만듭니다.
- 사 용자가 타이틀, 장 또는 보너스 콘텐츠 같은 기타 고급 옵션을 선택할 수 있는 대화식 메뉴를 만듭니다. 실제로 그림 3은 HDcookbook 프로젝트(BD-J 개발자에게 매우 좋은 자료)에서 제공한 예제 코드에서 렌더링한 메뉴를 보여 줍니다.

뿐만 아니라 BD-J API에서는 디스크의 비디오 콘텐츠 재생을 시작할 수 있으므로 다음 중 하나를 수행할 수 있는 애플리케이션을 만들 수 있습니다.
- 메뉴 선택에 따라 타이틀 재생을 초기화합니다. 이는 가장 일반적으로 비디오를 재생하는 경우 중 하나입니다.
- "첫 번째 재생"을 초기화합니다. 그러면 디스크를 플레이어에 삽입할 때 비디오 콘텐츠를 재생할 수 있습니다.
- PiP(Picture in Picture) 렌더링을 위해 API를 사용하여 동시에 두 개의 비디오 스트림을 재생하도록 초기화합니다.
뿐 만 아니라 BD-J API를 사용하면 리모컨에서 사용자가 입력한 내용에 응답하거나, 네트워크를 통해 데이터에 액세스하거나, 블루레이 플레이어의 영구적인 로컬 저장소에 데이터를 저장할 수 있습니다. 잠깐, 블루레이 플레이어에 로컬 저장소가 있다고요? 예, 현재 시장에 출시된 플레이어는 영구적인 저장소용으로 64KB의 메모리를 갖추도록 요구되고 있습니다. 블루레이 플레이어는 데이터를 "가상 파일 시스템"에 영구적으로 저장할 수도 있지만 이에 관해서는 이 문서의 뒷부분에서 알아보겠습니다. 지금까지 살펴본 BD-J API의 이러한 기능을 사용하면 다음 작업이 가능한 애플리케이션을 만들 수도 있습니다.
- 리모컨의 입력에 따라 작업을 변경합니다.
- 블루레이 디스크 플레이어에 디스크가 있을 때 보너스 콘텐츠를 다운로드하여 특수한 기능을 재생합니다.
- 디스크 소유자가 전자 상거래 사이트에서 의류, 선물, 책 등의 품목을 안전하게 구입할 수 있습니다.
- 블루레이 디스크 플레이어에서 게임 고득점 같은 항목을 "기억"하도록 하거나 디스크의 특수한 기능이 이미 잠겨 있음을 인식할 수 있도록 합니다.
- 블 루레이 디스크 플레이어에서 디스크를 꺼낸 후에도 애플리케이션을 계속 실행하도록 할 수 있습니다. 디스크 박스 세트가 있고 애플리케이션에서 세트의 모든 디스크를 계속 실행하고 상태를 유지하도록 하려는 경우 매우 편리합니다. 매우 강력한 기능입니다.
이제 BD-J 플랫폼의 기능을 살펴보았으므로 API의 클래스를 좀 더 자세히 살펴보도록 하겠습니다.
여 러분이 생각하는 것처럼 BD-J 규격은 하루 아침에 만들어진 것이 아니고, 홈 플랫폼/소비자 가전 제품 분야에서 작동하는 다른 많은 자바 규격을 활용한 것입니다. 그림 1에서 본 것과 같이 소비자 가전 제품의 자바 플랫폼은 CDC(연결형 장치 구성)입니다. 그림 4에서는 BD-J 규격을 구성하는 API의 스택을 살펴보겠습니다.

이제 이 규격에 대해 조금 익숙해졌으므로 BD-J 전용 클래스에 대해 패키지별로 살펴보겠습니다.
org.bluray.application |
이 패키지에는 GEM/MHP 레이어에서 클래스를 확장하는 단일 클래스가 포함되어 있습니다. 디스크 삽입 및 꺼내기에 대한 이벤트 통지 프레임워크를 비롯하여 여러 가지 기능이 포함되어 있습니다. |
org.bluray.media |
이 패키지에는 블루레이 미디어 플레이어에 속한 미디어별 클래스가 포함되어 있으며 GEM/MHP 규격의 기능을 확장합니다. 이러한 클래스에는 PiP(Picture-in-Picture), 자막 및 오디오를 조절하는 메커니즘이 포함됩니다. |
org.bluray.net |
처음에는 블루레이 플레이어에서 TCP/IP 네트워크 연결을 만드는 데 필요한 모든 클래스가 이 패키지에 포함되어 있다고 생각할 것입니다. 실제로는 개인 기반 프로파일에서 제공하는 java.net 패키지에서 모든 지저분한 작업을 처리합니다. 대신 이 패키지에는 블루레이 장치의 로케이터를 정의하기 위해 Java TV API의 기능을 확장하는 단일 클래스가 포함되어 있습니다. 로케이터란 무엇일까요? 로케이터는 URL 같은 형식의 텍스트 문자열입니다. 블루레이 컨텍스트에서 로케이터는 디스크에서 타이틀을 선택하는 데 사용됩니다. |
org.bluray.storage |
이 패키지에는 블루레이 플레이어에서 저장소 여유 공간을 확인할 수 있는 클래스가 3개 포함되어 있습니다. 영구적인 저장소 영역은 모든 블루레이 플레이어에서 갖추도록 되어 있지만 가상 파일 시스템(비디오 콘텐츠 같은 대용량 데이터를 저장할 수 있음)은 모든 플레이어에서 필수가 아닙니다. |
org.bluray.system |
이 패키지에는 블루레이 플레이어의 시스템 레지스터에 액세스할 수 있는 단일 클래스가 포함되어 있습니다. |
org.bluray.ti |
이 패키지에는 디스크의 타이틀에 있는 타이틀 정보와 메타데이터를 제공하는 여러 개의 클래스가 포함되어 있습니다. |
org.bluray.ui |
이 패키지에는 개인 기반 프로파일의 java.awt 패키지에서 아직 제공하지 않는 사용자 인터페이스 기능을 추가하는 클래스가 포함되어 있습니다. 이러한 클래스를 사용하면 비디오 프레임과 동기화되는 애니메이션을 멋지게 꾸미고 실행할 수 있습니다. |
org.bluray.vfs |
이 패키지의 클래스를 사용하면 가상 파일 시스템에 데이터를 저장할 수 있습니다. 가상 파일 시스템은 모든 블루레이 플레이어에서 필수적으로 갖출 필요가 없지만 네트워크 연결을 지원하는 플레이어에는 있습니다. |
GEM 및 MHP API
BD-J 규격은 소비자 가전 제품에 자바를 사용하는 첫 번째 규격이 아닙니다. MHP(Multimedia Home Platform) 및 GEM(Globally Executable Multimedia Home Platform)의 규격은 처음에 케이블 박스와 기타 가정용 멀티미디어 장치용으로 개발되었던 API를 정의합니다. GEM 규격은 세계 표준이므로 다음과 같은 다른 소비자 전자 장치 표준으로도 사용되었습니다.
- BD-J(Blu-ray Disc Java)
- OCAP(OpenCable Applications Platform)(지금은 Tru2way라고 함)
- ACAP(Advanced Common Application Platform)
이 문서에서 설명하는 내용과는 직접적인 연관이 없으므로 GEM/MHP 플랫폼 전부를 자세히 살펴보지는 않겠습니다. 다음 목록은 BD-J 표준에 포함된 GEM/MHP API를 구성하는 자바 패키지를 보여 줍니다.
org.davic.media |
dvb.event |
dvb.test |
org.davic.net |
dvb.io |
dvb.ui |
org.davic.resources |
dvb.lang |
dvb.user |
dvb.application |
dvb.media |
havi.ui |
dvb.dsmcc |
dvb.net |
? |
Java TV 1.1 API
그림 4에서 보았듯이 전체 BD-J 표준도 Java TV API에서 제공하는 기능을 사용합니다. Java TV API는 기본 기능이나 Xlet 프레임워크(이 문서의 뒷부분에 자세히 설명함) 같은 BD-J 애플리케이션과 javax.tv.service.Service에 대한 클래스 정의를 제공합니다. 자바 사용 TV 및 셋톱 박스(케이블 수신기 및 DVR)의 경우 서비스는 채널입니다. 그러므로 예를 들어 자바 사용 DVR을 프로그래밍하여 매일 오후 4시에 채널 203으로 채널을 맞춘 다음 javax.tv.service 패키지의 클래스를 사용하여 해당 작업을 완성하는 간단한 애플리케이션을 작성할 수 있습니다. 이제 블루레이 장치에서 javax.tv.service.Service는 디스크 타이틀입니다. 다음은 Java TV API의 전체 패키지 목록입니다.
javax.tv.graphics |
javafx.tv.service |
javax.tv.locator |
javafx.tv.util |
javax.tv.media |
javafx.tv.xlet |
javax.tv.net |
|
개인 기반 프로파일, 기초 프로파일, 연결형 장치 구성 API
개 인 기반 프로파일(PBP), 기초 프로파일(FP), 연결형 장치 구성(CDC)은 모두 함께 더 높은 수준의 다른 API를 내장 전자 장치 및 소비자 전자 장치에 사용할 수 있는 기초가 됩니다. 이러한 클래스는 데스크탑 자바 프로그래머들이 이미 잘 알고 있는 익숙한 Java SE 클래스를 제공합니다. 이러한 클래스는 전체 JDK 1.6 표준(Java SE 6)과 같지는 않지만 몇 가지 사항을 제외하면 Java SE 1.3 표준과 매우 유사합니다. 이러한 클래스에는 사용자 입력에 포인팅 장치, 즉 마우스가 포함된 것으로 간주하는 JDBC, Swing, 높은 수준의 AWT 위젯이 없습니다. 이제 이 플랫폼은 Java ME(Java SE가 아니라)이므로 자바 사용 휴대폰에서도 사용할 수 있는 클래스와 동일한 javax.microedition.io 클래스에도 액세스할 수 있다는 점을 기억해야 합니다. 다음은 PBP, FP, CDC API의 클래스 목록입니다.
java.awt |
java.math |
java.text |
java.beans |
java.net |
java.util |
java.io |
java.rmi |
javax.microedition.io |
java.lang |
java.security |
javax.microedition.xlet |
시장에 출시된 플레이어에 구현된 여러 가지 버전의 블루레이 디스크 사양을 살펴보겠습니다.
첫 번째 버전의 블루레이 디스크 사양은 프로파일 1.0으로 출시되었습니다.
다 음에 출시된 것은 블루레이 디스크 프로파일 1.1로, "보너스 뷰(Bonus View)"라고도 합니다. 블루레이 프로파일 1.1에서 필요한 사양은 PiP(Picture-in-Picture)를 지원하고 최소 256MB의 데이터를 저장할 수 있도록 가상 파일 시스템을 갖추고 있어야 합니다.
최신 프로파일은 2.0으로, "블루레이-라이브(BD-Live)"라고도 합니다. 이 프로파일은 프로파일 1.1의 모든 기능을 갖추어야 하며 인터넷 연결에 필요한 기능도 갖추어야 합니다. 프로파일 2.0에서도 최소 1GB의 데이터를 저장할 수 있는 가상 파일 시스템이 필수입니다. 이제 단일 레이어 블루레이 디스크에는 25GB의 데이터가 들어가므로 프로파일 2.0 장치의 가상 파일 시스템에서 전체 동영상을 저장할 수 없습니다. 그러나 애플리케이션에서 인터넷 연결을 사용하고 몇 가지 HD 비디오 콘텐츠를 나중에 재생할 수 있도록 저장할 정도의 공간은 됩니다.
잠깐이라도 Java를 사용해본 사람은 Applet, Servlet, MIDlet에 적용되는 *let 명명 규칙을 잘 알고 있을 것입니다. 다행히도 CDC 플랫폼의 애플리케이션을 CDClet이라고 하지는 않지만 더 좋은 이름을 찾지 못했기 때문에 Xlet이라고 합니다.
BD-J 애플리케이션을 만들려면 클래스 중 적어도 하나는 Java TV API와 함께 제공되는 javax.tv.xlet.Xlet 인터페이스를 구현해야 합니다. 개인 기반 프로파일에 대해 잘 아는 경우에는 Xlet도 javax.microedition.xlet 패키지에 정의되어 있음을 알 것입니다. 그러므로 BD-J 애플리케이션을 구축할 때 실패를 최소화하려면 Java TV 패키지에서 Xlet 클래스를 가져와야 합니다.
이제 BD-J Xlet의 수명 주기(lifecycle)가 매우 간단하다는 것을 알게 되었습니다. 구성자를 호출하면 Xlet이 Loaded 상태가 됩니다. 구성자만 호출하지 않고 initXlet() 메소드도 호출합니다. 그러면 startXlet() 메소드를 호출할 때까지 Xlet이 Paused 상태가 됩니다. 아래의 그림 5에서 볼 수 있듯이 애플리케이션은 삭제도기 전까지 Paused 상태와 Active 상태 사이를 여러 번 오갈 수 있습니다. 그러므로 startXlet() 메소드에 코드를 넣으면 실제 작업을 시작하거나 다시 시작하기 전에 네트워크 연결 및 다른 중요한 리소스를 확인할 수 있기 때문에 좋습니다.

이렇게 해서 모든 예비 작업을 갖추었으므로 첫 번째 애플리케이션을 만들어 보도록 하겠습니다.
위에 표시된 예제 코드에서 모든 Xlet 수명 메소드를 구현하는 간단한 애플리케이션을 가지고 매우 간단한 작업(화면에 텍스트 쓰기)을 수행했습니다.
package test;
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;
public class FirstBDJApp implements Xlet {
private static Font font;
private HScene scene;
private Container gui;
private String text = "My first BD-J app running on the PS3!";
//private String text = "My first BD-J app running on " + System.getProperty("os.name");
public FirstBDJApp() {
}
public void initXlet(XletContext context) {
font = new Font(null, Font.PLAIN, 48);
scene = HSceneFactory.getInstance().getDefaultHScene();
gui = new Container() {
public void paint(Graphics g) {
g.setFont(font);
g.setColor(new Color(10, 10, 10));
g.fillRect(20, 20, getWidth() - 40, getHeight() - 40);
g.setColor(new Color(245, 245, 245));
int message_width = g.getFontMetrics().stringWidth(text);
g.drawString(text, (getWidth() - message_width) / 2, 500);
}
};
gui.setSize(1920, 1080);
scene.add(gui, BorderLayout.CENTER);
scene.validate();
}
public void startXlet() {
gui.setVisible(true);
scene.setVisible(true);
}
public void pauseXlet() {
gui.setVisible(false);
}
public void destroyXlet(boolean unconditional) {
scene.remove(gui);
scene = null;
}
}
|
보 는 바와 같이 높은 수준의 위젯을 사용하여 화면에 텍스트를 쓰지는 않습니다. 방금 텍스트가 차지하는 크기를 계산했고 Graphics 개체를 사용하여 디스플레이에 텍스트를 썼습니다. 그림 6은 PS3 게임 콘솔에서 애플리케이션이 어떻게 나타나는지 보여 줍니다.

이 제 애플리케이션이 완성되었습니다. 예제를 사용하여 블루레이 디스크 플레이어에서 작동하는 BD-J 애플리케이션을 만드는 방법을 처음부터 끝까지 실행해 보았습니다. BD-J API에서 볼 수 있듯이 iceberg의 팁을 맛보기로만 살짝 살펴보았습니다. 2부에서는 사용자의 개발 환경에서 BD-J 애플리케이션을 구축하는 방법에 대해 보다 자세한 내용을 살펴보겠습니다. 또한 리모컨에서 사용자가 입력한 내용에 응답하는 방법에 관한 구체적인 예제 코드를 제공할 것입니다.
이 문서를 작성하는 데 도움을 주시고, 의견을 주신 Bill Foote, Chihiro Saito, 그리고 HD Cookbook 팀에게 감사드립니다. 이 문서에 표시된 예제 코드는 대부분 Chihiro's Netbeans Plugin에서 만든 데모 애플리케이션에서 아이디어를 얻어 작성된 것입니다.
이 글의 영문 원본은
Blu-ray Disc Application Development with Java ME, Part 1: Creating
Your First Application
에서 보실 수 있습니다.
"Java ME" 카테고리의 다른 글
- PIM API 시작하기 (댓글 2개 / 트랙백 0개) 2006/02/02
- Java ME에서 JSON(JavaScript Object Notation) 사용하여... (댓글 0개 / 트랙백 0개) 2008/10/13
- 모바일 플랫폼의 비교: Java ME와 Adobe Flash Lite (댓글 0개 / 트랙백 1개) 2008/06/03
- 모바일 및 임베디드 개발자 컨퍼런스 Recap (댓글 0개 / 트랙백 0개) 2008/02/26
- NetBeans를 사용해야 하는 12가지 이유 (댓글 4개 / 트랙백 0개) 2006/08/26
- 블루투스와 GPS 사용: 1부 - 무선 직렬 포트 데이터 읽기 (댓글 0개 / 트랙백 0개) 2008/08/11
- 자바 ME 장치 매트릭스로 필터 사용 (댓글 0개 / 트랙백 0개) 2008/03/13
- Wireless Messaging API 2.0 (댓글 4개 / 트랙백 0개) 2005/12/07
- OpenGL ES와 모바일 센서 API를 이용한 게임 업계의 새로운 지평 (댓글 0개 / 트랙백 0개) 2008/05/20
- 블루투스와 GPS 사용: 제2부 - GPS 데이터 구문 분석 및 맵 렌더링 (댓글 0개 / 트랙백 0개) 2008/12/11
댓글을 달아 주세요