{"id":44392345,"url":"https://github.com/eshaz/codec-parser","last_synced_at":"2026-02-12T02:53:08.673Z","repository":{"id":37042493,"uuid":"344221321","full_name":"eshaz/codec-parser","owner":"eshaz","description":"Browser and NodeJS library that parses audio data into frames containing frame data, header values, duration, and other information.","archived":false,"fork":false,"pushed_at":"2024-11-15T23:00:46.000Z","size":61252,"stargazers_count":34,"open_issues_count":8,"forks_count":6,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-26T08:44:59.823Z","etag":null,"topics":["aac","audio","flac","hacktoberfest","mp3","mpeg","ogg","opus","vorbis"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eshaz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"eshaz"}},"created_at":"2021-03-03T18:13:42.000Z","updated_at":"2025-09-16T03:30:51.000Z","dependencies_parsed_at":"2024-10-31T20:36:24.983Z","dependency_job_id":"2792acd2-53b8-4b18-9960-88a5c977b5bf","html_url":"https://github.com/eshaz/codec-parser","commit_stats":{"total_commits":144,"total_committers":3,"mean_commits":48.0,"dds":0.06944444444444442,"last_synced_commit":"8277dbee6d99ac205fb3d236e16ed531fa289b6d"},"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/eshaz/codec-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshaz%2Fcodec-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshaz%2Fcodec-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshaz%2Fcodec-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshaz%2Fcodec-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eshaz","download_url":"https://codeload.github.com/eshaz/codec-parser/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshaz%2Fcodec-parser/sbom","scorecard":{"id":382499,"data":{"date":"2025-08-11","repo":{"name":"github.com/eshaz/codec-parser","commit":"8277dbee6d99ac205fb3d236e16ed531fa289b6d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/10 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU Lesser General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T15:48:12.080Z","repository_id":37042493,"created_at":"2025-08-18T15:48:12.080Z","updated_at":"2025-08-18T15:48:12.080Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29355544,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T01:03:07.613Z","status":"online","status_checked_at":"2026-02-12T02:00:06.911Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aac","audio","flac","hacktoberfest","mp3","mpeg","ogg","opus","vorbis"],"created_at":"2026-02-12T02:53:08.089Z","updated_at":"2026-02-12T02:53:08.668Z","avatar_url":"https://github.com/eshaz.png","language":"JavaScript","funding_links":["https://github.com/sponsors/eshaz"],"categories":[],"sub_categories":[],"readme":"# Codec Parser\n\n`codec-parser` is a JavaScript library that parses raw data from audio codecs into frames containing data, header values, duration, and other information.\n\n### Supports:\n  * **MPEG Layer I/II/III (MP3)** - `audio/mpeg`\n  * **AAC** - `audio/aac`, `audio/aacp`\n  * **FLAC** - `audio/flac`\n  * **Ogg FLAC** - `application/ogg`, `audio/ogg`\n  * **Ogg Opus** - `application/ogg`, `audio/ogg`\n  * **Ogg Vorbis** - `application/ogg`, `audio/ogg`\n\n## Demo\nThe demo for [`icecast-metadata-js`](https://github.com/eshaz/icecast-metadata-js) uses this library to allow for playback of streaming audio. `codec-parser` is used by [`mse-audio-wrapper`](https://github.com/eshaz/mse-audio-wrapper) to wrap streaming audio in ISOBMFF or WEBM so it can be played back using the MediaSource API.\n\n## View the live demo [here](https://eshaz.github.io/icecast-metadata-js/)!\n\n---\n\n* [Installing](#installing)\n* [Usage](#usage)\n  * [Instantiation](#instantiation)\n  * [Methods](#methods)\n  * [Properties](#properties)\n* [Data Types](#data-types)\n  * [OggPage](#oggpage)\n  * [CodecFrame](#codecframe)\n  * [CodecHeader](#codecheader)\n    * [MPEGHeader](#mpegheader)\n    * [AACHeader](#aacheader)\n    * [FLACHeader](#flacheader)\n    * [OpusHeader](#opusheader)\n    * [VorbisHeader](#vorbisheader)\n\n## Installing\n\n### Install via [NPM](https://www.npmjs.com/package/codec-parser)\n* `npm i codec-parser`\n\n## Usage\n\n1. Create a new instance of `CodecParser` by passing in the mimetype of your audio data along with the options object.\n\n    *Note: For directly reading from a HTTP response, use the mimetype contained in the `Content-Type` header*\n    \n    ```javascript\n    import CodecParser from \"codec-parser\";\n\n    const mimeType = \"audio/mpeg\";\n    const options = {\n        onCodec: () =\u003e {},\n        onCodecUpdate: () =\u003e {},\n        enableLogging: true\n    };\n\n    const parser = new CodecParser(mimeType, options);\n    ```\n\n### Parsing an entire file\n\n1. To parse an entire audio file, pass in a Uint8Array of the entire audio file into the instance's `.parseAll()`. This method will read the all of the data and return an array of [`CodecFrame`](#codecframe)s or [`OggPage`](#oggpage)s.\n\n    ```javascript\n    const frames = parser.parseAll(audioData);\n\n    // Do something with the frames\n    ```\n\n### Parsing chunks of audio\n\n1. To begin processing chunks of audio data, pass in a Uint8Array of audio data into the instance's `.parseChunk()`. This method returns an iterator that can be consumed using a `for ...of` or `for await...of` loop.\n\n    ```javascript\n    for (const frame of parser.parseChunk(audioData)) {\n      // Do something with each frame\n    }\n    ```\n    ***or***\n    ```javascript\n    const frames = [...parser.parseChunk(audioData)]\n    ```\n\n    `CodecParser` will read the passed in data and attempt to parse audio frames according to the passed in `mimeType`. Any partial data will be stored until enough data is passed in for a complete frame can be formed. Iterations will begin to return frames once at least two consecutive frames have been detected in the passed in data.\n\n    *Note: Any data that does not conform to the instance's mimetype will be discarded.*\n\n    ### Example:\n\n    * 1st `.parseChunk()` call\n      * Input\n          ```\n          [MPEG frame 0 (partial)],\n          [MPEG frame 1 (partial)], \n          ```\n      * Output (no iterations)\n        ```\n        (none)\n        ```\n      * `Frame 0` is dropped since it doesn't start with a valid header.\n      * `Frame 1` is parsed and stored internally until enough data is passed in to properly sync.\n    * 2nd `.parseChunk()` call\n      * Input\n          ```\n          [MPEG frame 1 (partial)], \n          [MPEG frame 2 (partial)]\n          ```\n      * Output (1 iteration)\n        ```\n        MPEG Frame 1 {\n            data,\n            header\n            ...\n        }\n        ```\n      * `Frame 1` is joined with the partial data and returned since it was immediately followed by `Frame 2`.\n      * `Frame 2` is stored internally as partial data.\n    * 3rd `.parseChunk()` call\n      * Input\n        ```\n        [MPEG frame 2 (partial)],\n        [MPEG frame 3 (full)], \n        [MPEG frame 4 (partial)]\n        ```\n      * Output (2 iterations)\n        ```\n        MPEG Frame 2 {\n            data,\n            header\n            ...\n        }\n        ```\n        ```\n        MPEG Frame 3 {\n            data,\n            header\n            ...\n        }\n        ```\n      * `Frame 2` is joined with the partial data and returned since it was immediately followed by `Frame 3`.\n      * `Frame 3` is returned since it was immediately followed by `Frame 4`.\n      * `Frame 4` is stored internally as partial data.\n\n1. When you have come to the end of the stream or file, you may call the instance's `flush()` method to return another iterator that will yield any remaining frames that are buffered. Calling `flush()` will reset the internal state of the `CodecParser` instance and may re-use the instance to parse additional streams.\n\n    ```javascript\n    for (const frame of parser.flush()) {\n      // Do something the buffered frames\n    }\n    ```\n    ***or***\n    ```javascript\n    const frames = [...parser.flush()]\n    ```\n\n\n### Instantiation\n\n`const parser = new CodecParser(\"audio/mpeg\", options);`\n* `constructor` Creates a new instance of CodecParser that can be used to parse audio for a given mimetype.\n  * `mimetype` *required* Incoming audio codec or container\n    * MP3 - `audio/mpeg`\n    * AAC - `audio/aac`, `audio/aacp`\n    * FLAC - `audio/flac`\n    * Ogg FLAC - `application/ogg`, `audio/ogg`\n    * Ogg Opus - `application/ogg`, `audio/ogg`\n    * Ogg Vorbis - `application/ogg`, `audio/ogg`\n  * `options` *optional*\n    * `options.onCodec()` *optional* Called when the output codec is determined.\n      * See `parser.codec` for a list of the possible output codecs\n    * `options.onCodecHeader(codecHeaderData)` *optional* Called once when the codec header is first parsed.\n      * `codecHeaderData` Object containing codec header information.\n    * `options.onCodecUpdate(codecHeaderData, updateTimestamp)` *optional* Called when there is a change in the codec header.\n      * `codecHeaderData` Object containing codec header information that was updated.\n      * `updateTimestamp` Timestamp in milliseconds when the codec information was updated.\n    * `options.enableLogging` *optional* Set to true to enable warning and error messages.\n    * `options.enableFrameCRC32` *optional* Set to false to disable the crc32 calculation for each frame. This will save a marginal amount of execution time if you don't need this information.\n\n### Methods\n\n* `parser.parseAll(data)` Function that takes a audio data for an entire file.\n  * `data` `Uint8Array` of audio data for a complete audio stream / file\n  * Returns an Array of [`CodecFrame`](#codecframe)s or [`OggPage`](#oggpage)s for the entire file\n* `parser.parseChunk(chunk)` Generator function that yields frames for a partial chunk of audio data from an audio stream or file\n  * `chunk` `Uint8Array` of audio data\n  * Returns `Iterator` that yields a parsed [`CodecFrame`](#codecframe) or [`OggPage`](#oggpage) for each iteration.\n* `parser.flush()` Generator function that yields any buffered frames that are stored after `parseChunk()` completes\n  * Returns `Iterator` that yields a parsed [`CodecFrame`](#codecframe) or [`OggPage`](#oggpage) for each iteration.\n  * This function can be used after `parseChunk` has been called with all of the audio data you intend to parse. The final iterator returned by `parseChunk()` must be consumed before calling `flush()`.\n  * Calling `flush()` will reset the internal state of the `CodecParser` instance. You may re-use the instance to parse additional streams.\n\n### Properties\n\n* `parser.codec` The detected codec of the audio data\n    * **Note: For Ogg streams, the codec will only be available after Ogg identification header has been parsed.**\n  * Values:\n    * MPEG (MP3) - `\"mpeg\"`\n    * AAC - `\"aac\"`\n    * FLAC - `\"flac\"`\n    * Opus - `\"opus\"`\n    * Vorbis - `\"vorbis\"`\n\n## Data Types\n\nDepending on the mimetype each iteration of `CodecParser.parseChunk()` will return a single `CodecFrame` or a single `OggPage`.\n\n### `OggPage`\n\n`OggPage` describes a single ogg page. An `OggPage` may contain zero to many `CodecFrame` objects. `OggPage` will be returned when the mimetype is `audio/ogg` or `application/ogg`.\n\n* `absoluteGranulePosition`: Total audio samples in the ogg stream up to the end of this `OggPage`.\n* `codecFrames`: Array of `CodecFrame`(s) contained within this `OggPage`.\n* `crc32`: CRC-32 hash of the frame data using the Ogg formula / polynomial.\n* `data`: `Uint8Array` containing the page segments within the ogg page.\n* `duration`: Audio duration in milliseconds contained within this `OggPage`.\n* `isContinuedPacket`: Boolean indicating if this `OggPage` is part of a continued packet.\n* `isFirstPage`: Boolean indicating if this `OggPage` is the first page in the Ogg stream.\n* `isLastPage`: Boolean indicating if this this `OggPage` is the final page in the Ogg stream.\n* `pageSequenceNumber`: Page sequence number within the Ogg stream.\n* `rawData`: `Uint8Array` Total data of the `OggPage`.\n* `samples`: Total number of audio samples contained within the `OggPage`.\n* `streamSerialNumber`: Serial number of the Ogg stream.\n* `totalBytesOut`: Total bytes of codec data output by `CodecParer` at the end of this ogg page.\n* `totalDuration`: Total audio samples output by `CodecParer` at the end of this ogg page.\n* `totalSamples`: Total audio duration in milliseconds output by `CodecParer` at the end of this ogg page.\n\n### `CodecFrame`\n\n`CodecFrame` describes a single frame for an audio codec. `CodecFrame` will be returned when the mimetype describes audio that is not encapsulated within a container i.e. `audio/mpeg`, `audio/aac`, or `audio/flac`.\n\n* `data`: `Uint8Array` containing the audio data within this frame.\n* `header`: [`Header`](#header) object describing the codec information.\n* `crc32`: CRC-32 hash of the frame data.\n* `samples`: Audio samples contained within this frame.\n* `duration`: Audio duration in milliseconds contained within this frame.\n* `frameNumber`: Total count of frames output by `CodecParser` starting at 0.\n* `totalBytesOut`: Total bytes output by `CodecParer` not including this frame.\n* `totalSamples`: Total audio samples output by `CodecParer` not including this frame.\n* `totalDuration`: Total audio duration in milliseconds output by `CodecParer` not including this frame.\n\n#### Example\n```javascript\n// First CodecFrame\nMPEGFrame {\n  data: Uint8Array(417),\n  header: MPEGHeader {\n    bitDepth: 16,\n    channels: 2,\n    sampleRate: 44100,\n    bitrate: 128,\n    channelMode: \"joint stereo\",\n    emphasis: \"none\",\n    framePadding: 1,\n    isCopyrighted: false,\n    isOriginal: true,\n    isPrivate: false,\n    layer: \"Layer III\",\n    modeExtension: \"Intensity stereo off, MS stereo on\",\n    mpegVersion: \"MPEG Version 1 (ISO/IEC 11172-3)\",\n    protection: \"none\"\n  },\n  crc32: 275944052,\n  samples: 1152,\n  duration: 26.122448979591837,\n  frameNumber: 0,\n  totalBytesOut: 0,\n  totalSamples: 0,\n  totalDuration: 0\n}\n\n// Second CodecFrame\nMPEGFrame {\n  data: Uint8Array(416),\n  header: MPEGHeader {\n    bitDepth: 16,\n    channels: 2,\n    sampleRate: 44100,\n    bitrate: 128,\n    channelMode: \"joint stereo\",\n    emphasis: \"none\",\n    framePadding: 0,\n    isCopyrighted: false,\n    isOriginal: true,\n    isPrivate: false,\n    layer: \"Layer III\",\n    modeExtension: \"Intensity stereo off, MS stereo on\",\n    mpegVersion: \"MPEG Version 1 (ISO/IEC 11172-3)\",\n    protection: \"none\"\n  },\n  crc32: 1336875295,\n  samples: 1152,\n  duration: 26.122448979591837,\n  frameNumber: 1,\n  totalBytesOut: 418,\n  totalSamples: 1152,\n  totalDuration: 26.122448979591837\n}\n```\n\n### CodecHeader\n\nEach codec has it's own `CodecHeader` data type. See each class below for documentation on each codec specific header.\n\n### `MPEGHeader`\n[***Documentation***](https://github.com/eshaz/codec-parser/blob/master/src/codecs/mpeg/MPEGHeader.js)\n```javascript\n{\n  bitDepth: 16,\n  bitrate: 192,\n  channels: 2,\n  sampleRate: 44100,\n  channelMode: \"joint stereo\",\n  emphasis: \"none\",\n  framePadding: 1,\n  isCopyrighted: false,\n  isOriginal: false,\n  isPrivate: false,\n  layer: \"Layer III\",\n  modeExtension: \"Intensity stereo off, MS stereo on\",\n  mpegVersion: \"MPEG Version 1 (ISO/IEC 11172-3)\",\n  protection: \"16bit CRC\"\n}\n```\n### `AACHeader`\n[***Documentation***](https://github.com/eshaz/codec-parser/blob/master/src/codecs/aac/AACHeader.js)\n```javascript\n{\n  bitDepth: 16,\n  bitrate: 312,\n  channels: 2,\n  sampleRate: 44100,\n  copyrightId: false,\n  copyrightIdStart: false,\n  channelMode: \"stereo (left, right)\",\n  bufferFullness: \"VBR\",\n  isHome: false,\n  isOriginal: false,\n  isPrivate: false,\n  layer: \"valid\",\n  length: 7,\n  mpegVersion: \"MPEG-4\",\n  numberAACFrames: 0,\n  profile: \"AAC LC (Low Complexity)\",\n  protection: \"none\"\n}\n```\n\n### `FLACHeader`\n[***Documentation***](https://github.com/eshaz/codec-parser/blob/master/src/codecs/flac/FLACHeader.js)\n```javascript\n{\n  bitDepth: 16,\n  bitrate: 400,\n  channels: 2,\n  sampleRate: 44100,\n  channelMode: \"stereo (left, right)\",\n  blockingStrategy: \"Fixed\",\n  blockSize: 4096,\n  frameNumber: 15183508,\n  crc16: 56624,\n  streamInfo: Uint8Array\n}\n```\n\n### `OpusHeader`\n[***Documentation***](https://github.com/eshaz/codec-parser/blob/master/src/codecs/opus/OpusHeader.js)\n```javascript\n{\n  bitDepth: 16,\n  bitrate: 192,\n  channels: 2,\n  data: Uint8Array,\n  sampleRate: 48000,\n  bandwidth: \"fullband\",\n  channelMappingFamily: 1,\n  channelMappingTable: [0, 1],\n  coupledStreamCount: 1,\n  streamCount: 1,\n  channelMode: \"stereo (left, right)\",\n  frameCount: 1,\n  frameSize: 20,\n  inputSampleRate: 48000,\n  mode: \"CELT-only\",\n  outputGain: 0,\n  preSkip: 312\n}\n```\n### `VorbisHeader`\n[***Documentation***](https://github.com/eshaz/codec-parser/blob/master/src/codecs/vorbis/VorbisHeader.js)\n```javascript\n{\n  bitDepth: 32,\n  bitrate: 272,\n  channels: 2,\n  channelMode: \"stereo (left, right)\",\n  sampleRate: 44100,\n  bitrateMaximum: 0,\n  bitrateMinimum: 0,\n  bitrateNominal: 320000,\n  blocksize0: 256,\n  blocksize1: 2048\n  data: Uint8Array,\n  vorbisComments: Uint8Array,\n  vorbisSetup: Uint8Array\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feshaz%2Fcodec-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feshaz%2Fcodec-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feshaz%2Fcodec-parser/lists"}