gpt4 book ai didi

c# - C#FMOD实时播放流

转载 作者:行者123 更新时间:2023-12-02 22:52:06 24 4
gpt4 key购买 nike

我正在尝试实时播放流(我一直在对数据进行分页,因为它来自下一个来源),但是无论FMOD不想在第一个块加载后继续进行播放,它在播放之前先复制内存流/对其进行解码,然后在播放时不再使用我的流。

我正在使用以下播放流:

        var exinfo = new FMOD.CREATESOUNDEXINFO();
exinfo.cbsize = Marshal.SizeOf(exinfo);
exinfo.length = (uint)_buffer.Length;

_result = System.createStream(_buffer, MODE.CREATESTREAM | MODE.OPENMEMORY_POINT , ref exinfo, ref _sound);
FMODErrorCheck(_result);

_result = System.playSound(FMOD.CHANNELINDEX.FREE, _sound, false, ref _channel);
FMODErrorCheck(_result);

但是无论如何,它只会在调用playSound时播放流中的大量数据。

谁能知道如何实时修改缓冲区?流开始播放后...?

最佳答案

如果您希望流式传输原始数据,而不是PCM数据,则可以通过覆盖FMOD文件系统来实现。有两种方法可以实现此目的,第一种是通过在CreateSoundExInfo结构中设置文件回调(如果这是针对一个特定文件)的。第二个是您可以为所有FMOD文件操作全局设置文件系统(如果要对多个文件执行此操作)。

我将解释后者,但是切换到前者将是微不足道的。有关完整的示例,请引用“文件回调” FMOD示例。

函数指针:

private FMOD.FILE_OPENCALLBACK  myopen  = new FMOD.FILE_OPENCALLBACK(OPENCALLBACK);
private FMOD.FILE_CLOSECALLBACK myclose = new FMOD.FILE_CLOSECALLBACK(CLOSECALLBACK);
private FMOD.FILE_READCALLBACK myread = new FMOD.FILE_READCALLBACK(READCALLBACK);
private FMOD.FILE_SEEKCALLBACK myseek = new FMOD.FILE_SEEKCALLBACK(SEEKCALLBACK);

回调:
private static FMOD.RESULT OPENCALLBACK([MarshalAs(UnmanagedType.LPWStr)]string name, int unicode, ref uint filesize, ref IntPtr handle, ref IntPtr userdata)
{
// You can ID the file from the name, then do any loading required here
return FMOD.RESULT.OK;
}

private static FMOD.RESULT CLOSECALLBACK(IntPtr handle, IntPtr userdata)
{
// Do any closing required here
return FMOD.RESULT.OK;
}

private static FMOD.RESULT READCALLBACK(IntPtr handle, IntPtr buffer, uint sizebytes, ref uint bytesread, IntPtr userdata)
{
byte[] readbuffer = new byte[sizebytes];

// Populate readbuffer here with raw data

Marshal.Copy(readbuffer, 0, buffer, (int)sizebytes);
return FMOD.RESULT.OK;
}

private static FMOD.RESULT SEEKCALLBACK(IntPtr handle, int pos, IntPtr userdata)
{
// Seek your stream to desired position
return FMOD.RESULT.OK;
}

实现方式:
// Usual init code here...

result = system.setFileSystem(myopen, myclose, myread, myseek, 2048);
ERRCHECK(result);

// Usual create sound code here...

关于c# - C#FMOD实时播放流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3435974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com