当前位置: 首页 > 知识库问答 >
问题:

代号一个视频在按下快速前进/后退按钮时在iOS上崩溃

公风史
2023-03-14

我们有一个用代号一编写的视频供应应用程序<我们正在使用com。代号1。媒体MediaPlayer使用本机播放器组件全屏显示视频<我们的客户注意到,当您按下快进键时(

播放视频的代码如下所示:;

...
private Media video;
...
(on EDT:)
InputStream input = {get video InputStream from path}
video = MediaManager.createMedia(input, "video/mp4", this::videoFinished);
video.setFullScreen(true);
video.setNativePlayerMode(true);
.... 
(after pressing the play button:)
if (video.isPlaying()) {
     video.setTime(0);
    video.pause();
}
video.prepare();
video.play();
...
private void videoFinished() {
    {update UI after video has finished}
}

我从控制台收集了以下日志(如果有帮助的话);

2018-11-01 15:08:38.290366+1300 Main[2000:481106] [] <<<< AVOutputDeviceDiscoverySession (FigRouteDiscoverer) >>>> -[AVFigRouteDiscovererOutputDeviceDiscoverySessionImpl outputDeviceDiscoverySessionDidChangeDiscoveryMode:]: Setting device discovery mode to DiscoveryMode_None (client: Main)
2018-11-01 15:08:39.058905+1300 Main[2000:481106] [] <<<< AVOutputDeviceDiscoverySession (FigRouteDiscoverer) >>>> -[AVFigRouteDiscovererOutputDeviceDiscoverySessionImpl outputDeviceDiscoverySessionDidChangeDiscoveryMode:]: Setting device discovery mode to DiscoveryMode_Presence (client: Main)
2018-11-01 15:09:00.005725+1300 Main[2000:481106] Status bar could not find cached time string image. Rendering in-process.
2018-11-01 15:09:00.144446+1300 Main[2000:481106] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
"<NSAutoresizingMaskLayoutConstraint:0x10eb09790 h=-&- v=-&- _UIBackdropContentView:0x108d4a310.midY == _UIBackdropView:0x108d59fb0.midY   (active)>",
"<NSAutoresizingMaskLayoutConstraint:0x10eb0abd0 h=-&- v=-&- _UIBackdropContentView:0x108d4a310.height == _UIBackdropView:0x108d59fb0.height   (active)>",
"<NSLayoutConstraint:0x10ccf2440 V:|-(0)-[UIStatusBar:0x102922200]   (active, names: '|':_UIBackdropContentView:0x108d4a310 )>",
"<NSLayoutConstraint:0x10ccf24e0 UIStatusBar:0x102922200.height == 20   (active)>",
"<NSLayoutConstraint:0x10ccf2bf0 UIView:0x10cce7e10.top == _UIBackdropView:0x108d59fb0.top + 40   (active)>",
"<NSLayoutConstraint:0x10ccf26e0 V:[UIStatusBar:0x102922200]-(0)-[UIView:0x10cce7e10]   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10ccf26e0 V:[UIStatusBar:0x102922200]-(0)-[UIView:0x10cce7e10]   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2018-11-01 15:09:00.687662+1300 Main[2000:481106] [] <<<< AVOutputDeviceDiscoverySession (FigRouteDiscoverer) >>>> -[AVFigRouteDiscovererOutputDeviceDiscoverySessionImpl outputDeviceDiscoverySessionDidChangeDiscoveryMode:]: Setting device discovery mode to DiscoveryMode_None (client: Main)

Android上的一切都正常工作。

编辑:

重构代码以使用文件URL而不是输入流,但在iOS上仍然存在相同的错误

编辑:


这里有一个非常简单的测试用例来说明这个问题;

public class MyApplication {

    private Form current;
    private Resources theme;
    private Media video;

    public void init(Object context) {
        // use two network threads instead of one
        updateNetworkThreadCount(2);

        theme = UIManager.initFirstTheme("/theme");

        // Enable Toolbar on all Forms by default
        Toolbar.setGlobalToolbar(true);

        // Pro only feature
        Log.bindCrashProtection(true);

        addNetworkErrorListener(err -> {
            // prevent the event from propagating
            err.consume();
            if(err.getError() != null) {
                Log.e(err.getError());
            }
            Log.sendLogAsync();
            Dialog.show("Connection Error", "There was a networking error in the connection to " + err.getConnectionRequest().getUrl(), "OK", null);
        });        
    }

    public void start() {
        if(current != null){
            current.show();
            return;
        }
        Form hi = new Form("Hi World", BoxLayout.y());
        //hi.add(new Label("Hi World"));
        Button play = new Button("Play");
        play.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                playVideo();
            }


        });
        hi.add(play);
        hi.show();
    }

    private void playVideo() {
        try {
            String path = getPath();
            video = MediaManager.createMedia(path, true, null);
            video.setFullScreen(true);
            video.setNativePlayerMode(true);

            video.prepare();
            video.play();
        } catch (IOException ex) {
            Log.e(ex);
        }
    }

    private String getPath() {
        return "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4";
    }
    public void stop() {
        current = getCurrentForm();
        if(current instanceof Dialog) {
            ((Dialog)current).dispose();
            current = getCurrentForm();
        }
    }

    public void destroy() {
    }
}

注意:要在ios上运行此操作,需要将安全异常添加到plistInject构建提示中。将其添加到codenameone\u设置中。属性文件;

codename1.arg.ios.plistInject=<key>UIRequiresFullScreen</key><true/><key>ITSAppUsesNonExemptEncryption</key><false/><key>NSAppTransportSecurity</key><dict><key>NSExceptionDomains</key><dict><key>commondatastorage.googleapis.com</key><dict><key>NSIncludesSubdomains</key><true/><key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key><true/></dict></dict></dict>

共有1个答案

亢正德
2023-03-14

使用输入流进行查找可能有点问题,因为在与本机层通信时,我们无法在流中有效地倒带/跳过。这就是为什么我们总是建议使用接受URL作为参数的版本。您可以使用一个文件URL,该URL应该适用于所有平台。

 类似资料:
  • 我正在编写一个使用ChessClock类的游戏应用程序。这两个运动员每人都有一个钟。时钟每十分之一秒向自己发送一个信息流,如果运行,则减少剩余时间。当时间到期时,时钟会调用父视图组中的一个方法,该方法会停止时钟并设置一个标志,该标志会导致忽略进一步的触摸事件,从而用户无法再移动工件。我正在用kotlin写作,但我认为java程序员也会明白这一点: 这可以正常工作,但是如果用户按下后退按钮然后开始一

  • 我是一个新手,我正在尝试创建一个应用程序来在我的投资组合中使用。本质上,该程序是一个可以访问不同菜单的菜单(json文件:texas_pick.js,Breakth.js…),该程序旨在以按钮的形式显示菜单选项,按钮的详细信息从各自的json文件中检索。我面临的问题是,单击菜单选项时,会检索最后一个菜单项的数据。我将后端编程为只将商品名称和价格推送到数据库,而前端则检索这些数据并将其显示在表上。检

  • 多亏了这里有用的回复,我的图形用户界面达到了我想要的效果-- 这是GUI,这是添加了ActionListener的当前代码: 我读过一些关于使用JOptionPane的文章,但显然这并没有给我想要的灵活性,因为我不仅想要按钮,还想要两个标签和文本区域。 基本上,我想做的是: 我希望执行停止,直到我选择按下Button1或Button2。我不想做等待(),因为这可能是糟糕的性能。 谢谢你的帮助!

  • 我正在使用android导航组件库。我用导航图设置了两个片段。我想在我的片段内按下后退按钮时做一些额外的动作。 我使用这段代码来处理工具栏上的按钮点击,但我也想处理后退按钮按下。我该怎么做?

  • 问题内容: 我是编程的初学者,并开始学习Swift,以制作一款有趣的钢琴应用。 按下按钮时我无法播放声音。我已经搜索了一些网站,但是我还是个初学者,无法理解… http://www.tmroyal.com/playing-sounds-in-swift-avaudioplayer.html http://www.rockhoppertech.com/blog/swift- avfoundation

  • 我在这件事上完全被难住了。我有一个活动C,当我试着按下后退按钮时,它工作了。但是,当我使用操作栏中的home/up按钮时,它就会崩溃(请参见下面的错误)。下面是我的代码中处理备份/备份按钮的部分。 活动C: 错误: 这是否与到达活动C有两种可能的方式有关?要么是-