Add --audio-encoder option
Similar to --video-encoder, but for audio.
This commit is contained in:
@@ -45,6 +45,7 @@ public final class AudioEncoder {
|
||||
|
||||
private final Streamer streamer;
|
||||
private final int bitRate;
|
||||
private final String encoderName;
|
||||
|
||||
private AudioRecord recorder;
|
||||
private MediaCodec mediaCodec;
|
||||
@@ -62,9 +63,10 @@ public final class AudioEncoder {
|
||||
|
||||
private boolean ended;
|
||||
|
||||
public AudioEncoder(Streamer streamer, int bitRate) {
|
||||
public AudioEncoder(Streamer streamer, int bitRate, String encoderName) {
|
||||
this.streamer = streamer;
|
||||
this.bitRate = bitRate;
|
||||
this.encoderName = encoderName;
|
||||
}
|
||||
|
||||
private static AudioFormat createAudioFormat() {
|
||||
@@ -208,15 +210,15 @@ public final class AudioEncoder {
|
||||
|
||||
try {
|
||||
try {
|
||||
String mimeType = streamer.getCodec().getMimeType();
|
||||
Codec codec = streamer.getCodec();
|
||||
|
||||
mediaCodec = MediaCodec.createEncoderByType(mimeType); // may throw IOException
|
||||
mediaCodec = createMediaCodec(codec, encoderName);
|
||||
recorder = createAudioRecord();
|
||||
|
||||
mediaCodecThread = new HandlerThread("AudioEncoder");
|
||||
mediaCodecThread.start();
|
||||
|
||||
MediaFormat format = createFormat(mimeType, bitRate);
|
||||
MediaFormat format = createFormat(codec.getMimeType(), bitRate);
|
||||
mediaCodec.setCallback(new EncoderCallback(), new Handler(mediaCodecThread.getLooper()));
|
||||
mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
|
||||
|
||||
@@ -255,6 +257,8 @@ public final class AudioEncoder {
|
||||
mediaCodec.start();
|
||||
inputThread.start();
|
||||
outputThread.start();
|
||||
} catch (ConfigurationException e) {
|
||||
// Do not print stack trace, a user-friendly error-message has already been logged
|
||||
} catch (Throwable e) {
|
||||
if (mediaCodec != null) {
|
||||
mediaCodec.release();
|
||||
@@ -272,6 +276,21 @@ public final class AudioEncoder {
|
||||
}
|
||||
}
|
||||
|
||||
private static MediaCodec createMediaCodec(Codec codec, String encoderName) throws IOException, ConfigurationException {
|
||||
if (encoderName != null) {
|
||||
Ln.d("Creating audio encoder by name: '" + encoderName + "'");
|
||||
try {
|
||||
return MediaCodec.createByCodecName(encoderName);
|
||||
} catch (IllegalArgumentException e) {
|
||||
Ln.e(CodecUtils.buildUnknownEncoderMessage(codec, encoderName));
|
||||
throw new ConfigurationException("Unknown encoder: " + encoderName);
|
||||
}
|
||||
}
|
||||
MediaCodec mediaCodec = MediaCodec.createEncoderByType(codec.getMimeType());
|
||||
Ln.d("Using audio encoder: '" + mediaCodec.getName() + "'");
|
||||
return mediaCodec;
|
||||
}
|
||||
|
||||
private void cleanUp() {
|
||||
mediaCodecThread.getLooper().quit();
|
||||
inputThread.interrupt();
|
||||
|
||||
@@ -18,8 +18,10 @@ public final class CodecUtils {
|
||||
MediaCodecInfo[] encoders = listEncoders(codec.getMimeType());
|
||||
if (encoders != null && encoders.length > 0) {
|
||||
msg.append("\nTry to use one of the available encoders:");
|
||||
String codecOption = codec.getType() == Codec.Type.VIDEO ? "codec" : "audio-codec";
|
||||
for (MediaCodecInfo encoder : encoders) {
|
||||
msg.append("\n scrcpy --codec=").append(codec.getName()).append(" --encoder='").append(encoder.getName()).append("'");
|
||||
msg.append("\n scrcpy --").append(codecOption).append("=").append(codec.getName());
|
||||
msg.append(" --encoder='").append(encoder.getName()).append("'");
|
||||
}
|
||||
}
|
||||
return msg.toString();
|
||||
|
||||
@@ -24,6 +24,7 @@ public class Options {
|
||||
private boolean stayAwake;
|
||||
private List<CodecOption> codecOptions;
|
||||
private String encoderName;
|
||||
private String audioEncoderName;
|
||||
private boolean powerOffScreenOnClose;
|
||||
private boolean clipboardAutosync = true;
|
||||
private boolean downsizeOnError = true;
|
||||
@@ -180,6 +181,14 @@ public class Options {
|
||||
this.encoderName = encoderName;
|
||||
}
|
||||
|
||||
public String getAudioEncoderName() {
|
||||
return audioEncoderName;
|
||||
}
|
||||
|
||||
public void setAudioEncoderName(String audioEncoderName) {
|
||||
this.audioEncoderName = audioEncoderName;
|
||||
}
|
||||
|
||||
public void setPowerOffScreenOnClose(boolean powerOffScreenOnClose) {
|
||||
this.powerOffScreenOnClose = powerOffScreenOnClose;
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ public final class Server {
|
||||
if (audio) {
|
||||
Streamer audioStreamer = new Streamer(connection.getAudioFd(), options.getAudioCodec(), options.getSendCodecId(),
|
||||
options.getSendFrameMeta());
|
||||
audioEncoder = new AudioEncoder(audioStreamer, options.getAudioBitRate());
|
||||
audioEncoder = new AudioEncoder(audioStreamer, options.getAudioBitRate(), options.getAudioEncoderName());
|
||||
audioEncoder.start();
|
||||
}
|
||||
|
||||
@@ -264,6 +264,10 @@ public final class Server {
|
||||
options.setEncoderName(value);
|
||||
}
|
||||
break;
|
||||
case "audio_encoder_name":
|
||||
if (!value.isEmpty()) {
|
||||
options.setAudioEncoderName(value);
|
||||
}
|
||||
case "power_off_on_close":
|
||||
boolean powerOffScreenOnClose = Boolean.parseBoolean(value);
|
||||
options.setPowerOffScreenOnClose(powerOffScreenOnClose);
|
||||
|
||||
Reference in New Issue
Block a user