首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FMOD,自定义DSP的音频记录,如何?

FMOD,自定义DSP的音频记录,如何?
EN

Stack Overflow用户
提问于 2017-07-06 03:46:05
回答 1查看 344关注 0票数 1

所以我对FMOD还是个新手。我在一个游戏的视频编码器中工作,基本上我将帧缓冲区和音频缓冲区发送到我的本地dll,后者通过ffmpeg对其进行编码。现在,我正在尝试获取每个“音频帧”的音频缓冲区,按照我的理解,方法是创建一个自定义的DSP,将其附加到头部(或之前)并复制缓冲区。

下面是我的代码(它是c#):

自定义DSP:

代码语言:javascript
复制
public class FMOD_AudioRecodingDSP
{
    public static DSP_DESCRIPTION CreateDSPDesc(out FMOD_AudioRecodingDSP dspObj)
    {
        dspObj = new FMOD_AudioRecodingDSP();
        var desc = new DSP_DESCRIPTION()
        {
            name = "AudioExport".ToCharArray(),
            version = 1,
            numinputbuffers = 1,
            numoutputbuffers = 1,
            read = dspObj.ReadAudioData,
        };

        return desc;
    }

    public RESULT ReadAudioData(ref DSP_STATE dsp_state, IntPtr inbuffer, IntPtr outbuffer, uint length, int inchannels, ref int outchannels)
    {
        UnityEngine.Debug.Log("Working???");

        outbuffer = inbuffer;
        outchannels = inchannels;

        return RESULT.OK;
    }
}

我的“添加DSP”代码:

代码语言:javascript
复制
FMOD.ChannelGroup master;
lowlevelSystem.getMasterChannelGroup(out master);
master.getDSP(0, out mixerHead);
mixerHead.setMeteringEnabled(false, true);

// Trying to get a custom DSP in to FMOD to record audio for video
FMOD.RESULT res = FMOD.RESULT.OK;
uint dspHandle;
FMOD.DSP_DESCRIPTION dspDesc = FMOD_AudioRecodingDSP.CreateDSPDesc(out DSPObject);
res = lowlevelSystem.registerDSP(ref dspDesc, out dspHandle);
res = lowlevelSystem.createDSP(ref dspDesc, out AudioRecordingDSP);

// Try 1
//res = master.addDSP(0, AudioRecordingDSP);
//

// Try 2
FMOD.DSP limiterDSP;
res = master.getDSP(1, out limiterDSP);

FMOD.DSPConnection conType;
res = AudioRecordingDSP.addInput(limiterDSP, out conType, FMOD.DSPCONNECTION_TYPE.SIDECHAIN);

res = AudioRecordingDSP.setActive(true);
res = AudioRecordingDSP.setBypass(false);

你可以看到我的“Try 1”和“Try 2”…当我使用“Try 1”时,我让它在启动时调用我的DSP几次,然后它停止调用它。(这对我来说是最令人困惑的事情)使用“尝试2”我的DSP永远不会被称为…。

我尝试了所有不同的连接类型(标准,SIDE_CHAIN,发送...)

那么我错过了什么呢?我的理解正确吗?

提前感谢!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-02 17:08:11

所以我找到了问题所在。DSP被定义为托管内存中的对象(在C#中):

代码语言:javascript
复制
public class FMOD_AudioRecodingDSP
{
    public static DSP_DESCRIPTION CreateDSPDesc(out FMOD_AudioRecodingDSP dspObj)
    {
        dspObj = new FMOD_AudioRecodingDSP();
        var desc = new DSP_DESCRIPTION();

        return desc;
    }
}

但是对FMOD的调用是本机调用,并且我没有保留对FMOD_AudioRecodingDSP对象实例的引用。因此GC最终删除了该实例。解决方案是将类设置为静态的,并将函数指针传递给静态函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44934764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档