1. First open createPeerConnectionFactory and call it only once
public void createPeerConnectionFactory(PeerConnectionFactory. Options options) { if (factory != null) { throw new IllegalStateException("PeerConnectionFactory has already been constructed"); }//If PeerConnectionFactory is not created, execute the following statement to create executor.execute(() -> createPeerConnectionFactoryInternal(options)); }
//implement the specific content of createPeerConnectionFactory private void createPeerConnectionFactoryInternal(PeerConnectionFactory. Options options) { isError = false; if (peerConnectionParameters. tracing) { PeerConnectionFactory.startInternalTracingCapture( Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "webrtc-trace.txt"); } // Check if ISAC is used by default. preferIsac = peerConnectionParameters. audioCodec != null & amp; & amp; peerConnectionParameters.audioCodec.equals(AUDIO_CODEC_ISAC); // It is possible to save a copy in raw PCM format on a file by checking // the "Save input audio to file" checkbox in the Settings UI. A callback // interface is set when this flag is enabled. As a result, a copy of recorded // audio samples are provided to this client directly from the native audio // layer in Java. if (peerConnectionParameters. saveInputAudioToFile) { if (!peerConnectionParameters. useOpenSLES) { Log.d(TAG, "Enable recording of microphone input audio to file"); saveRecordedAudioToFile = new RecordedAudioToFileController(executor); } else { // TODO(henrika): ensure that the UI reflects that if OpenSL ES is selected, // then the "Save inut audio to file" option shall be grayed out. Log.e(TAG, "Recording of input audio is not supported for OpenSL ES"); } } //Create audio device module final AudioDeviceModule adm = createJavaAudioDevice(); // Create peer connection factory. if (options != null) { Log.d(TAG, "Factory networkIgnoreMask option: " + options.networkIgnoreMask); } final boolean enableH264HighProfile = VIDEO_CODEC_H264_HIGH.equals(peerConnectionParameters.videoCodec); final VideoEncoderFactory encoderFactory;//encoder factory final VideoDecoderFactory decoderFactory;//decoder factory if (peerConnectionParameters. videoCodecHwAcceleration) { encoderFactory = new DefaultVideoEncoderFactory( rootEglBase.getEglBaseContext(), true /* enableIntelVp8Encoder */, enableH264HighProfile); decoderFactory = new DefaultVideoDecoderFactory(rootEglBase.getEglBaseContext()); } else { encoderFactory = new SoftwareVideoEncoderFactory(); decoderFactory = new SoftwareVideoDecoderFactory(); } //peerconnectioFactory factory configuration subfactory factory = PeerConnectionFactory. builder() .setOptions(options) .setAudioDeviceModule(adm) .setVideoEncoderFactory(encoderFactory) .setVideoDecoderFactory(decoderFactory) .createPeerConnectionFactory(); Log.d(TAG, "Peer connection factory created."); adm. release(); }
2. Create an audio device ADM, and perform a series of operations on ADM
//Create audio device module final AudioDeviceModule adm = createJavaAudioDevice();
AudioDeviceModule createJavaAudioDevice() { // Enable/disable OpenSL ES playback. if (!peerConnectionParameters. useOpenSLES) { Log.w(TAG, "External OpenSLES ADM not implemented yet."); // TODO(magjed): Add support for external OpenSLES ADM. } // Set audio record error callbacks. Set audio record error callbacks. AudioRecordErrorCallback audioRecordErrorCallback = new AudioRecordErrorCallback() { @Override public void onWebRtcAudioRecordInitError(String errorMessage) { Log.e(TAG, "onWebRtcAudioRecordInitError: " + errorMessage); reportError(errorMessage); } @Override public void onWebRtcAudioRecordStartError( JavaAudioDeviceModule.AudioRecordStartErrorCode errorCode, String errorMessage) { Log.e(TAG, "onWebRtcAudioRecordStartError: " + errorCode + ". " + errorMessage); reportError(errorMessage); } @Override public void onWebRtcAudioRecordError(String errorMessage) { Log.e(TAG, "onWebRtcAudioRecordError: " + errorMessage); reportError(errorMessage); } }; AudioTrackErrorCallback audioTrackErrorCallback = new AudioTrackErrorCallback() { @Override public void onWebRtcAudioTrackInitError(String errorMessage) { Log.e(TAG, "onWebRtcAudioTrackInitError: " + errorMessage); reportError(errorMessage); } @Override public void onWebRtcAudioTrackStartError( JavaAudioDeviceModule.AudioTrackStartErrorCode errorCode, String errorMessage) { Log.e(TAG, "onWebRtcAudioTrackStartError: " + errorCode + ". " + errorMessage); reportError(errorMessage); } @Override public void onWebRtcAudioTrackError(String errorMessage) { Log.e(TAG, "onWebRtcAudioTrackError: " + errorMessage); reportError(errorMessage); } }; // Set audio record state callbacks. Set audio record state callbacks. AudioRecordStateCallback audioRecordStateCallback = new AudioRecordStateCallback() { @Override public void onWebRtcAudioRecordStart() { Log.i(TAG, "Audio recording starts"); } @Override public void onWebRtcAudioRecordStop() { Log.i(TAG, "Audio recording stops"); } }; // Set audio track state callbacks. Set audio track state callbacks. AudioTrackStateCallback audioTrackStateCallback = new AudioTrackStateCallback() { @Override public void onWebRtcAudioTrackStart() { Log.i(TAG, "Audio playout starts"); } @Override public void onWebRtcAudioTrackStop() { Log.i(TAG, "Audio playout stops"); } }; //created audio device module return JavaAudioDeviceModule.builder(appContext) .setSamplesReadyCallback(saveRecordedAudioToFile) .setUseHardwareAcousticEchoCanceler(!peerConnectionParameters.disableBuiltInAEC) .setUseHardwareNoiseSuppressor(!peerConnectionParameters.disableBuiltInNS) .setAudioRecordErrorCallback(audioRecordErrorCallback) .setAudioTrackErrorCallback(audioTrackErrorCallback) .setAudioRecordStateCallback(audioRecordStateCallback) .setAudioTrackStateCallback(audioTrackStateCallback) .createAudioDeviceModule();//Execute and build ADM }
/** * Construct an AudioDeviceModule based on the supplied arguments. The caller takes ownership * and is responsible for calling release(). */ public AudioDeviceModule createAudioDeviceModule() { Logging.d(TAG, "createAudioDeviceModule"); if (useHardwareNoiseSuppressor) { Logging.d(TAG, "HW NS will be used."); } else { if (isBuiltInNoiseSuppressorSupported()) { Logging.d(TAG, "Overriding default behavior; now using WebRTC NS!"); } Logging.d(TAG, "HW NS will not be used."); } if (useHardwareAcousticEchoCanceler) { Logging.d(TAG, "HW AEC will be used."); } else { if (isBuiltInAcousticEchoCancelerSupported()) { Logging.d(TAG, "Overriding default behavior; now using WebRTC AEC!"); } Logging.d(TAG, "HW AEC will not be used."); } final WebRtcAudioRecord audioInput = new WebRtcAudioRecord(context, audioManager, audioSource, audioFormat, audioRecordErrorCallback, audioRecordStateCallback, samplesReadyCallback, useHardwareAcousticEchoCanceler, useHardwareNoiseSuppressor); final WebRtcAudioTrack audioOutput = new WebRtcAudioTrack( context, audioManager, audioTrackErrorCallback, audioTrackStateCallback); return new JavaAudioDeviceModule(context, audioManager, audioInput, audioOutput,//The content constructed above is used as a parameter inputSampleRate, outputSampleRate, useStereoInput, useStereoOutput); } }
The knowledge points of the article match the official knowledge files, and you can further learn relevant knowledge. Java skill treeHomepageOverview 118281 people are studying systematically