opus-helpers.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.setOpusHead = exports.parseOpusHead = exports.OPUS_HEAD = void 0;
  6. var OPUS_HEAD = new Uint8Array([// O, p, u, s
  7. 0x4f, 0x70, 0x75, 0x73, // H, e, a, d
  8. 0x48, 0x65, 0x61, 0x64]); // https://wiki.xiph.org/OggOpus
  9. // https://vfrmaniac.fushizen.eu/contents/opus_in_isobmff.html
  10. // https://opus-codec.org/docs/opusfile_api-0.7/structOpusHead.html
  11. exports.OPUS_HEAD = OPUS_HEAD;
  12. var parseOpusHead = function parseOpusHead(bytes) {
  13. var view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
  14. var version = view.getUint8(0); // version 0, from mp4, does not use littleEndian.
  15. var littleEndian = version !== 0;
  16. var config = {
  17. version: version,
  18. channels: view.getUint8(1),
  19. preSkip: view.getUint16(2, littleEndian),
  20. sampleRate: view.getUint32(4, littleEndian),
  21. outputGain: view.getUint16(8, littleEndian),
  22. channelMappingFamily: view.getUint8(10)
  23. };
  24. if (config.channelMappingFamily > 0 && bytes.length > 10) {
  25. config.streamCount = view.getUint8(11);
  26. config.twoChannelStreamCount = view.getUint8(12);
  27. config.channelMapping = [];
  28. for (var c = 0; c < config.channels; c++) {
  29. config.channelMapping.push(view.getUint8(13 + c));
  30. }
  31. }
  32. return config;
  33. };
  34. exports.parseOpusHead = parseOpusHead;
  35. var setOpusHead = function setOpusHead(config) {
  36. var size = config.channelMappingFamily <= 0 ? 11 : 12 + config.channels;
  37. var view = new DataView(new ArrayBuffer(size));
  38. var littleEndian = config.version !== 0;
  39. view.setUint8(0, config.version);
  40. view.setUint8(1, config.channels);
  41. view.setUint16(2, config.preSkip, littleEndian);
  42. view.setUint32(4, config.sampleRate, littleEndian);
  43. view.setUint16(8, config.outputGain, littleEndian);
  44. view.setUint8(10, config.channelMappingFamily);
  45. if (config.channelMappingFamily > 0) {
  46. view.setUint8(11, config.streamCount);
  47. config.channelMapping.foreach(function (cm, i) {
  48. view.setUint8(12 + i, cm);
  49. });
  50. }
  51. return new Uint8Array(view.buffer);
  52. };
  53. exports.setOpusHead = setOpusHead;