【问题标题】:When debugging on an Android device, Video objects sometimes refuse to play a Camera or a NetStream object在 Android 设备上调试时,Video 对象有时会拒绝播放 Camera 或 NetStream 对象
【发布时间】:2015-06-03 16:33:49
【问题描述】:

我在 Flash 中编码已经有一段时间了,虽然我还没有在 AIR Mobile 上工作过很多。话虽如此,当通过 USB 在 Android 设备上调试时,Video 对象有时在 CameraNetStream 对象连接时工作得很好,有时它们拒绝做任何事情。在NetStream 的情况下,音频也丢失了。同样在NetStream 对象的情况下,如果我转到设备的桌面,然后在没有关闭它的情况下返回应用程序,那么Video 对象将突然开始工作。

我有两种基本的复制方法:

1:对于Camera

package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.utils.Timer;

    public class CameraExample extends Sprite
    {
        private var m_cam:Camera;
        private var m_vid:Video = new Video();
        private var m_tmr:Timer = new Timer(1000);

        public function CameraExample()
        {
            stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);
            function init(pEvent:Event = null):void {
                // support autoOrients
                stage.align = StageAlign.TOP_LEFT;
                stage.scaleMode = StageScaleMode.NO_SCALE;

                m_tmr.addEventListener(TimerEvent.TIMER, onTimer);
                m_tmr.start();
            }
        }    

        private function onTimer(pEvent:TimerEvent):void
        {
            if (m_cam = Camera.getCamera())
            {
                m_tmr.removeEventListener(TimerEvent.TIMER, onTimer);
                m_tmr.stop();

                m_vid.attachCamera(m_cam);
                addChild(m_vid);
                trace("here")
            }
        }
    }
}

2:对于NetStream(这是两个程序):

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.NetStatusEvent;
    import flash.events.TimerEvent;
    import flash.media.Camera;
    import flash.media.Microphone;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.utils.Timer;

    public class NetStreamExample1 extends Sprite
    {
        private var m_nc:NetConnection = new NetConnection();
        private var m_ns:NetStream;

        private var m_cam:Camera;
        private var m_mic:Microphone;

        private var m_tmr:Timer = new Timer(1000);

        public function NetStreamExample1()
        {
            m_tmr.addEventListener(TimerEvent.TIMER, onTimer);
            m_tmr.start();
        }

        private function onTimer(pEvent:TimerEvent):void
        {
            if (m_cam = Camera.getCamera())
            {
                m_tmr.removeEventListener(TimerEvent.TIMER, onTimer);
                m_tmr.stop();

                m_mic = Microphone.getMicrophone();

                m_nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatusNC);
                m_nc.connect("rtmp://SomeIPAddress/SomeApp/0");
            }
        }

        private function onNetStatusNC(pEvent:NetStatusEvent):void
        {
            if (pEvent.info.code == "NetConnection.Connect.Success")
            {
                m_ns = new NetStream(m_nc);
                m_ns.attachCamera(m_cam);
                m_ns.attachAudio(m_mic);
                m_ns.publish("0", "live");
            }
        }
    }
}

还有:

package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.NetStatusEvent;
    import flash.events.TimerEvent;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.utils.Timer;

    public class NetStreamExample2 extends Sprite
    {
        private var m_nc:NetConnection = new NetConnection();
        private var m_ns:NetStream;

        private var m_vid:Video = new Video();

        private var m_tmr:Timer = new Timer(5000, 1);

        public function NetStreamExample2()
        {
            stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);
            function init(pEvent:Event = null):void {
                // support autoOrients
                stage.align = StageAlign.TOP_LEFT;
                stage.scaleMode = StageScaleMode.NO_SCALE;

                addChild(m_vid);

                m_nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatusNC);
                m_nc.connect("rtmp://SomeIPAddress/SomeApp/0");
            }
        }

        private function onNetStatusNC(pEvent:NetStatusEvent):void
        {
            trace("m_nc: " + pEvent.info.code);
            if (pEvent.info.code == "NetConnection.Connect.Success")
            {
                m_ns = new NetStream(m_nc);
                m_ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatusNS);
                m_ns.play("0", "live");

                m_vid.attachNetStream(m_ns);

                m_tmr.addEventListener(TimerEvent.TIMER, onTimer);
                m_tmr.start();
            }
        }

        private function onNetStatusNS(pEvent:NetStatusEvent):void
        {
            trace("m_ns: " + pEvent.info.code);
        }

        private function onTimer(pEvent:TimerEvent):void
        {
            trace(m_ns.info.videoBytesPerSecond);
        }
    }
}

对于NetStream 示例,将第一部分作为桌面 AIR 应用程序直接从 IDE 中运行,然后通过 USB 线通过 IDE 在 Android 设备上运行第二部分。对于 FMS,只需添加一个名为“SomeApp”的空白应用程序,无需任何代码。

NetStream 示例中,我可以看到m_ns.info.videoBytesPerSecond 的可比金额。工作时的输出是:

m_nc: NetConnection.Connect.Success
m_ns: NetStream.Play.Reset
m_ns: NetStream.Play.Start
m_ns: NetStream.Video.DimensionChange
~15-20k

当它不工作时,它是:

m_nc: NetConnection.Connect.Success
m_ns: NetStream.Play.Reset
m_ns: NetStream.Play.Start
~15-20k

Camera 示例中两种情况下的输出相同。任一示例将随机成功或失败。

如前所述,在NetStream 示例中,如果我运行回Android 设备的桌面,然后在没有关闭它的情况下返回应用程序,它会突然开始工作。在这种情况下,当我返回应用程序时,将记录 NetStream.Video.DimensionChange 事件。但是,这不适用于 Camera 示例。

我尝试过做一些事情,比如重新创建 NetStreamVideo,但这样的事情似乎不起作用。一般来说,当遇到这个问题时,Video 对象在整个程序中似乎是无用的,因为整个 Video 类似乎在内部失败。

我已经在 Galaxy Tab Pro 和我的个人 LG Access 手机上进行了尝试。这款手机的Camera 部分没有任何问题,但它绝对容易受到NetConnection 问题的影响。

有没有人认识到这一点或知道发生了什么?有谁知道修复它的好方法?从 IDE 中的移动模拟器运行它时不会发生这种情况。我正在使用 Flash Builder 4.7。谢谢!

【问题讨论】:

    标签: android flash video mobile air


    【解决方案1】:

    这显然只会在调试模式下运行时发生。当我切换到发布模式时,问题就消失了,所以 Adob​​e 的调试器出了点问题。话虽如此,我在写这个问题时使用的 AIR SDK 是 3.4(Flash Builder 4.7 的默认值),所以我不确定这个问题是否已在以后的版本中得到修复。

    我现在将发布此答案并接受它(只是因为 Stack Overflow 确实鼓励接受答案),但如果有人发布更好、更丰富的内容,我将更改我接受的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2020-03-06
      • 2011-10-22
      • 2011-07-21
      相关资源
      最近更新 更多