Java多媒体应用开发

作者:金良([email protected]) csdn博客:http://blog.csdn.net/u012176591

Java多媒体应用开发_第1张图片

1.环境搭建

1.下载可在多个平台下使用的jmf开发用的jar包:

去Oracle,下载jar包,如下图:


下载红色方框内的压缩文件,解压得到4个jar包:jmf.jar,mediaplayer.jar,multiplayer.jar和customizer.jar

Java多媒体应用开发_第2张图片

把它们引入Eclipse的JMF开发项目,就可以进行JMF开发了:



程序运行如下:


工程项目和jar包,视频文件的连接http://download.csdn.net/detail/u012176591/7453299

2.支持的格式:

JMF支持的视频格式:http://www.oracle.com/technetwork/java/javase/formats-138492.html

Java多媒体应用开发_第3张图片Java多媒体应用开发_第4张图片Java多媒体应用开发_第5张图片


3.关于格式

查看格式信息(主要是视频和音频的编码格式)的软件可以用 MediaInfo ,视频的格式信息如下图
Java多媒体应用开发_第6张图片

从上图可以看到该视频的格式,对比第2部分的表格我们可以知道JMF是不支持此格式的。要想让JMF播放此视频,我们用 格式工厂 来转换此视频的格式。格式工厂有设置目的视频的编码的选项。如下图:
Java多媒体应用开发_第7张图片

我们把原来的视频转换成AVI格式,其中视频编码格式是MJPEG,音频编码格式是PCM。
转换成功后,就可以用JMF进行播放了,如下:


分割视频(用的软件是 UltraVideoSplitterPortable ),这个软件有个优点是能够绝对按时间平均来分割视频,缺点是对格式要求高:
Java多媒体应用开发_第8张图片
另外一个视频分割软件是SplitIt,与UltraVideoSplitterPortable相比,它对格式要求低,但是不能很好地按时间来均匀分割视频。


狸猫全能视频转换器 可以转换视频,还可以设置视频长宽比、码率和帧率等。下面是截图:
Java多媒体应用开发_第9张图片

Java多媒体应用开发_第10张图片

视频剪切合并器 可以合并视频
Java多媒体应用开发_第11张图片
其实更好的视频合并器是 格式工厂 ,该软件能够支持设置合并后的影音文件的多种格式。



对于MKV等格式,里面可能内嵌了若干套字幕和配音,用 MKVMERGE 软件可以删除某些字幕和配音:
Java多媒体应用开发_第12张图片

JMF常见问题:

问:什么是 Java Media Framework API (JMF)?

Java Media Framework API (JMF) 为在 Java 应用程序和小程序中同步并控制音频、视频和其他基于时间的数据指定了一个简单、统一的架构。

对于此常见问题解答来说,“JMF”或“JMF API”指 Sun 提供的规范(如通过 javadoc 生成)以及随规范一起提供的参考实现。

JMF 1.0 API 指定播放行为,由 Sun Microsystems, Inc.、Silicon Graphics Inc. 和 Intel Corporation 共同开发。

JMF 2.0 API 指定播放、捕获、传输和代码转换行为,由 Sun Microsystems, Inc. 和 IBM 共同开发;这两家公司合作推出 JMF 2.0 参考实现。

问:什么是 JMF 1.0?

JMF API 是分阶段开发的。JMF 1.0 又称为“Java Media Player”,是 JMF API 的第一个版本,专注于媒体“播放”,即同步、控制、处理和播放压缩的流和存储的基于时间的媒体(如音频、视频和 MIDI)。

Sun 针对 Windows 和 Solaris 发布了两种 JMF 1.0 参考实现。

问:什么是 JMF 1.1?

这是一个次要版本,新增了完全采用 Java 编程语言编写的两个 JMF 版本,允许 JMF 用于所有 JDK 1.1 Java 兼容系统。

注意这不是新的 API 版本;针对 Sun Microsystems, Inc. 提供的 JMF 1.0 和 1.1 实现使用相同的 JMF 1.0 API。

问:什么是 JMF 2.0?

JMF 2.0 是 JMF API 的第二个版本。其中 JMF 1.0 和 1.1 为基于时间的媒体提供通用播放器,JMF 2.0 包括媒体捕获、流式传输、代码转换、可插拔编解码器架构以及对媒体数据的更广泛控制,以便开发人员可以进行更大程度的自定义和优化。

Sun 和 IBM 合作定义 API 并发布三种 JMF 2.0 示例实现:一种完全采用 Java 编程语言编写,另两种是针对 Solaris/SPARC 和 Windows 的优化版本。

问:什么是 JMF 2.1?

这是一个次要版本,增加了 SunRay 和 Linux 支持,增加了对基于 RTP 的开放标准视频服务器(如Apple 的 Quicktime 流服务器)以及多个错误修复和优化的支持。

注意这不是新的 API 版本;针对 Sun Microsystems, Inc. 提供的 JMF 2.0 和 2.1 实现使用相同的 JMF 2.0 API。

问:什么是 JMF 2.1.1?

这是一个 build 版本,包含新特性和优化,包括:

  • 改进的 RTP API
  • 支持 H.263/1998 (RFC 2429) — 现在可以与基于 Darwin 的 RTSP 服务器互操作。
  • 直接音频输出程序和捕获器
  • 通过新的 Java 编译器实现性能增强
  • 向所有 JMF 版本中添加了 JMF 定制器
  • HTTPS、JAWT、UNC 路径名支持
  • 多个错误修复和优化

注意 JMF 2.0 API 稍有更新以包括改进的 RTP 接口,但仍然向后兼容旧 API。它依旧称为 JMF 2.0 API,但日期标为 2001 年 3 月 10 日。JMF 2.1.1 参考实现基于这一新的 API。

问:如何提供有关 JMF 2.0 API 的反馈?

这个单向电子邮箱直接转至 JMF API 设计人员。

注意 JMF 2.0 API 已被冻结。我们仍然欢迎您提供反馈,并在制定未来 JMF API 规范时考虑反馈。

问:如何获得 JMF 源代码?

根据 Sun 社区源代码许可 (SCSL) 计划提供 JMF 源代码;下面概述如何使用源代码。

对于非商业用途:

SCSL 允许针对非商业、评估和/或研究用途发布源代码。SCSL 就像开源模型那样创建了广泛使用的软件源代码社区,但按照我们的许可要求,有两个明显不同之处,如下所示:

  • 要求已部署的软件版本之间具有兼容性,并通过测试得以增强
  • 允许进行专有修改和扩展,包括性能改进

如果客户想要随后使用 JMF 源代码发布商业产品,则必须与 Sun 签署 SCSL 商业用途附件(参见下面内容)。

对于商业或内部部署用途:

如果客户想要准许 JMF 源代码用于商业产品,则必须与 Sun 签署 SCSL 商业用途附件。此许可将要求客户准许 JMF Base Porting Kit (BPK),它包括 JMF Technology Compatibility Kit (TCK)。客户必须同意针对 JMF 通过所有 TCK 测试,然后再推出商业产品。

BPK 包括:

  • 对 Test Compatibility Kit (TCK) 的访问
  • 临时代码完成
  • Java 合作伙伴网站访问

问:JMF 主页在哪里?

可以从主页下载 JMF 软件和文档,网址为http://java.sun.com/javase/technologies/desktop/media/jmf

问:在哪里可以提出有关 JMF 的问题?

可以将有关 JMF 的问题以电子邮件形式发送至 [email protected]

通过这一通用的公共电子邮件论坛,JMF 开发人员可以解答问题并帮助其他开发人员了解 JMF。

问:如何报告 JMF 错误?

报告 JMF 错误

这个单向电子邮箱直接转至 JMF 开发人员。请在报告中包括有关所发现错误的更多信息,包括

  • JMF 版本(如 JMF 1.1 或 JMF 2.1.1)
  • JDK 版本(如 JDK 1.1.6 或 J2SE 1.3 版)
  • 运行平台(如 Win 98 或 Solaris 2.6)
  • 硬件信息(如 PII、266 Mhz、64 MB RAM、Rave 500 声卡)
  • 任何异常堆栈跟踪(如果生成)
  • 提供媒体 URL,或导致问题的实际媒体数据(如果小于 2 MB)

远程调试问题会非常棘手,因此您可以发送的任何信息都将很有帮助。

问:有 JMF 相关图书吗?

有。下面是我们知道的图书。

Java - How to Program, 4th ed.(包括 JMF 2.0 和 Java Sound)

作者:Deitel 和 Deitel
由 Prentice Hall 出版
ISBN 0-13-034151-7

Core Java Media Framework(包括 JMF 1.0)

作者:Linden deCarmo
由 Prentice Hall 出版
ISBN 0130115193

Essential JMF:Java Media Framework(包括 JMF 1.0)

作者:Gordon 和 Talley
由 Prentice Hall 出版
ISBN 0130801046

Programming with the Java Media Framework(包括 JMF 1.0)

作者:Sullivan、Winzeler、Deagen 和 Brown
由 John Wiley and Sons 出版
ISBN 0471251690

如果您知道未在此列表中的图书,请告知我们,以便将其添加在此列表中。填写 JMF 反馈表单

问:Java Sound API 如何与 JMF 相关?

JMF 使用 Java Sound API 播放声音。此 API 将在 J2SE 1.3 中成为核心 API。它还与 JMF 捆绑在一起,这允许在 JDK 1.1.x 平台上提供卓越的声音功能。

可以在 http://java.sun.com/products/java-media/sound 中找到有关 Java Sound API 的更多信息

JMF 2.1.1 问题和解答

问:在哪里可以找到 JMF 2.1.1?

可以从 http://java.sun.com/javase/technologies/desktop/media/jmf 下载 JMF 2.1.1

问:JMF 2.1.1 与 JMF 1.1 有何不同?

JMF 1.1 API 软件专注于媒体播放,并针对 Java、Windows 和 Solaris/SPARC 平台发布了参考实现。

JMF 2.1.1 API 软件添加了对捕获、传输(流)和代码转换(从一种媒体格式更改为另一种格式)的支持,并且还添加了新编解码器和新插件架构,可通过此架构将新编解码器和结果轻松集成到框架中。它还针对 Java、Windows 和 Solaris/SPARC 平台发布,并且也可用于 Blackdown.org 提供的 Linux。

问:JMF 2.1.1 支持哪些媒体类型?

JMF 2.1.1 支持各种媒体类型,包括

  • 协议:FILE、HTTP、FTP、RTP
  • 音频:AIFF、AU、AVI、GSM、MIDI、MP2、MP3*、QT、RMF、WAV
  • 视频:AVI、MPEG-1、QT、H.261、H.263
  • 其他:HotMedia

*MP3 仅在 Windows 平台上受支持。

有关一组完整的格式,请查看:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/formats.html

问:可以使用 JMF 2.1.1 播放 CD 或 DVD 吗?

不可以。JMF 2.1.1 不支持音频 CD 或 DVD 播放。

您可以通过一种不受支持的方法来使用 Windows 性能包版本的 JMF 2.1.1 播放音频 CD!假设您的 CD-ROM 驱动器映射到 E:,可以使用 URL“file:/E:/Track01.cda”等播放 CD 曲目。

问:可以使用 JMF 2.1.1 在小程序中播放电影吗?

可以。您可以使用 jmf.jar 文件中包括的 SimplePlayerApplet 或编写自己的小程序。请参见SimplePlayerApplet。 
 

问:JMF 2.1.1 支持流吗?

支持。JMF 2.1.1 提供了 RTP/RTSP 流支持。

JMF 2.1.1 还在客户端提供 HTTP 和 FTP 流支持。

问:可以扩展 JMF 2.1.1 使用自己的编解码器吗?

可以。JMF 2.1.1 具有新的插件架构,允许您向框架中添加新的编解码器和效果。

您还可以创建自己的自定义数据源和播放器,以便分析和播放未与 JMF 2.1.1 捆绑在一起的新媒体类型

可以在 JMF 网站上提供的《JMF 程序员指南》中找到有关此操作的更多信息,网址为http://java.sun.com/javase/technologies/desktop/media/jmf

问:可以使用 JMF 2.1.1 捕获音频和视频吗?

可以。JMF 2.1.1 提供了捕获功能,因此您可以从录制或实时媒体源中进行捕获。在 Solaris 上,支持 SunVideo 和 SunVideo Plus 卡。在 Windows 上,支持具有 VFW 驱动程序的大多数视频捕获设备。有关已经过测试的视频捕获设备列表,请查看:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/formats.html

纯 Java 版本的 JMF 2.1.1 不支持视频捕获,因为在 JDK 中未将视频捕获作为核心功能提供。音频捕获仅在 J2SE 1.3 上受支持,其中因为在 J2SE 1.3 中包含 Java Sound API 而引入了音频捕获。

注意,Java Sound API 允许低级声音捕获;JMF 2.1.1 使用此 API 播放声音,并将 Java Sound 与它自己的下载捆绑在一起。这意味着您可以使用 Java Sound 捕获声音,而根本不必使用 JMF 2.1.1。

有关 Java Sound API 的更多信息,请查看 http://java.sun.com/products/java-media/sound

问:JMF 2.1.1 在哪些平台上运行?

JMF 2.1.1 将在 Windows 95/98/NT 4.0/2000、Solaris/SPARC 和任何 Java 兼容平台上运行。纯 Java 版本的 JMF 2.1.1 现在仅在 Apple 的 MRJ 2.1.4 上运行;但存在音频/视频同步问题,因为 Apple 向此 MRJ 中添加了一个 6 秒音频缓冲区。

问:JMF 2.1.1 在哪些版本的 JDK 上运行?

JMF 2.1.1 在运行 JDK 1.1 或更高版本的 Java 兼容平台上运行。为了实现完整的 2000 年合规性,您应该使用 JDK 1.1.6 或更高版本。

问:可以在浏览器中运行 JMF 2.1.1 吗?

可以。JMF 2.1.1 在运行 JDK 1.1.6 及更高版本的 Java 兼容平台上运行。

您可以将 JMF 与以下浏览器一起使用:

  • HotJava Browser 1.1
  • Netscape Communicator 4.03-4.05(具有 JDK 1.1 补丁)
  • Netscape Communicator 4.06 或更高版本
  • Microsoft Internet Explorer 4.01 或更高版本

问:JMF 2.1.1 与哪些 RTP/RTSP 流服务器一起使用?

JMF 2.1.1 已经过测试,可与以下工具和应用程序互操作:

  • Apple QuickTime 流服务器 — Apple Computer, Inc.
    适用于 Mac 平台的商业 RTP 服务器
    http://www.apple.com/quicktime/streamingserver/ 

     
  • Darwin 流服务器 — Apple Computer, Inc.
    适用于 Linux、Solaris 和其他平台的公共源 RTP 服务器
    http://www.publicsource.apple.com/projects/streaming 

     
  • ShowMe TV — Sun Microsystems
    适用于 Solaris/SPARC 的商业 RTP 服务器/客户端
    http://sunsolve.sun.com/search/document.do?assetkey=1-21-108127-05-1 

     
  • vat/vic — 劳伦斯伯克利实验室
    公开提供的音频和视频 RTP 工具
    在大多数 Unix 系统和 Windows 上运行
    http://ee.lbl.gov

问:JMF 2.1.1 遵从 2000 年合规性吗?

遵从。注意,您必须在 2000 年认证的 JVM(如 JDK 1.1.6 或更高版本)上运行它。

问:什么是 JMStudio?

JMStudio 是一个示例应用程序,作为 JMF 2.1.1 包的一部分提供。它包含在 jmf.jar 文件中,可以使用“java JMStudio”命令运行。这个基于 GUI 的工具提供播放、捕获、传输和代码转换功能。

问:什么是 JMF 注册表?

JMF 2.1.1 在名为 jmf.properties 的文件中维护一个可用插件、程序包前缀和其他设置的注册表。这是一个二进制文件,仅应使用提供的 JMFRegistry 应用程序进行修改。此应用程序是 JMF 2.1.1 jmf.jar 文件的一部分,并且可以作为“java JMFRegistry”运行。它要求您在 CLASSPATH 中具有 Swing-1.1(或者您可以使用 JDK 1.2 或更高版本)。

问:什么是 JMF 诊断?

JMF 网站上有一个包含嵌入式 JMF 小程序的诊断页面,此页面将检查您是否已在系统上正确安装了 JMF。请查看:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/jmfdiagnostics.html

问:如何关闭 HTTP/FTP 缓存?

默认情况下,在播放过程中 http 和 ftp 源缓存到本地磁盘。要针对这些源禁用缓存,您可以使用以下调用:

Manager.setHint(Manager.CACHING, new Boolean(false));

关闭缓存可导致性能低下,除非您快速连接到互联网(内联网)并且文件可流化。包含单一曲目(仅音频或仅视频)的文件将流畅播放而无需缓存,前提是数据使用速率不快于下载速率。

只有在创建并实现播放器之前进行设置,上述提示才有效。在开始播放之后进行设置,可能没有任何效果。

问:使用 Java 2 运行 JMF 小程序时存在安全问题吗?

如果在计算机本地安装 JMF,运行 JMF 小程序不会有任何安全问题。如果未在本地安装 JMF,JMF 小程序可能无法执行某些功能,如播放在本地存储的媒体文件或在本地保存媒体文件。此类操作被视为具有高风险,并通过 Java 2 安全管理器进行保护。如果用户选择允许进行保护,他/她可以使用策略文件执行此操作。下面是用户可能需要选择性地启用的几个设置:

对于播放在本地存储的媒体文件: 
    permission java.io.FilePermission "<directory to read from>/*", "read";

对于所有 java 音频播放: 
    permission java.lang.RuntimePermission "accessClassInPackage.sun.misc"; 
    permission java.lang.RuntimePermission "accessClassInPackage.sun.audio";

要允许 JMF 修改运行时线程优先级: 
    permission java.lang.RuntimePermission "modifyThread"; 
    permission java.lang.RuntimePermission "modifyThreadGroup";

对于加载原生库: 
    permission java.lang.RuntimePermission "loadLibrary.*";

对于写入 JMF 日志文件: 
    permission java.io.FilePermission "${user.dir}${/}jmf.log", "write";

对于 HTTP、FTP 和 RTP: 
    permission java.net.SocketPermission "*", "connect,accept"; 
    permission java.util.PropertyPermission "user.name", "read";

要允许在临时目录中下载缓存: 
    permission java.io.FilePermission "/tmp/*", "write"; 
    permission java.io.FilePermission "/tmp/*", "delete";

对于录音: 
    permission javax.sound.sampled.AudioPermission "record";

策略文件应允许仅针对用户信任的小程序使用这些权限;为此,可以在策略文件中的“grant”关键字之后指定“codeBase”。codeBase(实质上为代码源位置)应指向包含 jar 文件的 url。用户还可以选择通过“signedBy”参数指定受信任的实体;只有受信任的实体签名的代码才会获得权限。有关更多信息,请参见: http://java.sun.com/products/jdk/1.2/docs/guide/security/PolicyFiles.html

问:可以使用 JMF 2.1.1 从小程序中捕获音频或视频吗?

默认情况下(出于安全原因),JMF 2.1.1 不允许从小程序中进行捕获。用户可以使用 JMFRegistry 启用此功能。

运行“java JMFRegistry”,选择 UserSettings 选项卡并选中“Allow Capture From Applets”。如果浏览器的安全性允许加载原生库,您现在能够从小程序中捕获音频/视频。

问:在 JMF 2.1.1 中可以在小程序中保存文件吗?

默认情况下(出于安全原因),JMF 2.1.1 不允许在小程序中保存文件。用户可以使用 JMFRegistry 启用此功能。

运行“java JMFRegistry”,选择 UserSettings 选项卡并选中“Allow File Writing for Applets”。如果浏览器的安全性允许加载原生库,您现在能够从小程序中保存文件。

问:如何同时捕获音频和视频?

您必须针对音频和视频捕获设备创建 DataSource,并使用 MergingDataSource(请参见 javax.media.Manager)将它们合并为一个数据源。

JMF 2.1.1 RTP/RTSP

问:JMF 支持通过网络传输的流媒体吗?

支持,JMF 支持使用公共标准 RTP 和 RTSP 协议的流媒体。

问:什么是 RTP?

RTP 是实时传输协议。下面是 RTP 规范的节选:“RTP 提供了适用于应用程序的端到端网络传输功能,这些应用程序通过多播或单播网络服务传输实时数据,如音频、视频或模拟数据。RTP 不解决资源预留问题,不保证实时服务的服务质量。数据传输通过控制协议 (RTCP) 增强,允许以可扩展到大型多播网络的方式监视数据传递,并提供最少的控制和识别功能。RTP 和 RTCP 旨在独立于底层传输和网络层”。有关更多信息,请参见 RFC 1889:RTP:适用于实时应用程序的传输协议。

问:什么是 RTSP?

RTSP 是实时流协议。它是应用程序级别协议,用于控制实时数据(如音频和视频)的传递。数据源可以包括实时信源和已存储的剪辑。RTSP 相当于媒体流的电视远程控制。您可以在服务器端启动和停止流(视频点播类型应用程序)。有关更多信息,请参见 RFC 2326:实时流协议 (RTSP)。

问:JMF 支持哪些 RTP 特性?

JMF 支持通过 RTP 传输和接收各种媒体格式的媒体。有关支持的默认格式列表,请查看:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/support-rtp.html

它还完全支持 RTCP。此外,JMF 实现“适用于具有最少控制的音频和视频会议的 RTP 配置文件”— RTP/AVP。

前端 GUI 应用程序 JMStudio 可用作独立应用程序,以便传输和接收 RTP 流。要使用 JMF 作为框架来实现自定义 RTP 应用程序,请查看解决方案页面上的 RTP 示例:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/solutions/index.html

问:JMF 支持哪些 RTSP 特性?

JMF 支持客户端 RTSP 以便接收和播放。RTSP 协议栈内置于播放器中,可以通过 Manager.createPlayer() 接口和 RTSP 媒体定位器访问播放器。

JMF 与其他基于标准的 RTSP 服务器互操作。有关详细信息列表,请查看 RTSP 支持页面:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/support-rtsp.html

问:JMF 2.1.1 与哪些 RTP 流服务器一起使用?

JMF 2.1.1 已经过测试,可与以下工具和应用程序互操作:

  • Apple QuickTime 流服务器 — Apple Computer, Inc.
    适用于 Mac 平台的商业 RTP 服务器
    http://www.apple.com/quicktime/streamingserver/ 

     
  • Darwin 流服务器 — Apple Computer, Inc.
    适用于 Linux、Solaris 和其他平台的公共源 RTP 服务器
    http://www.publicsource.apple.com/projects/streaming 

     
  • ShowMe TV — Sun Microsystems
    适用于 Solaris/SPARC 的商业 RTP 服务器/客户端
    http://sunsolve.sun.com/search/document.do?assetkey=1-21-108127-05-1 

     
  • vat/vic — 劳伦斯伯克利实验室
    公开提供的音频和视频 RTP 工具
    在大多数 Unix 系统和 Windows 上运行
    http://ee.lbl.gov

问:JMF 支持服务器端 RTSP 吗?

目前,JMF/RTSP 栈只能通过仅支持播放示例的 Manager.createPlayer() 接口访问。没有服务器与 RTSP 栈通信必需的公共接口。

问:可以使用 JMF 开发会议应用程序(视频会议、音频聊天室等)吗?

JMF 确实提供了基本构建块,以便会议应用程序通过 RTP 传输和接收媒体。如果将 JMF 与 H.323 等会议协议结合使用,可以在 JMF 上构建功能完备、基于标准的会议解决方案。

问:在 JMF 上构建 H.323 会议应用程序涉及哪些步骤?

您需要实现包括 H.245(会议控制)和 T.120(数据会议)的 H.323 协议栈以启动会议建立,传送与会者/端点信息等。建立会议之后,您可以使用 JMF 实现进行打包传输和播放。

问:使用 JMF 开发服务器/客户端流应用程序时从何处入手?

您可以先在我们的网站上查看解决方案,网址为:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/solutions/index.html

您将在那里找到突出 JMF 不同方面的各种示例程序。例如,对于 RTP 传输,请查看 AVTransmit。

问:应该使用哪些编解码器满足低带宽要求?

对于低带宽视频,请使用 H.263。对于音频,GSM、G.723、DVI 是不错的选择。

问:可以从 RTP 传输中接收媒体并将其记录到文件吗?

可以。您可以使用 JMStudio 上的“导出”特性完成此操作。为了实现自定义应用程序以将数据写入文件,您可以从 ReceiveStream 中检索 DataSource。然后使用 DataSource 创建 Processor 对数据进行处理和代码转换。然后,可以使用从此 Processor 中输出的数据创建一个文件写入 DataSink 以进行保存。有关更多详细信息,请查看代码转换示例:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/solutions/Transcode.html

问:可以在同一 RTP 会话中发送音频和视频流吗?

不可以,因为 RTP 规范建议在两个不同的会话中发送音频和视频流。

问:如果音频和视频流在不同的 RTP 会话中传输,那么必须执行哪些操作来同步它们?

JMF 支持根据在 RTP 规范中指定的模型,通过 RTP 同步音频和视频。每个 RTP 数据流与对应的 RTCP 流匹配以便正确地确定媒体时间戳。然后,使用时间戳同步从用户那里发送的流,此用户通过自己的 cname(规范名字)标识。即使从不同会话 (RTPManager) 中发送流时,来自同一用户的流只要全部带有相同的 cname,便会同步这些流。

因此,从编程角度来看,如果您针对音频和视频创建两个会话 (RTPManager),则需要确保两个会话使用相同的 cname(在 SourceDescription 内)初始化,以便保证音频/视频同步。

有关更多详细信息,请查看解决方案页面上的 AVTransmit:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/solutions/AVTransmit.html

问:可以在一台主机上单播流吗?

可以。如果用于发送端和接收端的两个 RTPManager 对象没有绑定到同一端口,可以执行此操作。您需要设置一个从端口 A 到端口 B 的传输。在此主机上,第一个 RTPManager 绑定到端口 A,并从端口 A 传输到端口 B。第二个 RTPManager 绑定到端口 B,在端口 B 上接收 RTP 数据,并将 RTCP 反馈从端口 B 发送到端口 A。

您可以尝试 JMF 解决方案页面上的传输和接收示例,以便在一台主机上配置单播会话:

有关更多信息,请查看:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/solutions/index.html

问:可以将 RTP 发送到自定义传输层(如 ATM)或从其中接收 RTP 吗?

可以,您需要实现 RTPConnector。RTPSocketAdapter 是我们网站上提供的 RTPConnector 的示例实现。请在以下网址查看:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/solutions/RTPConnector.html

问:如何向 JMF 中添加 RTP 文本有效载荷支持 (draft-ietf-avt-rtp-text-00.txt)?

JMF 是一个开放架构,具有播放程序、编解码器等可插拔组件。为了添加 RTP 文本功能,您需要添加新格式(有效载荷)并提供相应的数据打包程序及解包程序、编解码器和播放程序。

问:JMF 支持 RTP 动态有效载荷映射吗?

支持。使用以下接口将动态有效载荷到格式的映射添加到 RTPManager:

        public void addFormat(Format format, int payload);

RTPManager 维护所有静态有效载荷编号及其对应格式,如音频/视频配置文件文档中所述。使用 PlugIn Codec 接口,用户可以插入自己的打包程序或解包程序,以便使用 AV 配置文件中指定的动态有效载荷编号处理专有格式的 RTP 流。在流化动态有效载荷之前,需要针对每个动态有效载荷类型创建一个 Format 对象并将此对象与动态有效载荷编号关联。

问:如何构建自定义 RTP 打包程序和解包程序?

请参见 JMF 解决方案页面以构建自定义 RTP 打包程序和解包程序:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/solutions/CustomPayload.html

问:如何降低音频延迟?

JavaSound 使用的软件音频混合可导致长延迟。如果您运行 Windows 或 Solaris 性能包,可以使用 DirectAudioRenderer 降低延迟。为此,使用 JMFRegistry GUI 应用程序或通过 PlugInManager API 禁用 JavaSoundRenderer。

另一种降低延迟的方法是设置更小的捕获和播放缓冲区大小。有关详细信息,请查看以下示例:

http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/solutions/AudioBufferControl.html

问:JMF 提供 SDP 支持吗?

提供。JMF 中的 SDP 支持用于 RTSP 上下文,因为多个 RTSP 服务器使用 SDP 描述媒体格式、传输等。目前,通过内部接口访问 SDP。

问:JMF 提供 RTCP APP 数据包支持吗?

目前,JMF 只能接收 APP 数据包。任何 API 都不允许您指定/设置任何 RTCP 数据包的有效载荷。

问:如何控制 RTCP 传输间隔?

RTCP 传输间隔根据多个参数计算得出,这些参数包括与会者数量、为 RTCP 流量分配的带宽、数据包大小等。初始化 RTPManager 时,您可以选择指定 RTCP 带宽值(默认为 5%),从而影响接收方报告之间的传输间隔:

        public void
        initialize( SessionAddress localAddresses[],
                SourceDescription sourceDescription[],
                double rtcpBandwidthFraction,
                double rtcpSenderBandwidthFraction,
                EncryptionInfo encryptionInfo)

问:如何释放 RTPManager 占用的资源(如用于监听 RTP 套接字的套接字)?

调用以下方法:

        RTPManager.removeTargets( String reason);
        RTPManager.dispose();

问:QuickTime 流服务器可以与使用 H.263/RTP 的 JMF 客户端一起使用吗?

可以。定义了两个版本的 H.263 有效载荷头:RFC 2190(有效载荷类型 34)和新的 RFC 2429(动态有效载荷类型 96-127)。QuickTime 服务器使用新的有效载荷头,而 JMF 用于支持旧的有效载荷头。JMF 2.1.1 现在支持这两种 H.263 有效载荷类型。

问:如何向程序中添加 RTCP 报告或统计信息?

您应该查看的相关方法包括 RTPManager 类中的

        public GlobalReceptionStats getGlobalReceptionStats();
        public GlobalTransmissionStats getGlobalTransmissionStats();

我们的示例程序 JMStudio 使用这些方法并在窗口中显示它们。可从以下网址获得 JMStudio 源代码:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/jmstudio/jmstudio.html

问:在 RTSP 服务器传输和客户端接收的情况下,需要选择服务器/客户端端口吗?

不需要“选择”客户端端口或服务器端口。作为 RTSP 协议的一部分,已协商端口:客户端指定哪些端口可用以及它分配哪些端口进行监听。然后,向服务器通知端口值(通过 RTSP 或某种其他协议),而服务器反过来开始从服务器(根据可用性)选择的服务器端口传输到客户端端口。

问:RTSP 协议可以告知服务器端关闭 RTP 会话吗?

可以,通过发送 TEARDOWN 消息。如果断开,RTSP 客户端应该发出 TEARDOWN,而 RTSP 服务器应该能够处理这些消息。某些服务器需要 RTCP 心跳。如果它们在预定义的间隔内没有收到任何 RTCP 数据包,它们将假设客户端不存在并关闭对应的会话。

问:RTSP 协议可以发送 BYE 数据包吗?

BYE 数据包是 RTCP 协议的一部分,指示对应的与会者已经离开会话。RTSP 通过发送 TEARDOWN 消息来终止会话。

JMF 2.1.1 疑难解答

播放

问:为什么无法播放“xyz.mov”或“abc.wav”?

尽管 JMF 可能支持特定媒体内容 类型(如 QuickTime 和 MPEG),但它可能不支持用于此文件内的数据的特定压缩 (CODEC)。例如,包含 Cinepak 视频的 QuickTime 文件将在 JMF 中播放,但包含 Sorensen 视频的 QuickTime 文件将无法播放。这是因为 JMF 2.1.1 不支持对基于 Sorensen 的视频进行解码。

有关 JMF 2.1.1 支持的完整一组格式,请查看:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/formats.html

问:为什么视频没有更新?

如果视频屏幕空白或没有更新,通常可能因为 CPU 无法足够快地对视频进行解码和播放。这可能由于计算机速度慢、文件源速度慢或图形卡速度慢所致。如果文件源速度慢(如网络文件),尝试先创建本地副本。

问:为什么没有声音?

如果未如预期那样听到声音,可能有如下几个原因:

  • 硬件音量已关闭
  • 声卡由另一个应用程序使用 — 退出其他应用程序并在 JMF 中重新加载媒体文件
  • JMF 不支持压缩格式的音频曲目

小程序

问:这是什么错误?
java.lang.NoClassDefFoundError:javax/media/ControllerListener

这会在以下两种情况下发生:

  • jmf.jar 不在您的 CLASSPATH 中
  • jmf.jar 在您的 CLASSPATH 中,但您使用的是 JDK 1.2 以上版本的小程序查看器。
    JDK 1.2 及更高版本需要从 <JDK>/jre/lib/ext 目录加载标准扩展。当您在 Windows 上安装 JMF 2.1.1 时,将自动在上述目录中安装 jmf.jar。如果由于某些原因而未自动安装,或者您在安装 JMF 之后安装了 JDK 1.2 或更高版本,则需要手动将 jmf.jar 和 sound.jar 文件复制到 <JDK>/jre/lib/ext 目录中。

问:为什么无法在小程序中播放本地文件?

某些浏览器需要其他权限以允许读取本地文件。如果浏览器提示您提供此类权限,您必须给出肯定回答。

问:为什么无法在浏览器中使用 JMF 小程序?

可能的原因如下:

  • 未在计算机上正确安装 JMF,或者未在网站上提供包含相关小程序的 JMF。运行 JMF 诊断小程序以查看 JMF 是否已正确安装:http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/jmfdiagnostics.html
  • 您的浏览器没有 JDK 1.1.x 兼容 Java VM。升级到更新版本的浏览器。
  • 小程序可能抛出安全性异常 — 查看与您的浏览器相关的 Java Console。

捕获

问:为什么我的摄像机没有在 JMStudio->Capture Preview 中显示?

JMF 需要查询您的系统以查找捕获设备。您首次运行 JMStudio 时,会自动出现这种情况。如果您从早期版本的 JMF 2.1.1 升级或者刚安装新的捕获设备或者注册表文件已删除,则需要强制 JMF 再次查询以查找捕获设备。

强制 JMF 查找捕获设备:

  • 在 Solaris 上,运行“java SunVideoAuto”或“java SunVideoPlusAuto”,具体取决于您具有的卡。
  • 在 Windows 上,运行“java VFWAuto”。

问:为什么在捕获音频时听不到任何声音?

使用 JavaSound 捕获驱动程序捕获音频时,音频不会自动播放,除非您预览已捕获的音频。有时,即使您预览已捕获的音频,如果您的捕获设备不支持同时进行捕获和播放,也无法听到任何声音。


你可能感兴趣的:(java,JMF,视频切割,视频格式转换)