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

How to access the value of a parameter from an Action<> called with a lambda expression in C# and store it in an array

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

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

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

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; 没有将接收到的浮点值分配给变量.

任何帮助将不胜感激。

从你的例子看来,你想将参数存储在二进制文件中,然后将流字节存储在内存中以备将来使用。

您可以在 class 中声明数据成员 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();
    }
}