在 Android 设备上调试时,Video 对象有时会拒绝播放 Camera 或 NetStream 对象
When debugging on an Android device, Video objects sometimes refuse to play a Camera or a NetStream object
我使用 Flash 编写代码已有一段时间,但我还没有在 AIR Mobile 上进行大量工作。也就是说,当通过 USB 在 Android 设备上调试时,Video
对象有时在连接 Camera
或 NetStream
对象时工作正常,有时它们拒绝做任何事情.在 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
为例,运行第一部分直接从IDE出来,作为桌面AIR应用,而运行第二部分就Android 设备通过 IDE 通过 USB 线。对于 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
示例。
我试过做一些事情,比如重新创建 NetStream
或 Video
,但类似的东西似乎不起作用。一般来说,当遇到这个问题时,Video
对象在整个程序中似乎是无用的,因为整个 Video
class 似乎在内部失败。
我已经在 Galaxy Tab Pro 和我个人的 LG Access phone 上试过了。 phone 与 Camera
部分没有任何问题,但它肯定容易受到 NetConnection
问题的影响。
有没有人认识到这一点或知道发生了什么事?有谁知道解决它的好方法?当 运行 在 IDE 中将其从移动模拟器中删除时,不会发生这种情况。我正在使用 Flash Builder 4.7。谢谢!
这显然只会在 运行 处于调试模式时发生。当我切换到发布模式时,问题就消失了,所以 Adobe 的调试器出了点问题。也就是说,我在写这个问题时使用的 AIR SDK 是 3.4(Flash Builder 4.7 的默认设置),所以我不确定这是否已在以后的版本中修复。
我现在要 post 这个答案并接受它(只是因为 Stack Overflow 真的鼓励接受答案),但是如果有人 post 的东西更好,信息更丰富,我'我会更改我接受的答案。
我使用 Flash 编写代码已有一段时间,但我还没有在 AIR Mobile 上进行大量工作。也就是说,当通过 USB 在 Android 设备上调试时,Video
对象有时在连接 Camera
或 NetStream
对象时工作正常,有时它们拒绝做任何事情.在 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
为例,运行第一部分直接从IDE出来,作为桌面AIR应用,而运行第二部分就Android 设备通过 IDE 通过 USB 线。对于 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
示例。
我试过做一些事情,比如重新创建 NetStream
或 Video
,但类似的东西似乎不起作用。一般来说,当遇到这个问题时,Video
对象在整个程序中似乎是无用的,因为整个 Video
class 似乎在内部失败。
我已经在 Galaxy Tab Pro 和我个人的 LG Access phone 上试过了。 phone 与 Camera
部分没有任何问题,但它肯定容易受到 NetConnection
问题的影响。
有没有人认识到这一点或知道发生了什么事?有谁知道解决它的好方法?当 运行 在 IDE 中将其从移动模拟器中删除时,不会发生这种情况。我正在使用 Flash Builder 4.7。谢谢!
这显然只会在 运行 处于调试模式时发生。当我切换到发布模式时,问题就消失了,所以 Adobe 的调试器出了点问题。也就是说,我在写这个问题时使用的 AIR SDK 是 3.4(Flash Builder 4.7 的默认设置),所以我不确定这是否已在以后的版本中修复。
我现在要 post 这个答案并接受它(只是因为 Stack Overflow 真的鼓励接受答案),但是如果有人 post 的东西更好,信息更丰富,我'我会更改我接受的答案。