Module  javafx.media

Package javafx.scene.media

提供用于将音频和视频集成到Java FX应用程序中的一组类。 此软件包的主要用途是媒体播放。 有媒体包三个主要类别: MediaMediaPlayer ,并MediaView

内容

  1. Supported Media Types
  2. Supported Protocols
  3. Supported Metadata Tags
  4. Playing Media in Java FX

支持的媒体类型

Java FX支持多种不同的媒体类型。 媒体类型被认为是容器格式和一个或多个编码的组合。 在某些情况下,容器格式可能只是包含编码数据的基本流。

支持的编码类型

编码类型指定如何存储采样的音频或视频数据。 通常编码类型意味着特定的压缩算法。 下表列出了Java FX Media支持的编码类型。

Media Encoding Table Encoding Type Description AAC Audio Advanced Audio Coding audio compression MP3 Audio Raw MPEG-1, 2, and 2.5 audio; layers I, II, and III; all supported combinations of sampling frequencies and bit rates. Note: File must contain at least 3 MP3 frames. PCM Audio Uncompressed, raw audio samples H.264/AVC Video H.264/MPEG-4 Part 10 / AVC (Advanced Video Coding) video compression VP6 (*) Video On2 VP6 video compression


(*)自JDK 9起,VP6视频编码已被弃用。

支持的容器类型

容器类型指定用于存储编码音频,视频和其他媒体数据的文件格式。 每个容器类型与一个或多个MIME类型,文件扩展名和文件签名(文件中的初始字节)相关联。 下表显示了Java FX Media支持的容器和编码类型的组合。

Media Container / Encoding Types Table Container Description Video Encoding Audio Encoding MIME Type File Extension AIFF Audio Interchange File Format N/A PCM audio/x-aiff .aif, .aiff FXM, FLV (*) FX Media, Flash Video VP6 MP3 video/x-javafx, video/x-flv .fxm, .flv HLS (**) MP2T HTTP Live Streaming (audiovisual) H.264/AVC AAC application/vnd.apple.mpegurl, audio/mpegurl .m3u8 HLS (**) MP3 HTTP Live Streaming (audio-only) N/A MP3 application/vnd.apple.mpegurl, audio/mpegurl .m3u8 MP3 MPEG-1, 2, 2.5 raw audio stream possibly with ID3 metadata v2.3 or v2.4 N/A MP3 audio/mpeg .mp3 MP4 MPEG-4 Part 14 H.264/AVC AAC video/mp4, audio/x-m4a, video/x-m4v .mp4, .m4a, .m4v WAV Waveform Audio Format N/A PCM audio/x-wav .wav

(*)自JDK 9起,FXM和FLV容器已弃用。
(**)HLS是一个协议而不是一个容器类型,但是这里包含了类似的属性。

支持的协议

Supported Protocols Table Protocol Description Reference FILE Protocol for URI representation of local files java.net.URI HTTP Hypertext transfer protocol for representation of remote files java.net.URI HTTPS Hypertext transfer protocol secure for representation of remote files java.net.URI JAR Representation of media entries in files accessible via the FILE, HTTP or HTTPS protocols java.net.JarURLConnection HTTP Live Streaming (HLS) Playlist-based media streaming via HTTP or HTTPS Internet-Draft: HTTP Live Streaming

通过HTTP播放MPEG-4

建议通过HTTP或HTTPS进行播放的MPEG-4媒体进行格式化,以使解码流所需的标头显示在文件的开头。 否则播放可能会停止,直到整个文件被下载。

HTTP直播(HLS)

HLS播放处理具有以下特征的源:

  • 按需播放列表和现场播放列表。
  • 基本MP3音频流(音频/ mpegurl)和复用MP2T流(应用程序/ vnd.apple.mpegurl)与一个AAC音频和一个H.264 / AVC视频轨道。
  • 整数或浮动时间的播放列表。

不符合此基本资料的来源不能保证被处理。 播放列表包含关于包括源的流的信息,并且在回放开始时被下载。 根据网络条件自动处理备用流,比特率和视频分辨率之间的切换。

支持的元数据标签

媒体容器还可以包括描述文件中的媒体的某些元数据。 Java FX Media API通过Media.getMetadata()方法使元数据可用。 该映射中的键被称为标签 ,下表列出了Java FX Media支持的标签。 请注意,给定媒体源可用的标签取决于实际存储在该源中的元数据,即,并非所有标签都可用。 "Metadata Keys and Tags Table Container Tag (type String) Type Description FXM, FLV audio codec java.lang.String The encoder used for the audio track. FXM, FLV duration javafx.util.Duration The duration of the media. FXM, FLV video codec java.lang.String The encoder used for the video track. FXM, FLV width java.lang.Integer The width in pixels of the video track. FXM, FLV height java.lang.Integer The height in pixels of the video track. FXM, FLV framerate java.lang.Double The video frame rate in frames per second. FXM, FLV creationdate java.lang.String The date when the video was created. FXM, FLV, MP3 raw metadata Map<String,ByteBuffer> The raw metadata according to the appropriate media specification. The key "ID3" maps to MP3 ID3v2 metadata and "FLV" to the FLV onMetadata marker content. MP3 album artist java.lang.String The artist for the overall album, possibly "Various Artists" for compilations. MP3 album java.lang.String The name of the album. MP3 artist java.lang.String The artist of the track. MP3 comment-N java.lang.String A comment where N is a 0-relative index. Comment format: ContentDescription[lng]=Comment MP3 composer java.lang.String The composer of the track. MP3 year java.lang.Integer The year the track was recorded. MP3 disc count java.lang.Integer The number of discs in the album. MP3 disc number java.lang.Integer The 1-relative index of the disc on which this track appears. MP3 duration javafx.util.Duration The duration of the track. MP3 genre java.lang.String The genre of the track, for example, "Classical," "Darkwave," or "Jazz." MP3 image javafx.scene.image.Image The album cover. MP3 title java.lang.String The name of the track. MP3 track count java.lang.Integer The number of tracks on the album. MP3 track number java.lang.Integer The 1-relative index of this track on the disc.

在Java FX中播放媒体

基本播放

在Java FX中播放媒体所需的基本步骤是:

  1. 为所需的媒体源创建一个Media对象。
  2. 创建MediaPlayer从对象Media对象。
  3. 创建一个MediaView对象。
  4. MediaPlayer添加到MediaView
  5. MediaView添加到场景图。
  6. 调用MediaPlayer.play()
上述步骤由MediaView类文档中的示例代码说明。 应该注意的一些事情是:
  • 一个Media对象可以在多个MediaPlayer之间共享。
  • 一个MediaPlayer可以共享MediaView multiple MediaView s。
  • 媒体可以由MediaPlayer直接播放,而不需要创建MediaView尽管需要显示视图。
  • 取而代之的MediaPlayer.play()MediaPlayer.setAutoPlay(true)可用于要求打尽快启动。
  • MediaPlayer具有MediaPlayer.Status定义的几个操作状态。
  • 可以使用AudioClip播放音频媒体(推荐用于短片段的低延迟播放)。

错误处理

使用Java FX Media的错误可能是同步或异步的。 一般来说,同步错误将自动显示为Java 异常 ,异步错误将导致设置Java FX属性。 在后一种情况下,可能会直接观察到error属性,注册了onError回调,或者可能两者。

同步错误的主要来源是Media()MediaPlayer() 异步错误属性是Media.errorMediaPlayer.error ,和异步错误回调Media.onErrorMediaPlayer.onError ,和MediaView.onError

某些错误可能会重复。 例如,一个MediaPlayer将传播一个与其相关联的Media遇到的错误,以及一个MediaPlayer到其所有相关联的MediaView的错误。 因此,根据监视哪些属性,有可能接收到给定错误发生的多个通知。

以下代码片段说明了使用介质进行的错误处理:

   String source; Media media; MediaPlayer mediaPlayer; MediaView mediaView; try { media = new Media(source); if (media.getError() == null) { media.setOnError(new Runnable() { public void run() { // Handle asynchronous error in Media object. } }); try { mediaPlayer = new MediaPlayer(media); if (mediaPlayer.getError() == null) { mediaPlayer.setOnError(new Runnable() { public void run() { // Handle asynchronous error in MediaPlayer object. } }); mediaView = new MediaView(mediaPlayer); mediaView.setOnError(new EventHandler<MediaErrorEvent>() { public void handle(MediaErrorEvent t) { // Handle asynchronous error in MediaView. } }); } else { // Handle synchronous error creating MediaPlayer. } } catch (Exception mediaPlayerException) { // Handle exception in MediaPlayer constructor. } } else { // Handle synchronous error creating Media. } } catch (Exception mediaException) { // Handle exception in Media constructor. }