SharpJaad 0.2.0
dotnet add package SharpJaad --version 0.2.0
NuGet\Install-Package SharpJaad -Version 0.2.0
<PackageReference Include="SharpJaad" Version="0.2.0" />
<PackageVersion Include="SharpJaad" Version="0.2.0" />
<PackageReference Include="SharpJaad" />
paket add SharpJaad --version 0.2.0
#r "nuget: SharpJaad, 0.2.0"
#:package SharpJaad@0.2.0
#addin nuget:?package=SharpJaad&version=0.2.0
#tool nuget:?package=SharpJaad&version=0.2.0
SharpJaad
JAAD is an AAC decoder and MP4 demultiplexer library written completely in Java. It uses no native libraries, is platform-independent and portable. It can read MP4 container from almost every input-stream (files, network sockets etc.) and decode AAC-LC (Low Complexity) and HE-AAC (High Efficiency/AAC+).
SharpJaad is a netstandard2.0 port of the original Java code base with a few small fixes. It has no third-party dependencies and it's portable as it does not use any platform-specific APIs.
SharpJaad.AAC
SharpJaad.AAC is just the AAC decoder without any MP4 code. It's well suited for applications in RTP where the MP4 container is not needed.
Example
To decode stereo AAC Low Complexity (AAC-LC) with 44.1kHz, start with creating the configuration:
var decoderConfig = new DecoderConfig();
decoderConfig.SetProfile(Profile.AAC_LC);
decoderConfig.SetSampleFrequency(SampleFrequency.SAMPLE_FREQUENCY_44100);
decoderConfig.SetChannelConfiguration((ChannelConfiguration)2);
Create the decoder:
var aacDecoder = new Decoder(decoderConfig);
Create an output buffer for the result:
SampleBuffer buffer = new SampleBuffer();
buffer.SetBigEndian(false);
Decode the AAC frame:
byte[] aacFrame = { ... } // AAC frame to decode
aacDecoder.DecodeFrame(aacFrame, buffer);
Convert it to PCM:
short[] pcm = new short[buffer.Data.Length / sizeof(short)];
Buffer.BlockCopy(buffer.Data, 0, pcm, 0, buffer.Data.Length);
Allocations
After the first frame, DecodeFrame allocates nothing for AAC-LC, AAC Main, AAC LTP, HE-AAC (SBR) and HE-AACv2 (PS) streams: the decoder reuses its buffers, and the SampleBuffer keeps its Data array as long as the frame size stays the same. Reuse one SampleBuffer for all frames to keep it that way, and copy Data if you need it after the next call. Only a frame that fails to decode allocates (its exception). For this, a mono HE-AAC decoder creates its parametric stereo state (about 130 KB) up front, as PS can start in any frame.
Untrusted input
Files and streams from untrusted sources are safe to parse and decode: malformed or malicious input makes the MP4 and ADTS readers and the decoder throw an IOException (MP4Exception, AACException or EndOfStreamException), in bounded time and without allocating more than the input holds; nothing recurses without a depth limit. DecodeFrame throws only AACException. Each Decoder has its own state: don't share one DecoderConfig object between decoders, as decoding updates it.
SharpJaadMain
A sample application that can extract AAC audio from a (MP4) file and transcode it into a WAV file.
Credits
This is a port of the https://sourceforge.net/projects/jaadec/ into C#.
Development
- doc/testing.md: the tests, the AAC conformance streams they decode, and how to run them.
- doc/public-api.md: how the public API is guarded against unintended changes.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8.1
- No dependencies.
-
.NETStandard 2.0
- No dependencies.
-
net10.0
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.