Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Video streaming и progressive download (http://www.flasher.ru/forum/showthread.php?t=154007)

MY3bIKAHT 11.04.2011 14:00

Video streaming и progressive download
 
Добрый день! Вот уже несколько дней пишу видео плеер для проигрывания потока с сервера (wowza media server). Столкнулся с такой проблемой. Когда проигрываю поток в "режиме stream", используя метод seek() можно бегать по видео и грузить поток с любой точки (что-то похожее на ютуб), но когда видео просто лежит на винте этого делать нельзя.
Вопрос: Можно ли проигрывать (не дожидаясь его полной загрузки) и грузить видео с любой точки которое просто лежит на винте? Если да, то как это можно реализовать?

Вот мой код, он пока не доработанный но может кому-то пригодится:

Код AS3:

import flash.events.*;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
Security.LOCAL_TRUSTED;
NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0;
var streamUrl:String = "mp4:sample.mp4";
var serverUrl:String = "rtmp://localhost/vod";
var streamStatus:String;
var duration:Number;
var objInfo:Object;
var tmrUpdate:Timer;
var connected:Boolean;
var connection:NetConnection = null;
var stream:NetStream = null;
function serverConnect()
{
        connection = new NetConnection();
        connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
        connection.connect(serverUrl);
}
function streamConnect()
{
        stream = new NetStream(connection);
        stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
        stream.bufferTime = 50;
        stream.client = new Object();
        stream.client.onMetaData = function(meta:Object):void
        {
        trace("metadata: duration=" + meta.duration + " width=" + meta.width + " height=" + meta.height + " framerate=" + meta.framerate);
        duration = meta.duration
        tmrUpdate.start();
        };
        videoHolder.attachNetStream(stream);
}
function initVideoPlayer():void
{
        serverConnect();
        mcVideoControls.controlsHolder.pauseBtn.visible = false;
        mcVideoControls.controlsHolder.playBtn.visible = true;
        mcVideoControls.controlsHolder.playProgress.scaleX = 0;
        mcVideoControls.controlsHolder.downloadProgress.scaleX = 0;
        mcVideoControls.controlsHolder.playProgressThin.scaleX = 0;
        mcVideoControls.controlsHolder.downloadProgressThin.scaleX = 0;
        mcVideoControls.controlsHolder.pauseBtn.addEventListener(MouseEvent.CLICK, Pause);
        mcVideoControls.controlsHolder.playBtn.addEventListener(MouseEvent.CLICK, Play);
        mcVideoControls.controlsHolder.seekBtn.addEventListener(MouseEvent.CLICK, Seek);
        tmrUpdate = new Timer(100);
        tmrUpdate.addEventListener(TimerEvent.TIMER, updateValues);
}
initVideoPlayer();
function Play(e:MouseEvent)
{
        if (streamStatus == "pause")
        {
                stream.resume();
        }
        else
        {
                stream.play(streamUrl);
        }
        streamStatus = "play";
        mcVideoControls.controlsHolder.pauseBtn.visible = true;
        mcVideoControls.controlsHolder.playBtn.visible = false;
}
function Pause(e:MouseEvent)
{
        streamStatus = "pause";
        stream.pause();
        mcVideoControls.controlsHolder.pauseBtn.visible = false;
        mcVideoControls.controlsHolder.playBtn.visible = true;
 
}
function Seek(e:Event)
{
        stream.seek(Math.round(this.mouseX * duration / 700));
}
function updateValues(e:TimerEvent):void
{
        mcVideoControls.controlsHolder.playProgressThin.scaleX = mcVideoControls.controlsHolder.playProgress.scaleX = stream.time / duration;
        mcVideoControls.controlsHolder.downloadProgressThin.scaleX = mcVideoControls.controlsHolder.downloadProgress.scaleX = stream.bytesLoaded / stream.bytesTotal;
}
function netStatusHandler(event:NetStatusEvent):void
{
        trace("event.info.code "+event.info.code);
        switch (event.info.code)
        {
                case "NetConnection.Connect.Success" :
                        streamConnect();
                        break;
                case "NetStream.Play.Start" :
                        break;
                case "NetStream.Play.Stop" :
                        initVideoPlayer();
                        break;
                case "NetStream.Play.StreamNotFound" :
                        trace("Stream not found: " + streamUrl);
                        break;
                case "NetStream.Publish.Start" :
                        break;
                case "NetStream.Play.UnpublishNotify" :
                        break;
                default :
        }
}

Спасибо!

tema_604 29.04.2011 11:31

Метод seek() работает только с RTMP потоком. В случае прогрессивного скачивания вы не можете производить поиск по незагруженным фрагментам. Если у вас Apache, вы можете скачать и установить Adobe Origin http Module - это позволит вам воспроизводить динамический поток по http протоколу, со всеми вытекающими - работающим поиском по треку.

На эту тему есть видеурок. В третьей части рассказывается про установку и настройку данного модуля.

Так же существуют, так называемые, механизмы организации псевдопотока по http. Подробнее вы можете прочитать на страницах этих проектов:
1. H264 Streaming Module для Apache
2. FLV streaming module для Lighttpd

gingerfox 12.05.2011 18:28

будет ли работать stream.resume(); и stream.pause(); если я отключаюсь от сервера?
если нет, то как закачать flv по rtmp и работать с ним в оффлайн?


Часовой пояс GMT +4, время: 03:39.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.