video - 如何在Red5 IServerStream中添加直播源?

标签 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 , 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 可以很好地播放 2 倍,但是当“camsource”出现时,结果是:

[Red5_Scheduler_Worker-3] org.red5.server.stream.ProviderService - 尝试查找文件时出现异常:ServletContext 资源 [/streams/camsource.flv] 无法解析为 URL,因为它不存在

如何创建重新发布从 Flash 客户端发布的用户流的 IServerStream?

我可以在 Flash 中通过 NetStream .play(...) 查看 flv 流和 cam 流,但我无法以编程方式创建 IServerStream 来从实时源发布。

comsource 发布和 serverStream 属于同一范围。

我当前的工作路径

由于 This response on Red5 group ,我创建了自己的 ServerStream,在其中我可以手动推送重定向/假数据包(我不确定这是否正确完成):

public static class LiveTVServerStream extends ServerStream {

    public void manuallyPushPacket( IStreamPacket packet ) {
        for ( IStreamListener listener : getStreamListeners() ) {
            listener.packetReceived( this , packet );
        }
    }
}

然后我创建这样的流并将其注册到 appStart() 中:

liveTVServerStream = new LiveTVServerStream();
liveTVServerStream.setScope( appScope );
liveTVServerStream.setName( "livetv" );
liveTVServerStream.setPublishedName( "livetv" );
// Add single starting video because ServerStream requires at least 1 item
liveTVServerStream.addItem( SimplePlayItem.build( "prometheus" , 0 , 20000 ) );
liveTVServerStream.start();

IContext context = scope.getContext();
IProviderService providerService = (IProviderService) context.getBean( IProviderService.BEAN_NAME );
providerService.registerBroadcastStream( scope , "livetv" , liveTVServerStream);

然后,如果我的“新闻记者”(来自 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++;
            }

        }
    } );

当前结果

Red5控制台日志可以查到here .

“新闻记者”Flash 工作正常 - 从网络摄像头发送视频。但是当我订阅观看“livetv”流时,没有视频。 Flash 部件可以正常工作 - 使用 ServerStream 对其进行测试,其中包含队列中的多个 .flv 文件,并且 Flash 已正确连接和流式传输,就像直播电视一样。

最佳答案

刚刚使用ClientBroadcastStream成功解决了:

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 将其放入我们的主流中

关于video - 如何在Red5 IServerStream中添加直播源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19270478/

相关文章:

python - 输出视频没有声音

ios - 在 iOS 6 及更高版本上与 YouTube 和 Twitter 共享视频文件

ssl - 广播rtmp流到许多服务器

streaming - 最大喷嘴容量

c# - 客户端代码如何在服务器端运行?

php - 我的 PHP 服务器端验证代码有问题

ios - 如何从 PC 访问通过 iTunes 同步的 iPhone 中的视频

php - 如何在网站上安全地允许视频嵌入 html?

java - servlet + 视频流 + ClientAbortException

php - 在大型网站上平衡服务器端和客户端代码