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 () );
}
}
Вот собственно и все !
Буду очень благодарен если подскажите выход из положения!
Заранее спасибо
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 () );
}
}
Вот собственно и все !
Буду очень благодарен если подскажите выход из положения!
Заранее спасибо