Hi Dan,
I've made a modification to the publish method in the
StreamService.java class, and it did the trick for me. Notice the
parts commented with "Added by CT..."
public void publish(String name, String mode) {
log.info("publish: " + name + ", " + mode);
IConnection conn = Red5.getConnectionLocal();
if (!(conn instanceof IStreamCapableConnection)) return;
IStreamCapableConnection streamConn =
(IStreamCapableConnection) conn;
int streamId = getCurrentStreamId();
IClientStream stream = streamConn.getStreamById(streamId);
if (stream != null && !(stream instanceof
IClientBroadcastStream)) return;
if (stream == null)
stream = streamConn.newBroadcastStream(streamId);
IClientBroadcastStream bs = (IClientBroadcastStream) stream;
try {
if (IClientStream.MODE_RECORD.equals(mode)) {
//Added by CT to play and record at the same time:
IContext context = conn.getScope().getContext();
IProviderService providerService = (IProviderService)
context.getBean(IProviderService.KEY);
bs.setPublishedName(name);
// TODO handle registration failure
if
(providerService.registerBroadcastStream(conn.getScope(), name, bs)) {
IBroadcastScope bsScope =
getBroadcastScope(conn.getScope(), bs.getPublishedName());
bsScope.setAttribute(IBroadcastScope.STREAM_ATTRIBUTE, bs);
if (conn instanceof BaseConnection)
((BaseConnection)
conn).registerBasicScope(bsScope);
}
// end add
bs.start();
bs.saveAs(name, false);
} else if (IClientStream.MODE_APPEND.equals(mode)) {
// Added by CT to play and record at the same time:
IContext context = conn.getScope().getContext();
IProviderService providerService = (IProviderService)
context.getBean(IProviderService.KEY);
bs.setPublishedName(name);
// TODO handle registration failure
if
(providerService.registerBroadcastStream(conn.getScope(), name, bs)) {
IBroadcastScope bsScope =
getBroadcastScope(conn.getScope(), bs.getPublishedName());
bsScope.setAttribute(IBroadcastScope.STREAM_ATTRIBUTE, bs);
if (conn instanceof BaseConnection)
((BaseConnection)
conn).registerBasicScope(bsScope);
}
// end add
bs.start();
bs.saveAs(name, true);
} else if (IClientStream.MODE_LIVE.equals(mode)) {
IContext context = conn.getScope().getContext();
IProviderService providerService = (IProviderService)
context.getBean(IProviderService.KEY);
bs.setPublishedName(name);
// TODO handle registration failure
if
(providerService.registerBroadcastStream(conn.getScope(), name, bs)) {
IBroadcastScope bsScope =
getBroadcastScope(conn.getScope(), bs.getPublishedName());
bsScope.setAttribute(IBroadcastScope.STREAM_ATTRIBUTE, bs);
if (conn instanceof BaseConnection)
((BaseConnection)
conn).registerBasicScope(bsScope);
}
bs.start();
}
} catch (Exception e) {
// TODO report publish error
}
}
So try replacing the original publish function in that class with
this one, and let me know if it does the trick. It worked for me.
I've been meaning to submit it back to the community but I've just
been slammed, plus I don't really know how to go about putting this
type of stuff in the trunk, nor am I any good at programming Java.
The mod I made just made sense based on the stream being published as
live -- the recorded streams didn't seem to be registering themselves
with the scope. So yeah, let me know. Thanks.
-Costin
----Original Message Follows----
From: Dan Rossi <[EMAIL PROTECTED]>
Reply-To: [email protected]
To: [email protected]
Subject: Re: [Red5] Cannot subscribe to Live Stream if its being
Recorded
Date: Tue, 12 Dec 2006 15:30:42 +1100
any solutions ?
Dan Rossi wrote:
Hi does someone have a solution for subscribing to an archiving
stream, this hack below doesnt work, the broadcast stops at the
server immediately. If i try play(stream, -1) the subscribe just
hangs like the stream isnt available even though the server
aknowledges the publish name and the server stream aware handlers
work fine and call the clients when a broadcast is happening just
cant stream.
I am using the filenamegenerator bean to record to one path, and
playback a trailer in another path, could this be the problem, ive
had my ticket open for ages now and got an ignorant response.
If i call with play(stream, -2) i get an exception
[java] [ERROR] 1020437 pool-1-thread-15:(
org.red5.io.flv.impl.FLVReader.er
ror ) Error fillBuffer
[java] java.lang.IllegalArgumentException
[java] at java.nio.ByteBuffer.allocate(ByteBuffer.java:311)
[java] at
org.red5.io.flv.impl.FLVReader.fillBuffer(FLVReader.java:242)
[java] at
org.red5.io.flv.impl.FLVReader.setCurrentPosition(FLVReader.j
ava:170)
[java] at
org.red5.io.flv.impl.FLVReader.analyzeKeyFrames(FLVReader.jav
a:527)
[java] at
org.red5.io.flv.impl.FLVReader.postInitialize(FLVReader.java:
264)
[java] at
org.red5.io.flv.impl.FLVReader.<init>(FLVReader.java:275)
[java] at org.red5.io.flv.impl.FLV.getReader(FLV.java:172)
[java] at
org.red5.server.stream.provider.FileProvider.init(FileProvide
r.java:179)
[java] at
org.red5.server.stream.provider.FileProvider.pullMessage(File
Provider.java:87)
[java] at
org.red5.server.messaging.InMemoryPullPullPipe.pullMessage(In
MemoryPullPullPipe.java:72)
[java] at
org.red5.server.stream.PlaylistSubscriberStream$PlayEngine.pu
llAndPush(PlaylistSubscriberStream.java:847)
[java] at
org.red5.server.stream.PlaylistSubscriberStream$PlayEngine.pl
ay(PlaylistSubscriberStream.java:681)
[java] at
org.red5.server.stream.PlaylistSubscriberStream.play(Playlist
SubscriberStream.java:124)
[java] at
org.red5.server.stream.StreamService.play(StreamService.java:
179)
[java] at
org.red5.server.stream.StreamService.play(StreamService.java:
187)
[java] at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcces
sorImpl.java:39)
[java] at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMet
hodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:585)
[java] at
org.red5.server.service.ServiceInvoker.invoke(ServiceInvoker.
java:161)
[java] at
org.red5.server.net.rtmp.RTMPHandler.invokeCall(RTMPHandler.j
ava:135)
[java] at
org.red5.server.net.rtmp.RTMPHandler.onInvoke(RTMPHandler.jav
a:276)
[java] at
org.red5.server.net.rtmp.BaseRTMPHandler.messageReceived(Base
RTMPHandler.java:114)
[java] at
org.red5.server.net.rtmp.RTMPMinaIoHandler.messageReceived(RT
MPMinaIoHandler.java:84)
[java] at
org.apache.mina.common.support.AbstractIoFilterChain$2.messag
eReceived(AbstractIoFilterChain.java:189)
[java] at
org.apache.mina.common.support.AbstractIoFilterChain.callNext
MessageReceived(AbstractIoFilterChain.java:502)
[java] at
org.apache.mina.common.support.AbstractIoFilterChain.access$1
000(AbstractIoFilterChain.java:52)
[java] at
org.apache.mina.common.support.AbstractIoFilterChain$EntryImp
l$1.messageReceived(AbstractIoFilterChain.java:777)
[java] at
org.red5.io.filter.ExecutorFilter.processEvent(ExecutorFilter
.java:231)
[java] at
org.red5.io.filter.ExecutorFilter$ProcessEventsRunnable.run(E
xecutorFilter.java:280)
[java] at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Thread
PoolExecutor.java:650)
[java] at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPool
Executor.java:675)
[java] at java.lang.Thread.run(Thread.java:595)
[java] [INFO] 1020453 pool-1-thread-15:(
org.red5.io.flv.impl.FLVReader.inf
o ) New position exceeds limit
[java] [INFO] 1020453 pool-1-thread-15:(
org.red5.server.stream.PlaylistSub
scriberStream.info ) Scheduled stop in: 1879753393
I just checked with FMS, and my ported application was fine,
subscribes at it records.
Alex Zimin wrote:
I have the following code and it works just fine for me.
ns.publish("stream1", "live");
ns.publish("stream2", "record");
Client, which connects to live stream, is able to play it, and
recording happens at the same time.
However I have a different problem. When I stop recording, by
issuing ns.close("stream2"); command, it closes both streams.
I am using Red5 0.6RC1.
Any help?
Thanks,
Alex.
_______________________________________________
Red5 mailing list
[email protected]
http://osflash.org/mailman/listinfo/red5_osflash.org
_______________________________________________
Red5 mailing list
[email protected]
http://osflash.org/mailman/listinfo/red5_osflash.org
_________________________________________________________________
All-in-one security and maintenance for your PC. Get a free 90-day
trial!
http://clk.atdmt.com/MSN/go/msnnkwlo0050000002msn/direct/01/?href=http://clk.atdmt.com/MSN/go/msnnkwlo0050000001msn/direct/01/?href=http://www.windowsonecare.com/?sc_cid=msn_hotmail
------------------------------------------------------------------------
_______________________________________________
Red5 mailing list
[email protected]
http://osflash.org/mailman/listinfo/red5_osflash.org