【问题标题】:How do I get Codenameone to capture video?如何让 Codenameone 捕捉视频?
【发布时间】:2014-05-14 21:40:13
【问题描述】:

我正在使用以下代码尝试使用 codenameone 2.0 捕获视频

        tProperty.setHint("name the property that is a media");
        final CheckBox cbVideo = new CheckBox("Video");
        final Button bCapture = new Button("Capture Media");
        final MediaPlayer mpPlayer = new MediaPlayer();
        bCapture.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ect){
                try {
                    if (cbVideo.isSelected()) {
                        String value = Capture.captureVideo();
                        mpPlayer.setDataSource(value);
                        mpPlayer.setName(tProperty.getText());
                    }else {
                        String value = Capture.captureAudio();
                        mpPlayer.setDataSource(value);
                        mpPlayer.setName(tProperty.getText());

                    }
                }catch (Exception e){

                }
            }
        });
        cM.addComponent(tProperty);
        cM.addComponent(cbVideo);
        cM.addComponent(bCapture);
        cM.addComponent(mpPlayer);
        Command [] cmds = new Command[1];
        cmds[0] = new Command("Done") {
            public void actionPerformed(ActionEvent evt) {
                //do Option1
            }        
        };
           Dialog.show(editType, cM, cmds);            

在模拟器中运行时,点击CaptureMedia按钮,会出现文件选择界面。但是我根本无法选择任何文件,无论是音频还是视频,因为选择文件按钮被禁用。 如何在模拟器中测试视频捕获?

【问题讨论】:

  • 其实这不是问题。问题是模拟器正在寻找音频文件,而我认为由于 cbVideo.isSelected() 而它应该寻找视频。现已修复。
  • 没那么快。仍然无法让视频在模拟器中播放。它被捕获到一个文件中,但播放器报告该文件不存在,给出 java.io.FileNotFoundException: /Users/jamesagada/.cn1/_var_folders__j_xsgymcmd1lsc5zqtg65ctlsm0000gn_T_temp6413969854734503786.mp4(没有这样的文件或目录)

标签: codenameone


【解决方案1】:

我认为这是一个布局问题,您在创建视频之前添加了 MediaPlayer 组件,因此它的首选大小为 0。 尝试将视频放置在边框布局中心,这样它的首选尺寸就会被忽略,并且播放器将有足够的空间来显示。

试试这个:

    final Form hi = new Form("Hi World");
    hi.setLayout(new BorderLayout());

    final Button bCapture = new Button("Capture Media");
    bCapture.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ect) {
            try {
                final MediaPlayer mpPlayer = new MediaPlayer();
                String value = Capture.captureVideo();
                System.out.println("Captured Video " + value);
                if (value != null) {
                    System.out.println("Playing Video");
                    InputStream is = FileSystemStorage.getInstance().openInputStream(value);
                    String strMime = "video/mp4";
                    System.out.println("Input Stream" + is.available());
                    mpPlayer.setName("bla");
                    mpPlayer.setDataSource(is, strMime, new Runnable() {
                        public void run() {
                            System.out.println("reset the clip for playback");
                        }
                    });
                    hi.addComponent(BorderLayout.CENTER, mpPlayer);
                    hi.revalidate();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    );
    hi.addComponent(BorderLayout.NORTH, bCapture);

    hi.show();

【讨论】:

  • 谢谢陈。你说的对。我不得不添加 mpPlayer.setPreferredH(Display.getInstance().getDisplayHeight()/2);让它工作。
【解决方案2】:

在 Codename One 模拟器中播放本地视频时会出现回归问题,尽管它应该可以在设备上运行。 Codename One 的下一次更新将修复它,但现在您可以通过从应该可以正常工作的流中播放来解决它。

只需使用FileSystemStorage 类为视频获取InputStream 并调用适当的播放代码。请注意,这比通过 URL API 播放效率低,因此当回归修复后,您可能应该返回基于 URL 的 API。

【讨论】:

  • 我试过了,但它什么也没做。
  • FileSystemStorage 说文件不存在!
  • 您始终需要提供 FileSystemStorage API 的完整路径并使用主目录
  • 喜欢这个 /Users/jamesagada/.cn1/_var_folders__j_xsgymcmd1lsc5zqtg65ctlsm0000gn_T_temp64139‌​69854734503786.mp4 ?这是来自 Capture.captureVideo() 的值。还是应该使用其他命令?
  • 不确定。除了 Eclipse 插件更新之外,我将如何做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
相关资源
最近更新 更多