Video 如何在Red5 IServerStream中添加实时流源? 问题

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

我已经在基于oflaDemo的自定义应用程序中创建并启动了Red5服务器端流,方法如下:

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中开发,但我在播放列表和视频方面也有一些问题。我们没有任何可靠的服务器端流。