@ audio/ encode- mp4 (英语)

纯 JS MP4/M4A/MOV muxer, remuxer, 和 iTunes-tag 作者
npm install @audio/encode-mp4
import mp4 from '@audio/encode-mp4'
import { mux } from '@audio/encode-mp4/mux'
import { remux } from '@audio/encode-mp4/remux'
import { writeMeta } from '@audio/encode-mp4/meta'
除了在ISO/IEC 14496-12(ISOBMFF)盒中包装预编码访问单元之外,没有编码知识. mux() 将 AAC、ALAC、Opus、FLAC、MP3或原始PCM样本包成完整 .m4a编号 :.mp4 文件(在mdat前移动,因此它会逐渐流出/播放). remux() 互换或剥取已存在的MP4/MOV的音频音轨而无需触摸视频. writeMeta() 将iTunes风格的标签重写到位. 默认导出将驱动编码器端到 m4a 伞形格式. decode-mp4 (这个生态系统的分解器)和 decode-aac/meta 是否检查了每盒的两样东西 .
mux(track, opts) → Uint8Array
let file = mux({
codec: 'aac', // 'aac' | 'alac' | 'opus' | 'flac' | 'mp3' | 'pcm'
sampleRate: 44100,
channels: 2,
samples, // Uint8Array[] — one access unit per entry (raw AAC AU, no ADTS)
config: audioSpecificConfig,
durations: 1024, // per-AU duration in `timescale` units — a number or per-AU array
priming: 2112, // encoder delay, PCM samples — edit list + iTunSMPB (aac)
}, { meta: { title: 'Song' }, chapters: [{ time: 0, title: 'Intro' }] })
track 字段 | 默认 | |
|---|---|---|
codec | —— 说 | aac | alac | opus | flac | mp3 | pcm (必须) |
sampleRate, (中文(简体) ), channels | —— 说 | 所需经费 |
samples | —— 说 | Uint8Array[],每个条目一个访问单元(需要) |
durations | 特定代码 | AAC 1024; ALAC 从饼干取出的框架长度; Opus / packet(TOC); FLAC / frame (标题); MP3 1152/576; PCM 从块长度计算 |
timescale | sampleRate (奥普斯: 48000(中文(简体) ) | 样表时间尺度 |
config | —— 说 | 审计咨询委员会: AudioSpecificConfig 字节。 拉丁美洲和加勒比:24字节 ALACSpecificConfig。 Opus 语句 : { preSkip, outputGain?, channelMappingFamily?, channelMappingTable? }. FLAC: 34字节STREAMINFO. PCM: (英语) { bits, float?, be? }。 MP3: 未使用 |
priming, (中文(简体) ), padding | 0 | 编码器延迟/ 跟踪垫, PCM 样本—— 作为编辑列表媒体时间抵消写入, (AAC) 作为 iTunSMPB |
bitrate | —— 说 | 位/秒,写入 esds编号 :btrt |
opts 字段 | 默认 | |
|---|---|---|
brand | 'M4A ' | 'M4A ' | 'isom' | 'mp42' | 'qt ' —— 说 qt 写入 sowt编号 :in24编号 :fl32 快速时间 PCM 原子代替 ipcm编号 :fpcm |
meta | —— 说 | 相同的密钥 writeMeta 回放——见下文 |
chapters | —— 说 | [{ time (s), title }] -尼罗 chpl |
creationTime | 现在 | Date |
样本表是紧凑的: stts 径长压缩, stsz 当每个非盟的长度相同时,使用常数大小的快捷键, stsc编号 :stco 将每~1s或128个AU(先来者)块, co64 只有在抵消超过4GB时。 所有东西被写成一个预先分配的,可生长的缓冲器——没有每箱阵列的散射——所以将一个1小时的AAC音轨(~155k AUs)用到~12ms.
remux(src, audio, opts) → Uint8Array
let strippedVideo = remux(videoBytes, null) // drop the audio track
let dubbed = remux(videoBytes, { codec: 'opus', ... }) // replace it (track object, mux() shape)
let dubbed2 = remux(videoBytes, mux({ codec: 'alac', ... })) // or a Uint8Array mux() already produced
视频(和任何其他非音频音轨——字幕,时码)通过没有修改的复制;只有其 stco编号 :co64 块抵消被重写stco→co64 如果新布局推倒了过去 4GB 的偏移). 一个新鲜的 mdat 交互视频和音频块按演示时间排列,结果仍然在逐步发挥。 处理64位的盒子大小, uuid 框,则, mdat 在此之前 moov多个 mdats. 向分散的MP4(moof) ——这是一整个文件的muxer,而不是一个零碎的-MP4编剧.
writeMeta(bytes, { meta, chapters }) → Uint8Array
重写 moov/udta/meta/ilst (+ 数) chpl 用于章节),存在于已存在的MP4/M4A. Moov是先被保存的,而不是迁移到最后,所以当它生长时,每道的块相抵被同一种三角形所转移(只被移动) udta'长度变化;没有其他 moov 页:1. meta 键是准确反向的 decode-aac/meta是因为 parseMeta数字 : title artist album albumartist composer genre year track disc comment lyrics copyright bpm key isrc publisher software pictures。 。 。 . key编号 :isrc编号 :publisher 以 ---- 自由形式原子( com.apple.iTunes (原始内容存档于2018-10-29) (中文(简体) ). Convention by mutagen/AtomicParsley)——在这个生态系统中还没有运出过剖析器读出它们,所以它们只写.
mp4(opts) → { encode(channels), flush(), free() }
let enc = await mp4({ sampleRate: 44100, channels: 2, codec: 'flac' })
enc.encode(channelData) // buffers; always returns an empty Uint8Array
let file = await enc.flush()
enc.free()
驱动器 @audio/encode-aac (AAC,只浏览器——需要) AudioEncoder, (中文(简体) ), @audio/encode-opus/core (奥普斯), @audio/encode-flac (拉丁美洲和加勒比), @audio/encode-mp3 (MP3)或平地相接(PCM),然后 mux()结果。 全文件容器 : encode() 缓冲器, flush() 返回完整文件(形状与 @audio/encode-qoa) (中文(简体) ). codec 默认为 'aac' 何时 globalThis.AudioEncoder 存在(浏览器),其他 'flac'AAC的编码器延迟没有被WebCodecs报告,所以 priming 默认为 2112 样本 —— 标准 AAC- LC 值从 FAAC 到 FDK- AAC 的每个 LC 编码器; 如果您知道得更清楚, 则超过它 . encode() 被分割成任意个个数的块产生字节-同声输出到单个全缓冲调用(PCM,Opus,FLAC,MP3,AAC通过FDK;WebCodecs AAC是浏览器的编码器).
此处未完成 : mux() 不修剪 MP3/Opus 编码器延迟和为您补丁 mp4() does(来自LAME的Info标签,来自Opus编码器的外观):通过 priming编号 :padding 如果您需要比特精确的空格 MP3/Opus 从 mux() (Opus自己的预滑 实值 自动处理 mux()因为它是每个Opus包流的内在,而不是编码器特有的未知数). stco→co64 升级期间 writeMeta 而不是写错偏移.
使用时 : 写作 .m4a编号 :.mp4 输出在浏览器或节点中不带相机; 互换视频文件的音频音轨( dugbing, 替换音轨)而不重新编码视频; 标记 M4A 文件 .
光谱参考
- ISO/IEC 14496-12 — ISO Base Media 文件格式(框结构,样本表,编辑列表)
- ISO/IEC 14496-14 — MP4 文件格式
- ISO/IEC 14496-1 第8.3节 -
esds说明ES_Descriptor编号 :DecoderConfigDescriptor编号 :SLConfigDescriptor(中文(简体) ) - ISO/IEC 23003-5 — ISOBMFF中的PCM (中文(简体) )
ipcm编号 :fpcm编号 :pcmC(中文(简体) ) - ISOBMFF 中的 Opus 选项 —— 说
Opus样本条目 +dOps - ISOBMFF 中的 FLAC 定义 —— 说
fLaC样本条目 +dfLa - QuickTime 文件格式——声音样本描述版本0/1/2,
sowt编号 :in24编号 :fl32编号 :enda - iTunes 元数据原子 - 变种. mp4原子Parsley文件
- 尼罗分会
chpl) – 每个ffmpeg格式libavformat/movenc.cmov_write_chpl_tag
流程输出
stream: true 写一个零碎的文件(ISO/IEC 14496-12 §8.8),因为它编码: ftyp + 键 moov (样本条目,空表格, mvex,标签和章节),一旦第一个单元存在,那么 moof + 键 mdat 每秒媒体。 只有当前碎片的单位被持有. head() 之后 flush() 返回仅由结尾所知道(FLAC的STREAMINFO)重建的init段,或无效.