产品概述
优势特性
产品功能
应用场景
安全合规认证

import com.tencent.TMG.advance.ITMGAudioDataObserver;
SetAdvanceParams("AllowDumpCapture", "1");
public abstract int SetAudioDataFormat(Audio_Data_Type audioType, int sampleRate, int channelCount);
参数 | 类型 | 描述 |
audioType | Audio_Data_Type | 需要设置的音频原数据类型 |
sampleRate | int | 音频原数据音频采样率,建议填入48000 |
channelCount | int | 音频原数据音频通道数,建议填入2 |
Audio_Data_Type 类型枚举 | 描述 |
AUDIO_DATA_TYPE_CAPTURE | 获取麦克风采集到的音频原数据(需要先调用 EnableMic 接口打开麦克风)。 |
AUDIO_DATA_TYPE_LOOPBACK | 获取麦克风采集并通过音效处理(例如:变声)后的音频原数据。 |
AUDIO_DATA_TYPE_SEND | |
AUDIO_DATA_TYPE_PLAY | 获取所有从扬声器播放的音频原数据(需要先调用 EnableSpeaker 接口打开扬声器)。 |
AUDIO_DATA_TYPE_CAPTURE_PLAY | 包含 AUDIO_DATA_TYPE_CAPTURE 以及 AUDIO_DATA_TYPE_PLAY 两种类型的音频原数据。 |
RegisteAudioDataCallback
public abstract int RegisteAudioDataCallback(Audio_Data_Type dataType);
参数 | 类型 | 含义 |
audioType | Audio_Data_Type | 原始格式音频帧类型 |
UnRegisterAudioDataCallback
public abstract int UnRegisteAudioDataCallback(Audio_Data_Type dataType);
参数 | 类型 | 含义 |
audioType | Audio_Data_Type | 音频原数据类型 |
- (void)pCaptureChanged:(UISwitch *)sender {if (sender.on) {NSString *pathName = [NSString stringWithFormat:@"capture_%ld.pcm",(long)[[NSDate date] timeIntervalSince1970] * 1000];NSString *path = [self pcmPath:pathName];capFile = fopen(path.UTF8String, "wb");[[ITMGAudioDataObserver GetInstance] RegisteAudioDataCallback:^(int audioDatType, unsigned long long timestamp, unsigned int sampleRate, unsigned int channelCount, int bitsType, unsigned int length, char * pcmData) {if (capFile) {fwrite(pcmData, sizeof(char), length, capFile);}}];} else {[[ITMGAudioDataObserver GetInstance] UnRegisterAudioDataCallback];if (capFile) {fclose(capFile);capFile = NULL;}}}
private void startDumpAllAudioData() {int nRet = ITMGAudioDataObserver.GetInstance().RegisteAudioDataCallback(this);showToast("RegisteAudioDataCallback AUDIO_DATA_TYPE_CAPTURE_PLAY ret:" + nRet);if (nRet == 0) {mDumpAllAudioing = true;mBtnDumpAll.setText("StopDumpAudioPCM");String dumpFilePath = String.format(Locale.getDefault(), "%s/Dump_Mic_Speaker_%d.pcm", getActivity().getExternalFilesDir(null).toString(),System.currentTimeMillis());try {File dumpFile = new File(dumpFilePath);mDumpAllOutputStream = new FileOutputStream(dumpFile);} catch (FileNotFoundException e) {e.printStackTrace();}}}private void stopDumpAllAudioData() {if (!mDumpAllAudioing) {return;}mDumpAllAudioing = false;mBtnDumpAll.setText("DumpAudioPCM");ITMGAudioDataObserver.GetInstance().UnRegisteAudioDataCallback();try {mDumpAllOutputStream.close();} catch (IOException e) {e.printStackTrace();}finally {mDumpAllOutputStream = null;}}
Toggle dumpMicToggle = transform.Find("DumpMicToggle").gameObject.GetComponent<Toggle>();if (dumpMicToggle){dumpMicToggle.onValueChanged.AddListener(delegate (bool value) {OnDumpMicToggle(value);});}public void OnDumpMicToggle(bool isOn){if (isOn){int nRet = ITMGAudioDataObserver.GetInstance().RegisteAudioDataCallback(Audio_Data_Type.AUDIO_DATA_TYPE_CAPTURE);Debug.Log("RegisteAudioDataCallback AUDIO_DATA_TYPE_CAPTURE ret---:" + nRet);if (nRet == 0 && mDumpMicOutputStream == null){mDumpMicOutputStream = new FileStream(Application.persistentDataPath + "/Dump_Mic.pcm", FileMode.Create);}}else{ITMGAudioDataObserver.GetInstance().UnRegisteAudioDataCallback(Audio_Data_Type.AUDIO_DATA_TYPE_CAPTURE);if(mDumpMicOutputStream != null){mDumpMicOutputStream.Close();mDumpMicOutputStream = null;}}}
参数 | 类型 | 含义 |
audioDatType | int | 音频原数据类型。 |
timestamp | long | 音频原数据时间戳,用于音频帧处理。 |
sampleRate | int | 音频原数据采样率。 |
channelCount | int | 音频原数据声道数。 |
bitsType | int | 音频原数据比特,一般为16000。 |
pcmData | byte[] | 音频原数据,PCM格式。 |
- (void)pCaptureChanged:(UISwitch *)sender {if (sender.on) {NSString *pathName = [NSString stringWithFormat:@"capture_%ld.pcm",(long)[[NSDate date] timeIntervalSince1970] * 1000];NSString *path = [self pcmPath:pathName];capFile = fopen(path.UTF8String, "wb");[[ITMGAudioDataObserver GetInstance] RegisteAudioDataCallback:^(int audioDatType, unsigned long long timestamp, unsigned int sampleRate, unsigned int channelCount, int bitsType, unsigned int length, char * pcmData) {if (capFile) {fwrite(pcmData, sizeof(char), length, capFile);}}];} else {[[ITMGAudioDataObserver GetInstance] UnRegisterAudioDataCallback];if (capFile) {fclose(capFile);capFile = NULL;}}}
private FileOutputStream mDumpAllOutputStream;public void OnAudioDataCallback(int audioDatType, long timestamp, int sampleRate, int channelCount, int bitsType, byte[] pcmData) {if(audioDatType == AUDIO_DATA_TYPE_CAPTURE_PLAY && mDumpAllOutputStream != null) {try {mDumpAllOutputStream.write(pcmData);} catch (IOException e) {e.printStackTrace();}}}
ITMGAudioDataObserver.GetInstance().OnAudioDataCallback += new QAVAudioDataCallback(OnAudioDataCallback);private void OnAudioDataCallback(Audio_Data_Type audioDatType, UInt64 timestamp, uint sampleRate, uint channelCount, uint bitsType, byte[] pcmData){Debug.Log(string.Format("OnAudioDataCallback, audioDatType:{0} timestamp:{1} sampleRate:{2} channelCount:{3} bitsType:{4}",audioDatType, timestamp, sampleRate, channelCount, bitsType));switch (audioDatType){case Audio_Data_Type.AUDIO_DATA_TYPE_CAPTURE:if (mDumpMicOutputStream != null){mDumpMicOutputStream.Write(pcmData, 0, pcmData.Length);mDumpMicOutputStream.Flush();}break;case Audio_Data_Type.AUDIO_DATA_TYPE_CAPTURE_PLAY:if (mDumpAllOutputStream != null){mDumpAllOutputStream.Write(pcmData, 0, pcmData.Length);mDumpAllOutputStream.Flush();}break;case Audio_Data_Type.AUDIO_DATA_TYPE_LOOPBACK:if (mDumpLoopBackOutputStream != null){mDumpLoopBackOutputStream.Write(pcmData, 0, pcmData.Length);mDumpLoopBackOutputStream.Flush();}break;default:break;}}}
文档反馈