5

我不知道如何使用客户端上的 FluorineFx 将音频流从客户端发布到服务器。我们希望通过已经建立的 NetConnection 将录制的音频数据从客户端流式传输到流中。FluorineFx 中有一个 NetStream 类,但它没有发布方法。FluorineFx 中的 NetStream 类只有 play 方法。但据我了解,这会在客户端播放来自服务器的流。

发布未在 FluorineFx 中实现还是我错过了什么?

4

3 回答 3

2

查看http://www.fluorinefx.com/docs/fluorine/

请参阅实时消息下的发布流和订阅流

于 2010-08-20T13:50:24.933 回答
0

不幸的是,这个功能似乎没有实现。

于 2011-03-16T15:38:59.037 回答
0

最近,我也在研究 fluorinefx 的代码。奇怪的是为什么发布没有在代码中实现,尽管文档提到了它。

实际上,在其 PlayEngine.cs 中,有一个类似的实现 PullAndPush(),它可以从 FLV 文件中提取数据并将其推送到远程。

所以,我在 Netstream 类中尝试了一些类似的代码,它几乎可以工作,并且可以将流推送到rtmplite服务器,并且可以在rtmplite中的测试网站上播放。

public void Publish(params object[] arguments)
        {
            ValidationUtils.ArgumentConditionTrue(arguments != null && arguments.Length > 0, "arguments", "At least the name of a file must be specified");
            ValidationUtils.ArgumentNotNullOrEmptyOrWhitespace(arguments[0] as string, "name");
            _name = arguments[0] as string;


            INetConnectionClient client = _connection.NetConnectionClient;
            RtmpConnection connection = _connection.NetConnectionClient.Connection as RtmpConnection;
            IPendingServiceCallback callback = new CreateStreamCallBack(this, connection, new PublishCallBack(this,_connection, _name));
            client.Call("createStream", callback);
        }

        public void AttachFile(string filepath)
        {

            FileProvider fileProvider = new FileProvider(this.Scope, new System.IO.FileInfo(filepath));
            _pullPushPipe.Subscribe(fileProvider, null);
            PullAndPush();
        }

        public void PullAndPush()
        {

            while(true)
            {
                var msg = _pullPushPipe.PullMessage();
                if (msg == null)
                {
                    // No more packets to send
                    Stop();
                    break;
                }
                else
                {
                    if (msg is RtmpMessage)
                    {
                        RtmpMessage rtmpMessage = (RtmpMessage)msg;
                        IRtmpEvent body = rtmpMessage.body;
                     //   SendMessage(rtmpMessage);
                        // Adjust timestamp when playing lists
                        //  EnsurePullAndPushRunning();
                        _pullPushPipe.PushMessage(msg);
                    }
                }
            }
        }

        class PublishCallBack : IPendingServiceCallback
        {
            NetConnection _connection;
            NetStream _stream;
            string _name;
            string _mode;

            public PublishCallBack(NetStream stream, NetConnection connection, string name, string mode = "live")
            {
                _connection = connection;
                _name = name;
                _mode = mode;
                _stream = stream;
            }

            public void ResultReceived(IPendingServiceCall call)
            {
                if ("createStream".Equals(call.ServiceMethodName))
                {
                    RtmpConnection connection = _connection.NetConnectionClient.Connection as RtmpConnection;
                    object[] args = new object[2] {_name, _mode};
                    PendingCall pendingCall = new PendingCall("publish", args);
                    pendingCall.RegisterCallback(new PublishResultCallBack());
                    connection.Invoke(pendingCall, (byte)connection.GetChannelForStreamId(_stream.StreamId));
                }
            }
        }
于 2016-06-11T12:24:52.407 回答