ld == " + pres.getGWorld() + ", size == "+ mediaParams.getWidth() + "x" + mediaParams.getHeight() + ", streams == " + pres.getNumStreams()); //*******这不是真正地必要的, 但它将告诉你怎么通过Presentation游览来挑选各自的流媒体。 Presentation.getIndStream 会由索引返回一个Stream(附注QuickTime 索引都是基于1)。它重复这些audioMediaCharacteristic 请求查找音频流 (对于录影, 您就要请求visualMediaCharacteristic) 。 这个实例在audioStream上为左右声道设置音量最大值为100。 最后, println从Presentation和MediaParams转存一些有意义的元数据。 配置Presentation SettingsDialog sd = new SettingsDialog (pres); System.out.println ("Did settings"); pres.preroll(); broadcasting = false; 这是设置presentation最后的步骤。 SettingsDialog存在用户以输入装置选择的音频和视频 (二个流媒体SDP 文件被指定在Presentation中) 。每个流媒体都可由一个压缩格式来定制 (MPEG-4, Sorenson Video 3, H.263, 等) 以及一个分包器(有时由压缩格式定义; 可观察它是否随着压缩格式的改变而自动改变) 。 这个GUI实例显示在图1 。  图像1. 为一个Presentation SettingsDialog 在此图中, 音频默认为计算机连线输入。更改它为iSight, 您需要点击Source按钮,提出的可选设备列表显示在图2上 。  图2. 来源选择对话框 最后就是调用Presentation.preroll(), 如同Movie.preroll(), 提供Presentation一个机会预先分配资源以及准备好开始流媒体Presentation。 提供一个控制GUI // Make monitor window startStopButton = new Button ("Start"); configButton = new Button ("Configure"); startStopButton.addActionListener (this); configButton.addActionListener (this); Frame monitorFrame = new Frame ("QTJ Streaming"); monitorFrame.setLayout (new BorderLayout()); Panel buttonPanel = new Panel(); buttonPanel.add (startStopButton); buttonPanel.add (configButton); monitorFrame.add (buttonPanel, BorderLayout.SOUTH); monitorFrame.pack(); monitorFrame.setVisible(true); 这个为控制和配置Presentation设置了很小的GUI,提供基本的一个起始/停止键和一个配置按钮。 按钮作为一个ActionListener提交给this, 意味着这个类将需要提供一个actionPerformed方法来处理按钮点击。 控制GUI 的屏幕截图显示在图3 。  图3. 监控/控制窗体 在这点上你也许会问一个有趣的问题: "从什么时候我们开始关心使用GUI提供server?"据推测, 这是从Classic Mac OS开始的一个传统, 它没有一个用命令行启动和传递参数的程序。但此外, 你通常会希望提供一个流媒体数据的预览, 并且如果您有一个预览视窗, 为什么会也没有一个配置的GUI? 无论如何, 这是大概的讨论, 因为QTJ 6.1 不提供您能使用来预览的一个AWT Component。在有些方面有希望的是, QTFactory将得到一个新的超负荷为采用一个Presentation并且返回一个显示流媒体视频的Component的makeQTComponent。 它大概可能使用一些QuickDraw voodoo而完全放弃Java的东西。 如果,在各task()中回调(参见下面) 您采取GWorld被及早创建, 转换它成Pict, 并且作为一份唯一命名的文件, 您会看见每一个都是不同的, 意味GWorld每次都得到新数据。 所以如果您替换掉GWorld, 改为能给AWT Component在各通道上定义象素, 您会有银幕上的预览。何人有胆量如此做? 在quicktime-java list上查看。 详细资料 // add shutdown handler to make sure presentation // gets stopped Thread presentationStopper = new Thread() { public void run() { try { pres.stop(); } catch (QTException qte) {} } }; Runtime.getRuntime().addShutdownHook (presentationStopper); 这个关闭异常分支确定Presentation在程序退出之前被终止。 这是重要的原因, 象SequenceGrabber, Presentation愉快继续运行在您的应用程序退出之后,绑定一个端口,严重的循环, 使用您的获取设备保留其它应用程序, 等。 } catch ( QTException e ) { e.printStackTrace(); System.exit (-1); } } 最后, 构造函数捕捉并抛出所有的QTExceptions。 public void actionPerformed (ActionEvent ae) { System.out.println ("actionPerformed"); try { if (ae.getSource() == startStopButton) { if (broadcasting) { pres.stop(); stopTasking(); broadcasting = false; startStopButton.setL上一页 [1] [2] [3] [4] 下一页
|
|