Video 如何在Red5 IServerStream中添加实时流源? 问题
我已经在基于oflaDemo的自定义应用程序中创建并启动了Red5服务器端流,方法如下:Video 如何在Red5 IServerStream中添加实时流源? 问题,video,streaming,server-side,live,red5,Video,Streaming,Server Side,Live,Red5,我已经在基于oflaDemo的自定义应用程序中创建并启动了Red5服务器端流,方法如下: serverStream = StreamUtils.createServerStream( app , "mystream" ); // repeats /streams/prometheus.flv from oflaDemo several times (20sec): serverStream.addItem( SimplePlayItem.build( "prometheus" , 0 , 20
serverStream = StreamUtils.createServerStream( app , "mystream" );
// repeats /streams/prometheus.flv from oflaDemo several times (20sec):
serverStream.addItem( SimplePlayItem.build( "prometheus" , 0 , 20000 ) );
serverStream.addItem( SimplePlayItem.build( "prometheus" , 0 , 20000 ) );
// now I want to add "camsource" stream, wich is published from Flash client:
serverStream.addItem( SimplePlayItem.build( "camsource" , 0 , 20000 ) );
...
serverStream.play();
prometheus.flv可以很好地播放2x,但当“camsource”出现时,结果是:
[Red5\u Scheduler\u Worker-3]org.Red5.server.stream.ProviderService-尝试查找文件时出现异常:ServletContext资源[/streams/camsource.flv]无法解析为URL,因为它不存在
如何创建IServerStream来重新发布从flash客户端发布的用户流?
我可以通过Flash中的NetStream
.play(…)
看到flv流和cam流,但我无法通过编程创建IServstream以从实时源代码发布
comsource
发布和serverStream
在同一范围内
我当前的工作路径
由于,我已经创建了自己的ServerStream,在其中我可以手动推送重定向/伪造的数据包(我不确定这是否正确):
然后我创建这样的流并将其注册到appStart()
:
然后,如果我的“新闻记者”(来自Flash网络摄像头的视频源)开始广播,我会将数据包重定向到liveTVServerStream
:
public void streamPublishStart( final IBroadcastStream stream ) {
if ( !stream.getPublishedName().equals( "newsreporter" ) ) {
return;
}
logInfo( "News reporter connected - redirecting packets" );
stream.addStreamListener( new IStreamListener() {
volatile int dispatchedPacketCount = 0;
volatile int ignoredPacketCount = 0;
@Override
public void packetReceived( IBroadcastStream newsReporterStream , IStreamPacket packet ) {
if ( packet instanceof IRTMPEvent ) {
dispatchedPacketCount++;
if ( (dispatchedPacketCount % 50) == 0 ) {
logInfo( "Dispatched packets: " + dispatchedPacketCount + " ignored packets: " + ignoredPacketCount );
}
// delta-time calculations
long t1 = newsReporterStream.getCreationTime();
long t2 = liveTVServerStream.getCreationTime();
long delta = t2 - t1;
int t3 = ((IRTMPEvent) packet).getTimestamp();
t3 += delta;
((IRTMPEvent) packet).setTimestamp( t3 );
liveTVServerStream.manuallyPushPacket( packet );
} else {
ignoredPacketCount++;
}
}
} );
liveTVClientStream = new ClientBroadcastStream();
liveTVClientStream.setScope( app);
IContext context = scope.getContext();
IProviderService providerService = (IProviderService) context.getBean( IProviderService.BEAN_NAME );
providerService.registerBroadcastStream( scope , "livetv" , liveTVClientStream );
liveTVClientStream.setPublishedName( "livetv");
liveTVClientStream.setName( "livetv");
当前结果
可以找到Red5控制台的日志
“新闻记者”flash工作正常-从网络摄像头发送视频。但当我订阅观看“直播电视”流时,却没有视频。Flash部件工作-使用包含多个.flv文件的
ServerStream
对其进行测试,并正确连接和传输Flash,如实况电视。刚刚成功解决了ClientBroadcastStream
:
public void streamPublishStart( final IBroadcastStream stream ) {
if ( !stream.getPublishedName().equals( "newsreporter" ) ) {
return;
}
logInfo( "News reporter connected - redirecting packets" );
stream.addStreamListener( new IStreamListener() {
volatile int dispatchedPacketCount = 0;
volatile int ignoredPacketCount = 0;
@Override
public void packetReceived( IBroadcastStream newsReporterStream , IStreamPacket packet ) {
if ( packet instanceof IRTMPEvent ) {
dispatchedPacketCount++;
if ( (dispatchedPacketCount % 50) == 0 ) {
logInfo( "Dispatched packets: " + dispatchedPacketCount + " ignored packets: " + ignoredPacketCount );
}
// delta-time calculations
long t1 = newsReporterStream.getCreationTime();
long t2 = liveTVServerStream.getCreationTime();
long delta = t2 - t1;
int t3 = ((IRTMPEvent) packet).getTimestamp();
t3 += delta;
((IRTMPEvent) packet).setTimestamp( t3 );
liveTVServerStream.manuallyPushPacket( packet );
} else {
ignoredPacketCount++;
}
}
} );
liveTVClientStream = new ClientBroadcastStream();
liveTVClientStream.setScope( app);
IContext context = scope.getContext();
IProviderService providerService = (IProviderService) context.getBean( IProviderService.BEAN_NAME );
providerService.registerBroadcastStream( scope , "livetv" , liveTVClientStream );
liveTVClientStream.setPublishedName( "livetv");
liveTVClientStream.setName( "livetv");
现在,我们可以在其他流上设置侦听器,并将
IStreamPacket
投射到IRTMPEvent
,并通过将其放入我们的主流中。dispatchEvent
providerService.registerBroadcastStream(范围,“livetv”,liveTVClientStream);在这一行之后,客户端是否可以开始订阅此流并接收数据?我正在尝试您列出的代码,但它不起作用,调度工作正常,但似乎客户端无法实际订阅流。在我的代码中,有两个作用域(应用/作用域),这是一个错误-在任何地方使用“应用”-与从Red5获得的应用程序初始化相同的作用域。抓住我的工作现场电视课:,红色5 1.x版propably@killer_PL一年后我能问一下吗?:)将create类代码更改为ClientBroadcastStream后,与初始调用:(serverStream.addItem(SimplePlayItem.build(“livetv”,02000));)相同吗??你是如何在固定视频之后进行现场直播的?@MarceloGomes不幸的是,我从来没有将静态和实时内容结合起来。。。此外,我根本没有成功地组合实时流(很多小故障、暂停、音频去同步等)@killer_PL是的,我对Red5也有同样的问题。我试图在Wowza中开发,但我在播放列表和视频方面也有一些问题。我们没有任何可靠的服务器端流。