【问题标题】:Flash update 12 broke my video recorderFlash 更新 12 损坏了我的录像机
【发布时间】:2014-03-04 20:49:25
【问题描述】:

当 flash 将 12.0.0.70 版本推送到 Chrome 时,它​​破坏了我的录像机。

根据patch notes here 的说法,一件事发生了变化,这可能会破坏我的基于闪存的刻录机

[3689061] [视频] 解决了在 Flash Player 中注入的问题 11.9.900.170 如果在播放 RTMP 流时缓冲区被清空,则导致视频缓冲区不再被填充

我的录像机在停止流式传输并将视频保存到 Adob​​e Media Server 时中断。

我尝试使用 12.0.0.70 闪存调试器对其进行调试,但在使用调试器时它不会崩溃。只有在使用非调试器 Chrome 版本时才会崩溃。

我无法调试它并从我的 swf 中获取任何有用的信息,除了对 console.log 进行大量外部调用以查看失败的位置。

如果有人在使用基于闪存、连接媒体服务器的网络摄像头录像机时也遇到了类似的问题,并且能猜出什么可以解决我的问题,我将不胜感激。

我正在使用 Flex 4.6.0 构建这个 swf


这是停止录像机的功能。

public function doStop():void{
            if(status=="paused"){
                doResume();
            }

            rectColor.color=0x000000;
            rectColor.alpha=1;

            var timer:Timer=new Timer(1 * 10);
            timer.addEventListener(TimerEvent.TIMER,function(e:TimerEvent):void{
                timer.stop();
                timer.reset();
                myns.close();
                myTimer.stop();
                if(!thumbBeginning){
                    if(status=="recording"){
                        takeScreenShot();
                    }
                }else{
                    if(status=="recording"){
                        recordingTime = formatTime(realTime);
                        recordingLength = myTimer.currentCount;
                        if(!redoFlag){
                            ExternalInterface.call("CTRecorder.stopOk");
                            myTime.text = formatTime(0);
                            VD1.attachCamera(myCam);
                            setState("ready");
                            status = "stopped, ready"
                            playbackTimer.reset();
                            msg(recordingTime);
                            recording=false;
                            pauseTime=0;
                        }else{
                            pauseTime=0;
                            myTime.text = formatTime(0);
                            VD1.attachCamera(myCam);
                            playbackTimer.reset();
                            msg(recordingTime);
                            recording=false;

                        }
                    }


                    if(shutterGroup.visible){
                        toggleShutter();
                    }

                    myTimer.stop();

                    myTimer.reset();

                    if(redoFlag){
                        doRecord();
                        redoFlag=false;
                        trace("redoFlag turned off");
                    }
                }
                rectColor.alpha=.5;
            });
            timer.start();
        }

【问题讨论】:

    标签: actionscript-3 flash apache-flex video flex4.6


    【解决方案1】:

    这不是一个真正的答案,但评论太长了。

    “我无法调试它” - 它只在发布版本中中断?发布版本是辣椒插件(即Chrome的Flash版本),调试的是NPAPI插件(即Adobe的版本)?

    ExternalInterface.call("CTRecorder.stopOk"); 调用可能是其中断的候选者。您是在本地测试还是远程测试?如果在本地,那么您可能会遇到这个错误:https://code.google.com/p/chromium/issues/detail?id=137734,其中 Flash JS 通信由于 PPAPI Flash 中忽略了受信任的位置而中断。无论如何,尝试安装发布的 NPAPI 版本的 Flash,看看它是否仍然崩溃(您可以通过访问 chrome://plugins/ 来验证哪个正在运行)

    为了帮助调试发布版本,您需要一个日志系统 - 您可以调用自定义的 log() 函数,而不是调用 trace(),该函数以及 trace()ing 还将消息存储在某处,例如在一个数组中。然后,在您的 SWF 中,当您按下某个键时,在屏幕上显示一个 TextField,并用您的 log() 消息填充它。这样,您将能够在发布模式下看到 trace() 语句。

    另外,不要忘记监听任何相关的错误事件和抛出的异常 - 例如,ExternalInterface.call() 将抛出 ErrorSecurityError。您还可以设置marshallExceptions 属性,它将ActionScript 异常传递给浏览器,将JavaScript 异常传递给播放器:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html#marshallExceptions

    最后,在你的主类中为UncaughtErrorEvent.UNCAUGHT_ERROR 事件添加一个监听器,它会捕获任何未捕获的抛出错误(很有趣),这至少意味着你的应用不会崩溃:

    mainClass.loaderInfo.uncaughtErrorEvents.addEventListener( UncaughtErrorEvent.UNCAUGHT_ERROR, this._onUncaughtErrorEvent );
    private function _onUncaughtErrorEvent( e:UncaughtErrorEvent ):void
    {
        var message:String      = null;
        var stackTrace:String   = null;
    
        // get the message
        if ( e.error is Error )
        {
            message = ( e.error as Error ).message;
            try { stackTrace = ( e.error as Error ).getStackTrace(); }
            catch ( error:Error ) { stackTrace = "No stack trace"; }
        }
        else if ( e.error is ErrorEvent )
            message = ( e.error as ErrorEvent ).text;
        else
            message = e.error.toString();
    
        // show an alert
        trace( "An uncaught exception has occurred: " + e.errorID + ": " + e.type + ": " + message + ", stack:\n" + stackTrace );
        e.preventDefault();
    }
    

    【讨论】:

    • 我一直在远程测试这个。感谢所有备用日志记录提示
    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 2011-03-20
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多