PDA

Просмотр полной версии : ред5+флеш видеопоток, UnsufficientBW


antoxa 07rus
20.08.2008, 11:51
Привет. Есть два флеш-скрипта client.as и server.as. Есть java-программка, установленная на ред5. server.as должен отправлять видео-поток, взятый с веб-камеры, ред5-серверу, а client.as должен принимать и отображать его. Но происходит следующее: первые две секунды client.as отображает видео нормально, но потом картинка останавливается и клиентом принимается NetStatus-сообщение UnsufficientBW. Я начинающий программист, поэтому буду особенно благодарен за как можно более короткий кусок кода, решающий эту проблему. Исходники прикладываю.

NetConnection.Connect.Success
Success: null
NetStream.Play.Reset
NetStream.Play.Start
NetStream.Play.InsufficientBW
после 5 секунд работы камеры пишет вот эту строку:
NetStream.Play.InsufficientBW
как раз вот эта строчка всё тормозит "NetStream.Play.InsufficientBW" что она может значить и как с ней бороться?


для более чательного понятия о чем идёт речь выложу код исходников:
первый исходник server.as


import flash.events.NetStatusEvent;

var nc:NetConnection;
var camera:Camera;
var microphone:Microphone;
var stream:NetStream;


function createCamera() {
tt("camCreate");
camera = Camera.getCamera ();
microphone = Microphone.getMicrophone ();

if ( camera != null )
{
var widthCam = 320;
var heightCam = 240;

camera.setMode ( widthCam, heightCam, 30 );
camera.setQuality ( 0, 80 );

widthCam = camera.width;
heightCam = camera.height;

/*var video = new Video ( widthCam, heightCam );
video.width = 360;
video.height = 320;
video.attachCamera ( camera );
addChild ( video );*/
}

}

function createStream ()
{
stream = new NetStream ( nc );
stream.addEventListener ( NetStatusEvent.NET_STATUS, netStatus );
stream.attachCamera ( camera );
stream.attachAudio ( microphone );
stream.publish ( "myId", "live" );
}

function createConnect ()
{
nc = new NetConnection ();
nc.objectEncoding = ObjectEncoding.AMF3;
nc.addEventListener ( NetStatusEvent.NET_STATUS, netStatus );
nc.connect ( "rtmp://localhost/potok" );
}

function netStatus ( event:NetStatusEvent )
{
trace ( event.info.code );
if ( event.info.code == "NetConnection.Connect.Rejected" )
{
// trace reject message
trace ( event.info.application );
}

if ( event.info.code == "NetConnection.Connect.Success" )
{
trace ( event.info.application );
createStream ();
}

}

function tt(obj) {trace(obj);}


createCamera ();
createConnect ();

------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

Второй исходник client.as

var nc:NetConnection;

function createVideo ()
{
var stream:NetStream = new NetStream ( nc );
stream.addEventListener ( NetStatusEvent.NET_STATUS, netStatus );
//stream.client = new CustomClient();
var video:Video = new Video();
video.attachNetStream ( stream );
stream.play ( "myId");
addChild ( video );
}

function createConnect ()
{
nc = new NetConnection ();
nc.objectEncoding = ObjectEncoding.AMF3;
nc.addEventListener ( NetStatusEvent.NET_STATUS, netStatus);
nc.connect ( "rtmp://localhost/potok" );
}


function netStatus ( event:NetStatusEvent ):void
{
trace ( event.info.code );
if ( event.info.code == "NetConnection.Connect.Rejected" )
{
// trace reject message
trace ("Rejected: "+ event.info.application );
}



if ( event.info.code == "NetConnection.Connect.Success" )
{
trace ("Success: "+ event.info.application );
createVideo ();
}
}




createConnect();


------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
REd5 --- Application.java файл!



package ru.sd.main;

import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IBandwidthConfigure;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.stream.IServerStream;
import org.red5.server.api.stream.IStreamCapableConnection;
import org.red5.server.api.stream.support.SimpleConnectionBWConfig;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.red5.server.api.IConnection;
import org.red5.server.adapter.ApplicationAdapter;

public class Application extends ApplicationAdapter
{


private IScope appScope;

private IServerStream serverStream;

/** {@inheritDoc} */
@Override
public boolean appStart ( IScope app )
{
appScope = app;
return true;
}


public boolean appConnect ( IConnection conn , Object[] params )
{

Log.info ( "Red5First.appConnect " + conn.getClient ().getId () );

//boolean accept = (Boolean)params[0];


//if ( !accept ) rejectClient( "you passed false..." );


if ( conn instanceof IStreamCapableConnection )
{

IStreamCapableConnection streamConn = ( IStreamCapableConnection ) conn;

SimpleConnectionBWConfig bwConfig = new SimpleConnectionBWConfig ();

bwConfig.getChannelBandwidth () [IBandwidthConfigure.OVERALL_CHANNEL] = 1024 * 1024;

bwConfig.getChannelInitialBurst () [IBandwidthConfigure.OVERALL_CHANNEL] = 128 * 1024;

streamConn.setBandwidthConfigure ( bwConfig );
}

return super.appConnect ( conn, params );

}

private static final Log Log = LogFactory.getLog( Application.class );

public void appStop ()
{
Log.info ( "Red5First.appStop" );
}



public void appDisconnect ( IConnection conn , Object[] params )
{
Log.info ( "Red5First.appDisconnect " + conn.getClient ().getId () );
}

}


Вот собственно и все !
Буду очень благодарен если подскажите выход из положения!
Заранее спасибо

terbooter
20.08.2008, 16:47
Это значит хватить портить глаза! Включите уже свет в помещении!

NetStream.Play.InsufficientBW
warning
Data is playing behind the normal speed.

DarkLight
20.08.2008, 23:31
Это проблема не клиента и не сервера, а канала их соединения. У меня такая проблема возникала, когда клиентский компьютер был в России, сервер в США и с огромными пингами. 2ой вариант - просто узкий входящий канал на клиенте/исходящий канал на сервере

antoxa 07rus
21.08.2008, 13:19
да я уже знаю что это такое, но как решить эту проблему .? есть исходники, именно вопрос КАК РЕШИТЬ ЭТУ ПРОБЛЕМУ?
нашёл два варианта решения вроде как
первый:
http://mirror1.cvsdude.com/trac/osflash/red5/changeset/1914 ---- не помогло
------------------------------------------------------------
второй:
http://livedocs.adobe.com/fms/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000113.html
---- тоже не помогло !!!!
если кто подскажет конкретное решение этой проблемы буду очень благодарен!

antoxa 07rus
05.09.2008, 15:22
всё заработало ... я нашел причину .... всем спасибо .!

terbooter
05.09.2008, 16:22
Расскажите как устранили проблему.

Omar2002
09.09.2008, 14:50
А что тут делать - проблема с каналом, а не с сервером.
Сервер присылает это сообщение в том случае, если он не может обеспечить скорость передачи данных, достаточную для воспроизведения. Т.е. если флешке не бует хватать данных для того, чтобы что-то отображать, то смысл грузить канал? Сервер сам обрубает передачу данных, а в ответ высылает клиенту(флешке) сообщение о том, что канал слишком узкий.

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

antoxa 07rus
19.09.2008, 20:08
все говорят в общим что это за проблема ...!!! как её решать никто толком и не говорит , можно это то и то .... короче рассказываю ... потратил на это уйму времени .... но всё заработало в итоге ... во первых, нужно чтобы ОБЯЗАТЕЛЬНО были в разделе webapps -->"название вашего проекта" папки streams и Web-inf ... далее в папке Web-inf нужны обязательно файлы
1."red5-web.properties";
2."red5-web.xml";
3."web.xml";


В файле "red5-web.xml" --- меняем всякие пути ДО вашей папке !
в строках:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.0.xsd">

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/red5-web.properties" />
</bean>

<bean id="web.context" class="org.red5.server.Context"
autowire="byType" />

<bean id="web.scope" class="org.red5.server.WebScope"
init-method="register">
<property name="server" ref="red5.server" />
<property name="parent" ref="global.scope" />
<property name="context" ref="web.context" />
<property name="handler" ref="web.handler" />
<property name="contextPath" value="${webapp.contextPath}" />
<property name="virtualHosts" value="${webapp.virtualHosts}" />
</bean>
// в этой строчке меняем путь к файлу "application" в папке build
<bean id="web.handler"
class="ru.sd.main.Application" />


// potok -- это моя папка моего проекта в папке webapps!
<bean id="potok.service"
class="ru.sd.main.Application" />

<bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"/>


</beans>



вообщим во всех файлах изменяем пути и названия .!!!! до своего проекта .!!! всё ...
как только я это сделал у меня всё заработало ..!! всем удачи будут вопросы обращайтесь .!