Tau: File size is too large

Created on 30 Dec 2018  路  14Comments  路  Source: Canardoux/tau

Testing in both iOS and Android on emulators and real devices - the file size produced with this plugin is very high. As an example 17 seconds recording gives a file size of 4.3Mb. The plugin audio_recorder gives the same 17 second recording as 59.2k which is a considerable difference - thus , in its current form , this renders the plugin unusable as even if we were to compress recordings and uncompress there is a noticeable lag in application performance when compressing/uncompressing. Is it possible to produce AAC files which are considerably smaller in size or allow a switch to select output format ? If so - this would make this an invaluable plugin.

enhancement

Most helpful comment

@hyochan - Excellent my friend!!

This is perfect.

10 secs = 56k with 1.2.4

** Well done **

All 14 comments

I am currently not compressing audio file which will result in extra audio range which human's can't hear. This could be compressed in the audible boundary. Currently, you can do that in your backend.

Yes of course submitting the audio as a byte array to a firestore function that could perform a conversion to a smaller sized suitable format will work but opens up a dependency to a backend service and adds further latency to a problem most suitable to the plugin itself

@ukrx-xamd Yes you are right! I'd love to upgrade this if I am available but currently I am running out of time. Would love to see PR from anyone of you. Also, I may focus on this in 100 days I think.

For both of your Android and iOS projects - you can see a big improvement in terms of the size of the audio files generated by simply making small changes to your start recorder methods (NO CODE CHANGE - JUST CHANGE THE SETTINGS).

Have a look at the two attached images which shows the new settings I am recommending - especially for iOS - when I apply these settings , a 17 second audio is no longer approx 5mb but now 26k. Long term you may want to parameterize these methods so that a user can specify the audio encoder/output format for Android and sample rate/number of channels/AvAudioQuality etc for iOS.

Additionally for MIC recordings - these settings do not shown any degradation in terms of sound quality and thus do not require compression , will make this plugin much more usable especially if the recorded sound files are being streamed to a cloud backend.

android - recorder settings
ios - recorder settings

@ukrx-xamd Thank you for the suggestion and your amazing drawing skills. I think this could be provided as parameters rather than just changing the values.

@hyochan - 1.2.2 & 1.2.3 has the new sampleRate and numChannels parameters - I can confirm that these settings drastically improve the file size for a 10 second audio in iOS . Previously - 10seconds = 2.6Mb . Now with :

sampleRate = 16,000
numChannels = 1

Size is now 860k.

This is still very large for only 10 seconds.

If you also allow AvFormatIDKey & AvEncoderAudioQualityKey to be set from the current defaults then you can get the 10 second audio from 860k down to 26k & again - you will not see any noticeable audio degradation.

@ukrx-xamd Hope you could give us PR on that.

@hyochan - i'm stretched completely so have absolutely no slack yet - the quickest fix you could do is change your defaults, i.e

default AVFormatIDKey to kAudioFormatMPEG4AAC rather than lossless
default AVEncoderAudioQualityKey to AVAudioQuality.min.rawValue rather than AVAudioQualityMedium

doing this quick change you will see the size drop dramatically and again, audio will not be degraded.

@ukrx-xamd I hope you can give us the PR on that too that would take only about a minute. I've tried your fixes just now and having a problem setting your second config.

default AVEncoderAudioQualityKey to AVAudioQuality.min.rawValue

To prevent this communication loss, I think creating PR would be more productive.

This is the swift version which works for me :

private func startRecorder(_ path: String, _ maxVolume: String?, _ result: FlutterResult) {
let recordSetting: [String: Any] = [
AVSampleRateKey: NSNumber(value: 16000),
AVFormatIDKey: (value: kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey: NSNumber(value: 1),
AVEncoderAudioQualityKey: NSNumber(value: AVAudioQuality.min.rawValue)
]

lastRecordPath = URL(fileURLWithPath: "\(NSTemporaryDirectory())\(path).aac")

let session = AVAudioSession.sharedInstance()

do {
  try? session.setCategory(AVAudioSessionCategoryPlayAndRecord)
  try session.setActive(true)

  if let recordPath = lastRecordPath {
    recorder = try AVAudioRecorder(url: recordPath, settings: recordSetting)
  }
  recorder?.isMeteringEnabled = true
  recorder?.prepareToRecord()
  recorder?.record()

} catch {
  result(FlutterError.init(code: channelName, message: "start record failed", details: error))
}

result(lastRecordPath?.absoluteString)

if maxVolume != nil {
  self.volume = Double(maxVolume!)!
  timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(self.updateVolume), userInfo: nil, repeats: true)
  print(timer!)
}

}

I think the value should be AVAudioQualityMin according to apple doc.

@hyochan - Excellent my friend!!

This is perfect.

10 secs = 56k with 1.2.4

** Well done **

@ukrx-xamd Noo. It was your fixes and your work. Hope you can prove that by PRing next time. Also, I'd really like to know what drawing tool you are using. 馃

hey - I wrote here :

https://github.com/dooboolab/flutter_sound/issues/30

about the tool ...

but its here again :

https://www.draw.io/

you will love it - quick and easy ...

Was this page helpful?
0 / 5 - 0 ratings

Related issues

deepbluev7 picture deepbluev7  路  5Comments

mhstoller picture mhstoller  路  5Comments

farrelanelca picture farrelanelca  路  5Comments

alby97 picture alby97  路  5Comments

jordygarcias picture jordygarcias  路  5Comments