You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
FFmpegAndroid/Live/src/main/java/com/frank/live/stream/AudioStream.java

85 lines
2.4 KiB

package com.frank.live.stream;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import com.frank.live.listener.OnFrameDataCallback;
import com.frank.live.param.AudioParam;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class AudioStream {
private boolean isMute;
private boolean isLiving;
private final int inputSamples;
private final ExecutorService executor;
private final AudioRecord audioRecord;
private final OnFrameDataCallback mCallback;
public AudioStream(OnFrameDataCallback callback, AudioParam audioParam) {
mCallback = callback;
executor = Executors.newSingleThreadExecutor();
int channelConfig;
if (audioParam.getNumChannels() == 2) {
channelConfig = AudioFormat.CHANNEL_IN_STEREO;
} else {
channelConfig = AudioFormat.CHANNEL_IN_MONO;
}
mCallback.onAudioCodecInfo(audioParam.getSampleRate(), audioParam.getNumChannels());
inputSamples = mCallback.getInputSamples() * 2;
int minBufferSize = AudioRecord.getMinBufferSize(audioParam.getSampleRate(),
channelConfig, audioParam.getAudioFormat()) * 2;
int bufferSizeInBytes = Math.max(minBufferSize, inputSamples);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, audioParam.getSampleRate(),
channelConfig, audioParam.getAudioFormat(), bufferSizeInBytes);
}
public void startLive() {
isLiving = true;
executor.submit(new AudioTask());
}
public void stopLive() {
isLiving = false;
}
public void release() {
audioRecord.release();
}
class AudioTask implements Runnable {
@Override
public void run() {
audioRecord.startRecording();
byte[] bytes = new byte[inputSamples];
while (isLiving) {
if (!isMute) {
int len = audioRecord.read(bytes, 0, bytes.length);
if (len > 0) {
mCallback.onAudioFrame(bytes);
}
}
}
audioRecord.stop();
}
}
/**
* Setting mute or not
*
* @param isMute isMute
*/
public void setMute(boolean isMute) {
this.isMute = isMute;
}
}