Как опубликовать аудиопоток от клиента с помощью FluorineFx?

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

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


person Jan Deinhard    schedule 20.08.2010    source источник


Ответы (3)


Посетите http://www.fluorinefx.com/docs/fluorine/.

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

person adamcodes    schedule 20.08.2010
comment
Спасибо, но я уже читал эту статью. Проблема такова: в классе NetStream в FluorineFx нет методов attachAudio или publish. Я думаю, что они говорят о стороне Flex в этой статье. - person Jan Deinhard; 21.08.2010

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

person Jan Deinhard    schedule 16.03.2011
comment
Теперь, возможно ли опубликовать в fluorinefx? ns.publish(publishName.text,"record"); - person ketan; 03.04.2015

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

На самом деле, в его 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));
                }
            }
        }
person user6453459    schedule 11.06.2016