我不知道如何使用客户端上的 FluorineFx 将音频流从客户端发布到服务器。我们希望通过已经建立的 NetConnection 将录制的音频数据从客户端流式传输到流中。FluorineFx 中有一个 NetStream 类,但它没有发布方法。FluorineFx 中的 NetStream 类只有 play 方法。但据我了解,这会在客户端播放来自服务器的流。
发布未在 FluorineFx 中实现还是我错过了什么?
我不知道如何使用客户端上的 FluorineFx 将音频流从客户端发布到服务器。我们希望通过已经建立的 NetConnection 将录制的音频数据从客户端流式传输到流中。FluorineFx 中有一个 NetStream 类,但它没有发布方法。FluorineFx 中的 NetStream 类只有 play 方法。但据我了解,这会在客户端播放来自服务器的流。
发布未在 FluorineFx 中实现还是我错过了什么?
查看http://www.fluorinefx.com/docs/fluorine/
请参阅实时消息下的发布流和订阅流。
不幸的是,这个功能似乎没有实现。
最近,我也在研究 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));
}
}
}