JMF 및 Java Media API 진행 상황

JMF (Java Media Framework)에 관한 첫 번째 JavaWorld 기사입니다. 다양한 미디어 API가 성숙 해짐에 따라 모든 것이 완전한 원형이 된 것 같습니다. 따라서 마지막 미디어 프로그래밍 칼럼을 JMF와 모든 Java 미디어 API의 일반적인 상태에 대해 설명 하겠습니다 .

JMF 및 기타 Java Media 기술, 해당 구현을 개발하는 회사 및 개발자를위한 가용성에 몇 가지 주목할만한 변경 사항이 있습니다. 이 기사는 이전 기사의 자료를 적절하게 업데이트합니다.

중요한 알림 : Java Media Framework는 멀티미디어 스트림 (파일, 네트워크 스트림 등)을 동기화하기위한 특정 API입니다. Java 2D, Java 3D, Java Speech 등을 포함하는 여러 Java Media API 중 하나입니다. Java Media Framework를 JMF라고 하며 전체 멀티미디어 API 컬렉션에 대해 Java Media 라는 용어 를 사용합니다.

JMF의 역사와 기초

JMF 1.0 (Java Media Player API)에 대해 1997 년 4 월에 다음을 작성했습니다 (참고 자료 참조).

JMF (Java Media Framework)의 일부인 Java Media Player API를 사용하면 Java 프로그래머가 애플릿 및 응용 프로그램 내에 오디오와 비디오를 쉽게 포함 할 수 있습니다. 모든 유효한 URL에서 정적 및 스트리밍 멀티미디어가 모두 지원됩니다. JMF 플레이어는 다른 플레이어가 제어 할 수 있으며 여러 오디오 및 비디오 샘플의 동시 재생을 제공합니다.

이 정보는 지난 2 년 동안의 업데이트 및 추가 사항에도 여전히 적용됩니다. 그러나 JMF는 특히 다가오는 2.0 API 릴리스 (1999 년 하반기 예정)를 통해 새로운 기능을 발전시키고 범위를 확장했습니다.

JMF 업계 선수

먼저 업계 플레이어를 살펴 보겠습니다. Sun, Silicon Graphics (SGI) 및 Intel은 1998 년 중반에 원래 JMF 1.0을 설계하고 지정했습니다. API의 초기 버전 이후 중간에 SGI와 Intel은 JMF 사양 프로세스에서 탈퇴했습니다. 한동안 JMF 사용자 커뮤니티에서는 Sun이 JMF를 지원하는 유일한 공급 업체라는 심각한 우려가있었습니다. 이 상황은 바람직하지 않았습니다.

다행스럽게도 1998 년 말 IBM은 JMF에 관심을 갖게되었습니다. IBM이 Sun에 합류 한 직후 1.0 API의 모든 Java 구현이 릴리스되었습니다 (1998 년 12 월). Java 플랫폼 용 JMF 1.1로 알려진이 구현은 Win32 및 Solaris 네이티브 JMF 1.1 구현 ( 성능 팩으로 알려진). 모든 Java JMF 1.1의 가용성은 모든 Java 1.1 호환 또는 Java 2 런타임에서이 기술을 사용할 수 있다는 점에서 JMF의 주요 이정표였습니다. 실제로 JMF 1.1 Java 구현은 개발자가 JMF 애플릿과 함께 다운로드 할 수 있도록 JAR 파일에 관련 JMF 클래스 만 포함 할 수있는 도구를 사용하여 웹 지향 버전에서도 사용할 수 있습니다. 이를 통해 Java 1.1 호환 브라우저에서 사용할 수 있도록 웹 서버에 JMF 기반 애플릿을 배포 할 수 있습니다. Netscape와 Microsoft는 모두 Navigator 및 Internet Explorer의 최신 브라우저 릴리스에서 각각 Java 1.1 (Java 용 JMF 1.1)을 지원합니다.

IBM은 Sun이 사양을 포함하고 다음 JMF API 인 Java Media Capture의 참조 구현을 제공 할 JMF 2.0 API를 코드화하도록 지원하고 있습니다. IBM이 나중에 JMF 기능을 비즈니스 지향 Java 기반 소프트웨어 제품 중 일부에 롤링하는 방법을 알아 내길 바랍니다. 이는 JMF 기술의 수명에 잠재적으로 좋은 일입니다.

JMF 2.0과 1.0의 새로운 점은 무엇입니까?

JMF 1.0 API는 동기화 된 오디오 및 비디오의 재생을 처리하는 데 필요한 구성 요소를 지정합니다. JMF 1.0의 기능을 검토하려면 이전 JMF 기사 (참고 자료 참조)를 참조하십시오.

JMF 2.0은 사양에 몇 가지 주요 추가 기능을 제공합니다.

  • 오디오 및 비디오 캡처
  • 오디오 및 비디오 스트리밍 및 클라이언트 외에 모든 Java 스트리밍 서버 구축 가능성
  • 플레이어 내에서 플러그 가능한 코덱 지원

JMF 2.0 및 새로운 기능에 대한 자세한 내용은 현재 버전 0.5 얼리 액세스로 제공되는 Java Media Framework Programmer 's Guide (참고 자료 참조)를 참조하십시오.

JMF 개발 도구 및 런타임 설치

Silicon Graphics와 Intel은 모두 해당 웹 사이트에서 이전 버전의 JMF를 제거했습니다. 그러나 Sun 사이트 (참고 자료 참조)에서 Win32, Solaris 및 Java 플랫폼 용 최신 참조 구현 (JMF 1.1, 1.0 API 사양 준수)을 다운로드 할 수 있습니다.

모든 Java 버전에 대한 문서에는 특별히 AIX가 언급되어 있으며 이는 IBM이 AIX Java 런타임에서이 소프트웨어를 테스트하고 있음을 나타냅니다. JMF (2.0 이상)의 향후 릴리스는 순수 Java 구현 또는 OS 별 고유 구현을 통해 IBM 운영 환경을 특별히 지원할 것으로 기대합니다.

업데이트 된 JMF 예제

JMF 1.0 API 호환 환경에서 실행되도록 이전 JMF 기사의 JMF 1.0 베타 호환 예제를 업데이트했습니다. 예제 코드를 다운로드하고 자신의 미디어 파일을 사용하여 JMF 1.1 구현에서 사용해 볼 수 있습니다. 애플릿은 JMF 2.0 런타임이 사용 가능 해지면 실행되어야합니다. (이 기사와 관련된 모든 파일을 zip 형식으로 다운로드하려면 참고 자료를 참조하십시오.)

001 // 다음 패키지 문을 주석 처리하여 별도로 컴파일합니다. 002 // 패키지 com.javaworld.media.jmf; 003004 import java.applet. *; 005 import java.awt. *; 006 import java.net. *; 007 import java.io. *; 008 import javax.media. *; 009010 / ** 011 * JMF11Applet은 1997 년 4 월부터 JMFApplet을 업데이트합니다. 012 * JMF 1.1 API 호환을위한 JavaWorld 기사. 013 * 다음에서 기사를 참조하십시오.

014 * //www.javaworld.com/jw-04-1997/jw-04-jmf.html 015 *

016 * 또한 JMF11Applet은 017 * Java 1.1 (이상) 이벤트 모델을 사용하도록 재 작업되었습니다. 이 018 * 버전은 Java 2 019 * 및 JMF 1.1 전체 Java 구현, 1999 년 5 월에서 개발 및 테스트되었습니다. 020 *

021 *이 애플릿은 웹 서버 다운로드를 위해 JMF 1.1 023 *에 제공된 jmf-server.jar를 사용하여 공용 웹 서버 022 *에 배포 할 수 있습니다. 이 JAR 아카이브에는 024 * 필수 JMF all-Java 런타임 클래스가 포함되어 있습니다. JMF11Applet 025 *는 1999 년 6 월 026 * 칼럼에 대해 다음과 같은 방식으로 배포되었습니다.

027 * //www.javaworld.com/jw-06-1999/jw-06-media.html 028 * 029 * @author Bill Day 030 * @version 1.1 031 * @see javax.media.ControllerEvent 032 * @see javax .media.ControllerListener 033 * @see javax.media.Manager 034 * @see javax.media.NoPlayerException 035 * @see javax.media.Player 036 * @see javax.media.RealizeCompleteEvent 037 ** / 038039 public class JMF11Applet extends 애플릿은 ControllerListener {040 private URL myURL = null; 041 개인 플레이어 myPlayer = null; 042 개인 구성 요소 myVisual = null; 043 개인 구성 요소 myControls = null; 044 개인 패널 visualPanel = null; 045046 / ** 047 * JMF11Applet을 초기화합니다. 인터페이스를 레이아웃하고 048 * init ()에서 플레이어를 만듭니다. 049 ** / 050 public void init () {051 super.init (); 052 053 // AWT 레이아웃 관리자를 지정합니다. 054 setLayout (새 BorderLayout ());055 056 // 웹 페이지에서 URL로드 JMF11Applet이 내장되어 있습니다. 057 String asset = getParameter ( "ASSET"); 058 059 // URL을 확인하고 보관할 URL 개체를 만듭니다. 060 if (asset.equals ( "")) {061 // 애플릿에 자산을 입력하지 않았습니다. 062} else {063 시도 {064 myURL = new URL (getDocumentBase (), asset); 065} catch (MalformedURLException e) {066 // 불완전한 자산을 입력했거나 잘못된 URL을 작성했습니다. 067 // 더 강력한 애플릿이이를 적절하게 처리해야합니다. 068} 069} 070 try {071 // 흥미로운 부분이 있습니다. 관리자는 072 //이 URL에 대한 실제 플레이어를 만드는 데 사용됩니다. 그런 다음 073 // JMF11Applet을 myPlayer의 ControllerListener로 추가합니다. 074 // 이렇게하면 RealizeCompleteEvents에 응답 할 수 있습니다. 075 myPlayer = 관리자 .createPlayer (myURL); 076 myPlayer.addControllerListener (이것)077} catch (IOException e) {078 // I / O에 문제 발생; 출구. 079 System.out.println ( "플레이어 생성을 시도하는 I / O 문제 ... 종료"); 080 시스템 .exit (1); 081} catch (NoPlayerException e) {082 // 사용 가능한 플레이어를 반환 할 수 없음; 출구. 083 System.out.println ( "사용할 수있는 플레이어가 반환되지 않았습니다 ... 종료"); 084 시스템 .exit (1) 085} 086} 087 088 / ** 089 * Player의 090 * fulfill ()를 호출하도록 기본 애플릿 시작 메서드를 재정의합니다. 이것은 먼저 실현을 수행하고 091 *은 controllerUpdate () 092 * 메소드에서 GUI 빌드의 마지막 비트를 트리거합니다. 자동으로 재생을 시작하지 않습니다. 사용자는 094 * 미디어 샘플 재생을 시작하기 위해 애플릿에서 "재생"버튼을 클릭해야합니다. 095 ** / 096 public void start () {097 myPlayer.realize ();098} 099 100 101 / ** 102 * myPlayer.stop () 103 * 및 myPlayer.deallocate ()를 호출하도록 기본 애플릿 중지 메서드를 재정 의하여 누군가 브라우저에서이 페이지를 종료하는 경우 리소스 104 *를 적절하게 확보하도록합니다. 105 ** / 106 public void stop () {107 myPlayer.stop (); 108 myPlayer.deallocate (); 109} 110 111 / ** 112 * 실현 완료 시점을 알아야하므로 113 * controllerUpdate ()를 사용하여 RealizeCompleteEvents를 처리합니다. 114 * 우리가 RealizeCompleteEvent를 받으면, 115 *를 레이아웃하고 116 * 애플릿 GUI에 비디오 컴포넌트와 컨트롤을 표시합니다. 117 ** / 118 public void controllerUpdate (ControllerEvent event) {119 if (RealizeCompleteEvent의 이벤트 인스턴스) {120 //System.out.println("Received RCE ... "); 121 // 이제 Realized 플레이어가 있습니다.122 // VisualComponent 및 ControlPanelComponent를 가져 와서 123 // 애플릿에 넣을 수 있습니다. 124 화 125 if (myVisual! = null) {126 // VisualComponent 127 //의 크기가 BorderLayout에 의해 조정되지 않도록 // FlowLayout을 사용하여 visualPanel 내에 중첩합니다. 129 화 130 visualPanel.setLayout (new FlowLayout ()); 131 화 132 화 133 //System.out.println("VisualComponent 추가 ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println ( "컨트롤 추가 ..."); 139} 140 // 무효화 (); 141 화 142} 143 // 그렇지 않으면 단순히 이벤트를 소비합니다. 144} 145}124 화 125 if (myVisual! = null) {126 // VisualComponent 127 //의 크기가 BorderLayout에 의해 조정되지 않도록하기 위해 FlowLayout을 사용하여 VisualPanel에 // 중첩합니다. 129 화 130 visualPanel.setLayout (new FlowLayout ()); 131 화 132 화 133 //System.out.println("VisualComponent 추가 ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println ( "컨트롤 추가 ..."); 139} 140 // 무효화 (); 141 화 142} 143 // 그렇지 않으면 단순히 이벤트를 소비합니다. 144} 145}124 화 125 if (myVisual! = null) {126 // VisualComponent 127 //의 크기가 BorderLayout에 의해 조정되지 않도록 // FlowLayout을 사용하여 visualPanel 내에 중첩합니다. 129 화 130 visualPanel.setLayout (new FlowLayout ()); 131 화 132 화 133 //System.out.println("VisualComponent 추가 ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println ( "컨트롤 추가 ..."); 139} 140 // 무효화 (); 141 화 142} 143 // 그렇지 않으면 단순히 이벤트를 소비합니다. 144} 145}= null) {126 // VisualComponent 127이 BorderLayout에 의해 // 크기가 조정되지 않도록 // FlowLayout을 사용하여 visualPanel 내에 중첩합니다. 129 화 130 visualPanel.setLayout (new FlowLayout ()); 131 화 132 화 133 //System.out.println("VisualComponent 추가 ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println ( "컨트롤 추가 ..."); 139} 140 // 무효화 (); 141 화 142} 143 // 그렇지 않으면 단순히 이벤트를 소비합니다. 144} 145}= null) {126 // VisualComponent 127이 BorderLayout에 의해 // 크기가 조정되지 않도록 // FlowLayout을 사용하여 visualPanel 내에 중첩합니다. 129 화 130 visualPanel.setLayout (new FlowLayout ()); 131 화 132 화 133 //System.out.println("VisualComponent 추가 ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println ( "컨트롤 추가 ..."); 139} 140 // 무효화 (); 141 화 142} 143 // 그렇지 않으면 단순히 이벤트를 소비합니다. 144} 145}133 //System.out.println("VisualComponent 추가 ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println ( "컨트롤 추가 ..."); 139} 140 // 무효화 (); 141 화 142} 143 // 그렇지 않으면 단순히 이벤트를 소비합니다. 144} 145}133 //System.out.println("VisualComponent 추가 ... "); 134} 135 myControls = myPlayer.getControlPanelComponent (); 136 if (myControls! = null) {137 add (myControls, BorderLayout.SOUTH); 138 //System.out.println ( "컨트롤 추가 ..."); 139} 140 // 무효화 (); 141 화 142} 143 // 그렇지 않으면 단순히 이벤트를 소비합니다. 144} 145}

간단한 예제 HTML 문서 인 example.html (여기를 클릭하여 지금 브라우저에서 시도 할 수 있음)을 포함하여 자신의 웹 페이지에 애플릿을 임베드하는 방법을 보여줍니다. ASSET태그 의 미디어 파일을 변경하기 만하면 됩니다!

이 예제에서는 JMF 1.1 for Web Servers 다운로드 (JMF 웹 사이트에 문서화 됨)를 사용 하여 필요한 JMF 런타임 클래스가 포함 된 코드 아카이브 인 JMF11Applet을 자동으로 다운로드 할 수 있도록 했습니다 jmf-server.jar. 이를 통해 최종 사용자가 설치할 소프트웨어없이 모든 Java 1.1 호환 브라우저 내에서 애플릿을 실행할 수 있습니다. (웹 서버용 JMF 버전에는 JMFCustomizerJMF JAR 파일에서 더 많은 불필요한 클래스를 제거 할 수 있는 사용자 정의 도구도 포함되어 있습니다 . 그러나이 도구는 현재 Java 2에서 작동하지 않습니다. Swing의 패키지 이름.)

example.html에 포함 된 특정 예제에서 WAV 파일 (welcome.wav)을로드하고 사용할 수있는 적절한 제어 구성 요소를 확인하고 (음성 전용 미디어 파일이므로 비디오 구성 요소 없음) 멀티미디어를 재생합니다. 파일. WAV 파일 (600KB) 및 JMF 클래스 (570KB)는 연결 속도에 따라 시스템에 다운로드하는 데 몇 분 정도 걸릴 수 있습니다.

예제 페이지를 구문 분석 한 후 Java 1.1 호환 브라우저는 JavaWorld 웹 서버 에서 자동으로 애플릿을로드하고 JMF 클래스를 지원해야 합니다. 애플릿이로드되고 실행되면 재생 버튼을 눌러 WAV 사운드 파일의 재생을 시작할 수 있습니다. 스크롤바를 사용하여 재생 위치를 변경하고 일시 중지 / 재생 버튼을 사용하여 재생을 일시 중지했다가 다시 시작해보십시오.

JMF 1.1 Java 플랫폼 구현은 제어에 대해 모든 Java 위젯을 사용하므로 제어는 브라우저에서 브라우저로, 플랫폼에서 플랫폼으로 동일한 모양을 갖습니다. 애플릿이 Solaris 7의 Netscape Communicator JVM과 Win32의 Internet Explorer에있는 Microsoft의 JVM에서 어떻게 실행되는지 확인하십시오.

i 레이블이 붙은 단추 는 JMF 애플릿에서 재생되는 미디어 파일에 대한 정보를 제공합니다. 이 웹 페이지에서 실행되는 WAV 파일에 대한 자세한 내용을 보려면이 정보 링크를 클릭하십시오.