видеопоток: onBWDone: не определено и видео не воспроизводится

Я пытаюсь транслировать видео из службы 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

... и ничего не происходит. Ни видео, ни звука, ничего. Может ли кто-нибудь увидеть какие-либо проблемы с моим кодом?


person zakdances    schedule 10.09.2012    source источник


Ответы (2)


Я считаю, что не все потоковые приложения должны использовать функцию 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
    }
};

Дополнительные сведения можно найти в документации Adobe: http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d56e-7ffa.html

ИЗМЕНИТЬ

Что касается вашего пути к видео:

Доступ к приложениям Flash Media Server через rtmp осуществляется в следующем формате: «сервер:порт/приложение/экземпляр». Для VOD instance — это имя вашего файла, а для FLV расширение не требуется.

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

person BadFeelingAboutThis    schedule 10.09.2012
comment
Спасибо, очень приятно... похоже, это устранило ошибку onBWDone: undefined, хотя я не знаю, беспокоит ли нулевое значение для rest мое приложение CloudFront. Также интересно звучит переменная доступной пропускной способности, я не знал об этом. Однако видео по-прежнему не воспроизводится ... надеюсь, это поможет приблизиться к ответу на этот вопрос. - person zakdances; 10.09.2012
comment
Ваш код выглядит хорошо для меня. Пробовали ли вы использовать готовый проигрыватель, чтобы увидеть, возможно, проблема на сервере? Попробуйте подключиться к стробоскопу: osmf.org/configurator/fmp - person BadFeelingAboutThis; 10.09.2012
comment
onBWDone используется только для получения пропускной способности соединения, чисто необязательно, поэтому передача значения null не повлияет на вашу программу вообще. - person BadFeelingAboutThis; 10.09.2012
comment
Проверьте ответ, который я только что опубликовал. Теперь он работает в результате удаления расширения файла в моей строке videoFileName. - person zakdances; 11.09.2012
comment
У вас должно быть что-то в вашем приложении FMS, что портит .flv. По умолчанию он примет файл с расширением .flv или без него. - person BadFeelingAboutThis; 11.09.2012

Я изменился

var videoFileName:String = "myVideo.flv";

to

var videoFileName:String = "myVideo";

и теперь это работает. По какой-то причине исключение расширения файла заставляет меня работать. Не знаю почему... странно.

person zakdances    schedule 10.09.2012