如何从 Action<> 访问参数的值,该操作在 C# 中使用 lambda 表达式调用并将其存储在数组中



我正在开发一个使用 Unity 3D 开发的应用程序,该应用程序使用 Photon 网络和 Photn 语音库。我想接收音频流,将其存储在流中,然后将其保存在 WAV 文件中。从光子语音论坛的支持下,我被告知使用:

PhotonVoiceNetwork.Client.OnAudioFrameAction += (playerId, voiceId, frame) => Debug.LogFormat("***** {0} {1} {2}", playerId, voiceId, frame[0]);

我可以看到打印在日志上的收到的浮点帧的值,但我不知道如何使用他们指出的那个操作来访问浮点帧值。这是原始操作声明:

public Action<int, byte, float[]> OnAudioFrameAction { get; set; }

我正在考虑用这样的东西存储音频帧:

float[] samples;
PhotonVoiceNetwork.Client.OnAudioFrameAction += (playerId, voiceId, frame) => samples = frame;
MemoryStream stream = new MemoryStream();
BinaryWriter bw = new BinaryWriter(stream);
bw.Write(samples);
bw.Flush();
byte[] floatBytes = stream.ToArray();

上面的代码不起作用,如编译器bw.Write(samples);行中说变量尚未初始化,这意味着PhotonVoiceNetwork.Client.OnAudioFrameAction += (playerId, voiceId, frame) => samples = frame;没有将接收到的浮点值分配给变量。

任何帮助将不胜感激。

从您的示例中可以看出,您希望将参数存储在二进制文件中,然后将流字节存储在内存中以备将来使用。

可以在类中声明数据成员private byte[] m_floatBytes;,并注册到操作,如下所示:

PhotonVoiceNetwork.Client.OnAudioFrameAction += (playerId, voiceId, frame) => 
{
using (MemoryStream stream = new MemoryStream())
{
BinaryWriter bw = new BinaryWriter(stream);
bw.Write(frame);
bw.Flush();
bw.Close();
m_floatBytes = stream.ToArray();
}
}

最新更新