|
|
|
@ -18,7 +18,6 @@ public class SrsPublisher {
|
|
|
|
|
private static AcousticEchoCanceler aec;
|
|
|
|
|
private static AutomaticGainControl agc;
|
|
|
|
|
private byte[] mPcmBuffer = new byte[4096];
|
|
|
|
|
private boolean aloop = false;
|
|
|
|
|
private Thread aworker;
|
|
|
|
|
|
|
|
|
|
private SrsCameraView mCameraView;
|
|
|
|
@ -67,11 +66,7 @@ public class SrsPublisher {
|
|
|
|
|
mCameraView.stopCamera();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void startEncode() {
|
|
|
|
|
if (!mEncoder.start()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void startAudio() {
|
|
|
|
|
mic = mEncoder.chooseAudioRecord();
|
|
|
|
|
if (mic == null) {
|
|
|
|
|
return;
|
|
|
|
@ -91,19 +86,62 @@ public class SrsPublisher {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mCameraView.enableEncoding();
|
|
|
|
|
|
|
|
|
|
aworker = new Thread(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);
|
|
|
|
|
startAudio();
|
|
|
|
|
mic.startRecording();
|
|
|
|
|
while (!Thread.interrupted()) {
|
|
|
|
|
int size = mic.read(mPcmBuffer, 0, mPcmBuffer.length);
|
|
|
|
|
if (size <= 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
mEncoder.onGetPcmFrame(mPcmBuffer, size);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
aloop = true;
|
|
|
|
|
aworker.start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void stopAudio() {
|
|
|
|
|
if (aworker != null) {
|
|
|
|
|
aworker.interrupt();
|
|
|
|
|
try {
|
|
|
|
|
aworker.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
aworker.interrupt();
|
|
|
|
|
}
|
|
|
|
|
aworker = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mic != null) {
|
|
|
|
|
mic.setRecordPositionUpdateListener(null);
|
|
|
|
|
mic.stop();
|
|
|
|
|
mic.release();
|
|
|
|
|
mic = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (aec != null) {
|
|
|
|
|
aec.setEnabled(false);
|
|
|
|
|
aec.release();
|
|
|
|
|
aec = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (agc != null) {
|
|
|
|
|
agc.setEnabled(false);
|
|
|
|
|
agc.release();
|
|
|
|
|
agc = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void startEncode() {
|
|
|
|
|
if (!mEncoder.start()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
startAudio();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void stopEncode() {
|
|
|
|
|
stopAudio();
|
|
|
|
|
stopCamera();
|
|
|
|
@ -218,56 +256,10 @@ public class SrsPublisher {
|
|
|
|
|
} else {
|
|
|
|
|
mEncoder.setCameraFrontFace();
|
|
|
|
|
}
|
|
|
|
|
mCameraView.enableEncoding();
|
|
|
|
|
mCameraView.startCamera();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void startAudio() {
|
|
|
|
|
if (mic != null) {
|
|
|
|
|
mic.startRecording();
|
|
|
|
|
while (aloop && !Thread.interrupted()) {
|
|
|
|
|
int size = mic.read(mPcmBuffer, 0, mPcmBuffer.length);
|
|
|
|
|
if (size <= 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
mEncoder.onGetPcmFrame(mPcmBuffer, size);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void stopAudio() {
|
|
|
|
|
aloop = false;
|
|
|
|
|
if (aworker != null) {
|
|
|
|
|
aworker.interrupt();
|
|
|
|
|
try {
|
|
|
|
|
aworker.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
aworker.interrupt();
|
|
|
|
|
}
|
|
|
|
|
aworker = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mic != null) {
|
|
|
|
|
mic.setRecordPositionUpdateListener(null);
|
|
|
|
|
mic.stop();
|
|
|
|
|
mic.release();
|
|
|
|
|
mic = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (aec != null) {
|
|
|
|
|
aec.setEnabled(false);
|
|
|
|
|
aec.release();
|
|
|
|
|
aec = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (agc != null) {
|
|
|
|
|
agc.setEnabled(false);
|
|
|
|
|
agc.release();
|
|
|
|
|
agc = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setRtmpHandler(RtmpHandler handler) {
|
|
|
|
|
mFlvMuxer = new SrsFlvMuxer(handler);
|
|
|
|
|
if (mEncoder != null) {
|
|
|
|
|