Unity3d 从麦克风源播放音频时,不会调用FMOD pcmreadcallback
我正在编写一个Unity类来捕获和回放来自麦克风的音频数据。播放部分工作正常我可以在耳机中听到我的声音,但我无法访问音频样本,因为在播放过程中从未调用pcmsetposcallback。在createSound方法中只调用一次。我想我错过了一些设置,也尝试了几个或组合的FMOD.MODE标志,但没有运气。 我在Windows7下使用fmodstudio10510.unitypackage并进行测试,但它应该具有完全的croos平台支持。 提前谢谢。 沃尔特Unity3d 从麦克风源播放音频时,不会调用FMOD pcmreadcallback,unity3d,playback,microphone,fmod,Unity3d,Playback,Microphone,Fmod,我正在编写一个Unity类来捕获和回放来自麦克风的音频数据。播放部分工作正常我可以在耳机中听到我的声音,但我无法访问音频样本,因为在播放过程中从未调用pcmsetposcallback。在createSound方法中只调用一次。我想我错过了一些设置,也尝试了几个或组合的FMOD.MODE标志,但没有运气。 我在Windows7下使用fmodstudio10510.unitypackage并进行测试,但它应该具有完全的croos平台支持。 提前谢谢。 沃尔特 录音系统没有通过pcmreadcall
录音系统没有通过pcmreadcallback,这就是为什么你没有收到这些回调 要访问麦克风数据,请使用Sound::lock和Sound::unlock
public class AudioInit : MonoBehaviour {
FMOD.System lowlevel = null;
FMOD.Sound snd = null;
// callbacks delegates
FMOD.SOUND_PCMREADCALLBACK pcmreadcallbackPtr = new FMOD.SOUND_PCMREADCALLBACK (pcmreadcallbackFunc);
int driverId;
void Start () {
int channels = 1;
int sampleRate = 8000;
float recordTime = 1.0f;
// get low level instance
FMOD_StudioSystem.instance.System.getLowLevelSystem(out lowlevel);
// fill sound info struct
FMOD.CREATESOUNDEXINFO soundInfo = new FMOD.CREATESOUNDEXINFO ();
soundInfo.cbsize = System.Runtime.InteropServices.Marshal.SizeOf (typeof(FMOD.CREATESOUNDEXINFO));
soundInfo.length = (uint)(sampleRate * channels * sizeof(byte) * recordTime);
soundInfo.numchannels = channels;
soundInfo.defaultfrequency = sampleRate;
soundInfo.format = FMOD.SOUND_FORMAT.PCM8;
soundInfo.pcmreadcallback = pcmreadcallbackPtr;
soundInfo.pcmsetposcallback = pcmsetposcallbackPtr;
soundInfo.dlsname = IntPtr.Zero;
// FMODE MODE flag
FMOD.MODE mode = FMOD.MODE.OPENUSER | FMOD.MODE.LOOP_NORMAL;
// create sound
FMOD.RESULT res = lowlevel.createSound((string)null, mode, ref soundInfo, out snd);
if (res != FMOD.RESULT.OK) {
Debug.Log ("ERROR snd " + res.ToString ());
return;
}
// get driver
res = lowlevel.getDriver (out driverId);
if (res != FMOD.RESULT.OK) {
Debug.Log ("ERROR getDriver " + res.ToString ());
return;
}
// start record from microphone
res = lowlevel.recordStart (driverId, snd, true);
if (res != FMOD.RESULT.OK) {
Debug.Log ("ERROR recordStart " + res.ToString ());
return;
}
uint pos = 0;
uint tries = 10;
// wait for a valid record position
while ( !(pos > 0) && (tries--) > 0 ) {
if ( lowlevel.getRecordPosition(driverId, out pos) == FMOD.RESULT.OK ){
System.Threading.Thread.Sleep(100);
} else { break; }
}
if ( !( pos > 0 )) {
Debug.Log ("ERROR invalid record position");
return;
}
// start playback
FMOD.Channel chn;
res = lowlevel.playSound (snd, new FMOD.ChannelGroup (IntPtr.Zero), false, out chn);
if (res != FMOD.RESULT.OK) {
Debug.Log ("ERROR recordStart " + res.ToString ());
return;
}
}
// only called once during lowlevel.createSound execution
static FMOD.RESULT pcmreadcallbackFunc (IntPtr sound, IntPtr data, uint len){
Debug.Log("pcmreadcallback sample size " + len.ToString());
return FMOD.RESULT.OK;
}
// Update is called once per frame
void Update () {
}
}