0

我正在尝试从 Amazon 的 CloudFront/S3 服务流式传输视频。尽管我的文件名是正确的,并且状态为“NetConnection.Connect.Success”,但我的 NetConnection onBWDone 回调给了我一个“未定义”错误,并且视频没有播放或出现在舞台上的任何地方。连接报告它是成功的,所以我不知道问题出在哪里。这是我的代码:

var amazonCloudFrontDomain:String = "myCloudFrontDistributionID.cloudfront.net";
var amazonCloudFrontStreamURL:String = "rtmp://" + amazonCloudFrontDomain + "/cfx/st/";
var videoFileName:String = "myVideo.flv";

Security.allowDomain(amazonCloudFrontDomain);
Security.allowDomain("rtmp://" + amazonCloudFrontDomain);
Security.allowDomain(amazonCloudFrontStreamURL);


var client:Object = new Object();
client.onBWDone   = function(e){trace("onBWDone: " + e);}
client.onMetaData = function(e){trace("onMetaData: " + e);}
client.onCuePoint = function(e){trace("onCuePoint: " + e);}


var video:Video = new Video(300, 400);  //  create a new Video item and set its width and height
video.x = 0;  //  position the video's x position
video.y = 0;  //  position the video's y position
var duration:Number;  //  use this later to get the duration of the video being played
this.addChild(video);

var nc:NetConnection = new NetConnection();  //  variable for a new NetConnection
nc.client = client;
nc.addEventListener(NetStatusEvent.NET_STATUS,netConnectionStatusHandler,false,0,true);
nc.connect(amazonCloudFrontStreamURL);  //  set the nc variable to null

var ns:NetStream;
function netConnectionStatusHandler(e):void
{
    switch(e.info.code)
    {
        case "NetConnection.Connect.Success":
            trace("S3 Connected");

            ns = new NetStream(nc);  // create a variable for a new NetStream connection & connect it to the nc variable
            ns.addEventListener(NetStatusEvent.NET_STATUS, netStreamStatusHandler);  //  add a listener to the NetStream to listen for any changes that happen with the NetStream
            ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, netStreamAsyncErrorHandler);  //  add a listener to the NetStream for any errors that may happen
            ns.client = client;

            video.attachNetStream(ns);  // attach the NetStream variable to the video object
            video.smoothing = true;
            video.deblocking = 1;

            ns.bufferTime = 5;  // set the buffer time to 5 seconds
            ns.play(videoFileName);  //  tell the netstream what video to play and play it
            break;
    }
    trace(e.info.code);
}


function netStreamAsyncErrorHandler(Event:AsyncErrorEvent):void
{
    // trace(event.text);  // this will handle any errors with video playback
}

function netStreamStatusHandler(event:NetStatusEvent):void
{
    trace(event.info.code);  // this will handle any events that are fired when the video is playing back
    switch(event.info.code)  //  switch statement to handle the various events with the NetConnection
    {

        case "NetStream.Buffer.Full":  //  when the buffer is full fire the code below
            ns.bufferTime = 10;  // set buffer time to 10 seconds       break;
        case "NetStream.Buffer.Empty":  //  when the buffer is empty fire, code below
            ns.bufferTime = 10;  // set buffer time to 10 seconds
        break;
        case "NetStream.Play.Start":  //  when the video starts playing, fire the code below
            ns.bufferTime = 10;  // set the buffer time to 10 seconds
        break;
        case "NetStream.Seek.Notify":  // when you seek with the scrubber it sends a notify signal of the time
            ns.bufferTime = 10;  // set the buffer time to 10 seconds
        break;
        case "NetStream.Seek.InvalidTime":  // when you release the scrubber ahead of the video that has been loaded, you get this error.  it will jump you back to the last frame that has been loaded
            ns.bufferTime = 10;  // set the buffer time to 10 seconds
        break;
        case "NetStream.Play.Stop":  // when you reach the end of the video
            ns.pause();  // pause the video
            ns.seek(1);  // seek the video to the first frame
        break;
    }
}

这是控制台输出:

S3 Connected
netConnectionStatusHandler: NetConnection.Connect.Success
onBWDone: undefined
NetStream.Play.Reset
NetStream.Play.Start

……什么也没有发生。没有视频,没有音频,什么都没有。任何人都可以看到我的代码有任何问题吗?

4

2 回答 2

1

我相信并不是所有的流媒体应用程序都必须使用 onBWDone 函数,所以如果他们不使用它,它可能会将 null 或 undefined 传递给函数而不是 kbps。

因此,您的问题可能出e在下面的跟踪语句中:

client.onBWDone   = function(e){trace("onBWDone: " + e);}

此外,该函数不接收事件对象,而是接收... rest通常只有一个项目的数组。试试这个:

client.onBWDone   = function(... rest){  //
    if(rest && rest.length > 0){  //since the function might not get any data, you need to check before trying to trace it out
        trace("onBWDone: " + rest[0]); //this is the kbps of the bandwidth available
    }
};

您可以在 Adob​​e 文档中了解更多信息:http: //help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d56e-7ffa.html

编辑

关于您的视频路径:

Flash Media Server 应用程序通过 rtmp 以下列格式访问:“server:port/application/instance”。对于 VOD,instance 是文件的名称,对于 FLV,它不需要扩展名。

http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773cfae-7ff3.html

于 2012-09-10T02:33:18.540 回答
0

我变了

var videoFileName:String = "myVideo.flv";

var videoFileName:String = "myVideo";

现在它可以工作了。出于某种原因,排除文件扩展名使它对我有用。我不知道为什么……奇怪。

于 2012-09-10T22:49:31.590 回答