doc: more details in mp2 coding

This commit is contained in:
minjaesong
2023-01-25 21:00:15 +09:00
parent 1f0b8a0a8d
commit 5be05e8eec
2 changed files with 20 additions and 5 deletions

View File

@@ -46,6 +46,7 @@ function prepare(fullPath) {
function readBytes(length, ptrToDecode) { function readBytes(length, ptrToDecode) {
if (length <= 0) return if (length <= 0) return
// serial.println(`readBytes(${length}); readCount = ${readCount}`)
let ptr = (ptrToDecode === undefined) ? sys.malloc(length) : ptrToDecode let ptr = (ptrToDecode === undefined) ? sys.malloc(length) : ptrToDecode
let requiredBlocks = Math.floor((readCount + length) / 4096) - Math.floor(readCount / 4096) let requiredBlocks = Math.floor((readCount + length) / 4096) - Math.floor(readCount / 4096)
@@ -53,7 +54,6 @@ function readBytes(length, ptrToDecode) {
let completedReads = 0 let completedReads = 0
// serial.println(`readBytes(${length}); readCount = ${readCount}`)
for (let bc = 0; bc < requiredBlocks + 1; bc++) { for (let bc = 0; bc < requiredBlocks + 1; bc++) {
if (completedReads >= length) break if (completedReads >= length) break
@@ -119,10 +119,20 @@ function readShort() {
return i return i
} }
function readOneByte() {
let b = readBytes(1)
let i = sys.peek(b)
sys.free(b)
return i
}
function readFourCC() { function readFourCC() {
let b = readBytes(4) let b = readBytes(4)
let s = String.fromCharCode(sys.peek(b), sys.peek(b+1), sys.peek(b+2), sys.peek(b+3)) let a = [sys.peek(b), sys.peek(b+1), sys.peek(b+2), sys.peek(b+3)]
sys.free(b) sys.free(b)
let s = String.fromCharCode.apply(null, a)
// serial.println(`readFourCC: ${s}; ${a.map(it=>"0x"+it.toString(16).padStart(2,'0')).join()}`)
if (s.length != 4) throw Error(`FourCC is not 4 characters long (${s}; ${a.map(it=>"0x"+it.toString(16).padStart(2,'0')).join()})`)
return s return s
} }
@@ -145,4 +155,4 @@ function getReadCount() {
return readCount return readCount
} }
exports = {fileHeader, prepare, readBytes, readInt, readShort, readFourCC, readString, skip, getReadCount} exports = {fileHeader, prepare, readBytes, readInt, readShort, readFourCC, readOneByte, readString, skip, getReadCount}

View File

@@ -415,7 +415,7 @@ Packet Types -
32 | 0 | 1 32 | 0 | 1
48 | 2 | 3 48 | 2 | 3
56 | 4 | 5 56 | 4 | 5
64 | 6 | 7 (libtwolame does not allow bitrate lower than this on 32 kHz) 64 | 6 | 7 (libtwolame does not allow bitrate lower than this on 32 kHz stereo)
80 | 8 | 9 80 | 8 | 9
96 | 10 | 11 96 | 10 | 11
112 | 12 | 13 112 | 12 | 13
@@ -429,7 +429,12 @@ Packet Types -
Add 128 to the resulting number if the frame has a padding bit (should not happen on 32kHz sampling rate) Add 128 to the resulting number if the frame has a padding bit (should not happen on 32kHz sampling rate)
Special value of 255 may indicate some errors Special value of 255 may indicate some errors
To encode an audio to compliant format, use ffmpeg: ffmpeg -i <your_music> -acodec libtwolame -b:a <rate>k -ar 32000 <output.mp2> To encode an audio to compliant format, use ffmpeg: ffmpeg -i <your_music> -acodec libtwolame -psymodel 4 -b:a <rate>k -ar 32000 <output.mp2>
Rationale:
-acodec libtwolame : ffmpeg has two mp2 encoders, and libtwolame produces vastly higher quality audio
-psymodel 4 : use alternative psychoacoustic model -- the default model (3) tends to insert "clunk" sounds throughout the audio
-b:a : 256k is recommended for high quality audio (trust me, you don't need 384k)
-ar 32000 : resample the audio to 32kHz, the sampling rate of the TSVM soundcard
GLOBAL TYPE 0 Packet - GLOBAL TYPE 0 Packet -
uint32 SIZE OF FRAMEDATA uint32 SIZE OF FRAMEDATA