2

問題

次の方法で、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 - Exception attempting to lookup file: ServletContext resource [/streams/camsource.flv] cannot be resolved to URL because it does not exist

Flash クライアントから投稿されたユーザー ストリームを再発行する IServerStream を作成するにはどうすればよいですか?

FLVストリームとカム ストリームの両方をNetStream .play(...)Flash で見ることができますが、IServerStream をプログラムで作成してライブ ソースから公開することはできません。

comsourceパブリッシング とはserverStream同じスコープ内にあります。

私の現在の作業パス

Red5 グループのこの応答により、リダイレクトされた/偽のパケットを手動でプッシュできる独自の 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 による Web カメラからのビデオ ソース) がブロードキャストを開始した場合、パケットを次の場所にリダイレクトします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 コンソールのログは、ここにあります。

「ニュースレポーター」のフラッシュは正常に動作します - ウェブカメラからビデオを送信します。しかし、「livetv」ストリームを視聴するためにサブスクライブすると、ビデオがありません。Flash パーツは動作します -ServerStreamライブ TV のように、いくつかの .flv ファイルをキューに入れ、Flash を接続して適切にストリーミングしてテストしました。

4

1 に答える 1

2

でうまく解決しました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");

これで、他のストリームにリスナーを設定し、キャストIStreamPacketIRTMPEventてメインストリームに入れることができます。.dispatchEvent

于 2013-10-11T08:59:45.693 に答える