非流式节拍检测的跟其他功能的差异点在于处理必须一次性把所有要处理的数据送进去之后再获取结果,所以createParam.maxBlockSize应该是要处理的文件的帧数
SAMICoreExtractorCreateParam createParam = new SAMICoreExtractorCreateParam(); createParam.sampleRate = sampleRate; createParam.numChannel = numChannel; createParam.maxBlockSize = totalNumSamples; int ret = samiCore.SAMICoreCreateHandleByIdentify( SAMICoreIdentify.SAMICoreIdentify_Extractor_BeatTrackingOffline, createParam); if (ret != SAMICoreCode.SAMI_OK) { System.out.println("Create SAMICoreIdentify_Extractor_BeatTracking failed, ret " + ret); return ret; }else { createHandleDone = true; }
SAMICoreProperty property = new SAMICoreProperty(); property.id = SAMICorePropertyId.SAMICorePropertyId_LoadModelBinary; property.type = SAMICoreDataType.SAMICoreDataType_ModelBin; property.dataByteArray = FunctionHelper.readBinaryFile(modelFileName, context); property.dataArrayLen = property.dataByteArray.length; ret = samiCore.SAMICoreSetProperty(SAMICorePropertyId.SAMICorePropertyId_LoadModelBinary, property); if (ret != SAMICoreCode.SAMI_OK) { System.out.println("BeatTracking SetProperty failed, ret " + ret); return ret; }
inBlock = new SAMICoreBlock(); inBlock.dataType = SAMICoreDataType.SAMICoreDataType_AudioBuffer; inAudioBuffer = new SAMICoreAudioBuffer(); inAudioBuffer.numberChannels = numChannel; inAudioBuffer.numberSamples = totalNumSamples; inAudioBuffer.isInterleave = 0; inAudioBuffer.data = new float[inAudioBuffer.numberChannels][inAudioBuffer.numberSamples]; inBlock.audioData = new SAMICoreAudioBuffer[1]; inBlock.audioData[0] = inAudioBuffer;
for (int i = 0; i < inAudioBuffer.numberChannels; i++) { for (int j = 0; j < inAudioBuffer.numberSamples; j++) { inAudioBuffer.data[i][j] = in_planar_float_data[i][j]; } } int ret = samiCore.SAMICoreProcess(inBlock, null); if (ret != SAMICoreCode.SAMI_OK) { System.out.println("BeatTracking process audio data failed, ret " + ret); return ret; } // 获取检测结果 SAMICoreProperty samiCoreProperty = new SAMICoreProperty(); ret = samiCore.SAMICoreGetPropertyById(SAMICorePropertyId.SAMICorePropertyID_OverallFeatures, samiCoreProperty); if (ret==SAMICoreCode.SAMI_OK && samiCoreProperty!= null){ for (Object temp:samiCoreProperty.dataObjectArray){ SAMICoreFeatureSet feature_set = (SAMICoreFeatureSet) samiCoreProperty.dataObjectArray[0]; for(int i = 0; i < feature_set.numFeatureTypes; ++i) { if(feature_set.set[i].featureID == SAMICorePropertyId.SAMICorePropertyID_OverallFeature_TRACKING_OFFLINE_OVERALL.getValue()) { SAMICoreFeatureArray feature = feature_set.set[i]; if (feature != null){ for (int j = 0; j < feature.numFeatures; j++) { float timestamp = feature.array[j].time; for (int k = 0; k < feature.array[j].numValues; k++) { float beat = feature.array[j].values[k]; System.out.println("timestamp:" + timestamp + "; beat:" + beat); } } } } } } }
if (createHandleDone){ samiCore.SAMICoreDestroyHandle(); }