From 0fb148d31edad2ba50cf8cb94b9ad3500a813e2a Mon Sep 17 00:00:00 2001 From: Denny Sheirer Date: Sat, 26 Mar 2022 05:48:08 -0400 Subject: [PATCH] #1194 Resolves issue with audio stream bit rate scheduling that was causing stream disconnects for data rate under flows. (#1195) Co-authored-by: Dennis Sheirer --- .../broadcast/AudioStreamingBroadcaster.java | 65 +++++++++---------- .../dsheirer/audio/convert/MP3Setting.java | 4 +- 2 files changed, 31 insertions(+), 38 deletions(-) diff --git a/src/main/java/io/github/dsheirer/audio/broadcast/AudioStreamingBroadcaster.java b/src/main/java/io/github/dsheirer/audio/broadcast/AudioStreamingBroadcaster.java index 1b2dc456..b487bf38 100644 --- a/src/main/java/io/github/dsheirer/audio/broadcast/AudioStreamingBroadcaster.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/AudioStreamingBroadcaster.java @@ -42,7 +42,7 @@ public abstract class AudioStreamingBroadcaster mRecordingQueueProcessorFuture; private RecordingQueueProcessor mRecordingQueueProcessor = new RecordingQueueProcessor(); private Queue mAudioRecordingQueue = new LinkedTransferQueue<>(); @@ -205,7 +205,7 @@ public abstract class AudioStreamingBroadcaster 0) + nextRecording(); + } + + if(mInputStream != null) + { + int length = FastMath.min(mBytesToStreamPerInterval, mInputStream.available()); + + byte[] audio = new byte[length]; + + try + { + int read = mInputStream.read(audio); + broadcastAudio(audio); + } + catch(IOException ioe) + { + mLog.error("Error reading from in-memory audio recording input stream", ioe); + } + + //If this is the final frame fragment then append silence padding to fill the final interval segment + if(length < mBytesToStreamPerInterval && mFinalSilencePadding > 0) { List finalSilence = mSilenceGenerator.generate(mFinalSilencePadding); @@ -289,33 +308,6 @@ public abstract class AudioStreamingBroadcaster 0) + if(audio.length > 0) { + //Calculate how many bytes we'll send with each processor run interval + double intervals = (double)nextRecording.getRecordingLength() / (double)PROCESSOR_RUN_INTERVAL_MS; + mBytesToStreamPerInterval = (int)((double)audio.length / intervals); + mInputStream = new ByteArrayInputStream(audio); mFinalSilencePadding = PROCESSOR_RUN_INTERVAL_MS - diff --git a/src/main/java/io/github/dsheirer/audio/convert/MP3Setting.java b/src/main/java/io/github/dsheirer/audio/convert/MP3Setting.java index 0c6b04df..34a77a56 100644 --- a/src/main/java/io/github/dsheirer/audio/convert/MP3Setting.java +++ b/src/main/java/io/github/dsheirer/audio/convert/MP3Setting.java @@ -34,8 +34,8 @@ public enum MP3Setting CBR_16(false, 16, "CBR - Constant Bit Rate 16 kbps (default)"), CBR_32(false, 32, "CBR - Constant Bit Rate 32 kbps"), ABR_56(true, 56, "ABR - Average Bit Rate 56 kbps"), - VBR_5(true, Lame.QUALITY_MIDDLE, "VBR - Middle Quality (5)"), - VBR_7(true, Lame.QUALITY_LOW, "VBR - Low Quality (7)"); + VBR_5(true, Lame.QUALITY_MIDDLE, "VBR - Variable Bit Rate - Better Quality"), + VBR_7(true, Lame.QUALITY_LOW, "VBR - Variable Bit Rate - Good Quality"); private boolean mVariableBitRate; private int mSetting;