Кто-нибудь сталкивался с этой ошибкой? RTMP потоковое видео заканчивается на 3-4 секунды слишком рано? - PullRequest
2 голосов
/ 25 января 2010

В прошлом я создал проигрыватель для клиента, использующего его сервер LimeLight для потоковой передачи видео, и раньше у меня не было проблем, однако для нового клиента, использующего другой сервер LimeLight, видео, похоже, заканчивается также на 3-4 секунды рано.

Мои следы на 3 совершенно разных видео, которые я тестировал:

metadata duration = 32        // 32 secs long, ends at 27
Stop [27.350 seconds] = 4.65 

metadata duration = 17        // 17 secs long, ends at 12
Stop [12.852 seconds] = 4.148

metadata duration = 258       // 258 secs long, ends at 255
Stop [255.861 seconds]

В видеопроигрывателях я проверяю на NetStream.Play.Stop, затем помещаю туда функцию типа «сброс». Однако эта функция срабатывает слишком рано из-за этой странной ошибки. Кто-нибудь видел это раньше?


private function netStatusHandler(event:NetStatusEvent):void 
    {
        trace("connected is: " + nc.connected );

        switch (event.info.code) 
        {
            case "NetConnection.Connect.Success":
                trace("Connected");
                connectStream();
                break;

            case "NetStream.Play.Start":
                trace("********** Start [" + ns.time.toFixed(3) + " seconds]");
            break;

            case "NetStream.Play.Stop":
                trace("‹ ----------- Playback has stopped. ----------- ›");
                trace("Stop [" + ns.time.toFixed(3) + " seconds]");
                if (nsBuffering){ removeChild(bufferAni); }
                nsBuffering = false;
                videoStatus = "NotPlaying";
                resetVideo(); //<- Video ends so go back to start
                // ^ This triggers too early
            break;
        }
    }

Единственный обходной путь, который я вижу для этого, - это сохранение начального числа, полученного из продолжительности метаданных, и запуск таймера для постоянной проверки соответствия текущего ns.time метаданных, а затем запуска функции сброса.

Ответы [ 2 ]

7 голосов
/ 26 января 2010

Я НАШЕЛ ИСПРАВИТЬ!

http://www.wildform.com/support/tutorials/loopingFLVs/

Мне нужно было сначала проверить, когда netstream нажал play.stop, а затем вызвать функцию сброса, когда буфер был пуст ...

Код на сайте AS2, но я преобразовал его в AS3:

.

private function netStatusHandler(event:NetStatusEvent):void 
    {
        trace("connected is: " + nc.connected );

        switch (event.info.code) 
        {
            case "NetConnection.Connect.Success":
                trace("Connected");
                connectStream();
                break;

            case "NetStream.Buffer.Empty":
                trace("‹ ----------- Buffer is Empty! ----------- ›");
                if (nsBuffering){ removeChild(bufferAni); }
                nsBuffering = false;

                if (videoFinished) // < Now I can run my reset
                {
                    resetVideo();
                    videoFinished = false;
                }

            break;

            case "NetStream.Buffer.Full":
                trace("‹ ----------- Buffer is FULL! ----------- ›");
                if (nsBuffering){ removeChild(bufferAni); }
                nsBuffering = false;
            break;

            case "NetStream.Buffer.Flush":
                trace("Data has finished streaming, remaining buffer will be emptied.");
                videoStatus = "NotPlaying";
            break;

            case "NetStream.Play.Stop":
                trace("‹ ----------- Playback has stopped. ----------- ›");

                videoFinished = true; // < This first
            break;
        }
    }
3 голосов
/ 01 декабря 2012

Я знаю, что эта ветка невероятно старая, но я билась головой, пытаясь решить эту проблему; и кроме вашего решения, в Интернете ничего особенного нет.

Итак, я понял это. Если вы используете rtmp, , вам нужно изменить bufferTime на false.

Так как rtmp НЕ кеширует, нет необходимости в буфере времени, и если вы его установите, вы ограничиваете себя, и в итоге буфер будет пуст.

ns.bufferTime = false;
...