Как опубликовать аудиопоток с клиента с помощью FluorineFx? - PullRequest
5 голосов
/ 20 августа 2010

Я не могу понять, как опубликовать аудиопоток с клиента на сервер, используя FluorineFx на клиенте. Мы хотим передавать записанные аудиоданные с клиента в поток через уже установленное NetConnection. В FluorineFx есть класс NetStream, но у него нет метода публикации. Класс NetStream в FluorineFx имеет только метод play. Но, насколько я понимаю, это проигрывает поток с сервера на клиенте.

Публикация не реализована во FluorineFx или я что-то пропустил?

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Оформить http://www.fluorinefx.com/docs/fluorine/

См. Публикация потоков и подписка на потоки в Обмен сообщениями в режиме реального времени .

0 голосов
/ 11 июня 2016

В последнее время я тоже заглядываю в коды фторфеникс.Странно, почему публикация не реализована в кодах, хотя документ упомянул об этом.

На самом деле, в его 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));
                }
            }
        }
0 голосов
/ 16 марта 2011

К сожалению, эта функция, похоже, не реализована.

...