mp2 解码器kjmp输出32bit

来源:互联网 发布:ear cuff淘宝 编辑:程序博客网 时间:2024/06/10 13:16

背景

====

由于kjmp[1] 带的mp2dec.c 输出的为s16le的,我需要输出32bit来和硬解对比。于是有下面的笔记。


PCM

====
声音的裸数据最小单位是PCM 。一个PCM sample 就相当于图像里面的一个像素。
相关的概念有采样率,理解为一秒内(时间)横坐标取多少个点。声音的频率是一秒内波形重复多少次。最基本的波形就是我们高中看到的正弦波啦,因此凡提到与波形有关的概念我们就把它当成是在一个正弦波上描述的。比特率是指一秒内总共有多少比特位,它是一个“面积”概念,即横向的乘以纵向的。纵向的振幅值我们用多少个比特位表示。比如电话-程控交换机,采样率为8KHz,每个振幅值8比特编码,比特率为8*8Kb/s。

编码
====
把一个frame (1152 samples)划分为36个subband(32 frequency compenents).

DCT
根据perceptual model 来进行压缩:
频率掩盖效应:
高强度的频率会掩盖低强度的相邻频率。
temporal mask:
高强度的频率会掩盖时间上随后的频率。

输出 MP2 bitstream
header    32
CRC       16 optinal
bit_alloc  
scalefactors
samples


解码
====
到samples之前的直接读和查表即可。
对samples要做:
 dequantize: 根据bit_alloc,scalefactors来反量化系数.
 synthesis: IDCT, apply_window.

存储格式
====
通常一个sample是s16le,可能还有s32le, f64be的。
比较ffmpeg s16le和s32le的输出,发现s16le的一个sample,左移16位就变成的s32le的了。(相关代码在libavcodec/pcm.c ?)

ffmpeg和kjmp[1]解码比较
====
主观比较:从听觉上听不出区别, audacity导入看波形也一样。

客观比较:

gvim 二进制查看对应地址的数据也不是完全一样。

用[1]带的工具:

$ python wav_psnr.py raw.ff.s32le  raw.kjmp.s32le 
Computing PSNR between raw.ff.s32le and raw.kjmp.s32le ...
PSNR: 60.0912322071 dB
ludi@ubun:~/codec/mp2
$ python wav_psnr.py raw0 raw1 
Computing PSNR between raw0 and raw1 ...
PSNR: 13.7720499337 dB

mp3 解码
====
huffman_decode
reorder_block
compute_antialias

compute_imdct <TODO>...


附命令

文件截取
 dd if=7109.pcm of=7109.raw0 bs=1920000 count=1

mpg2音频
Input #0, mp3, from '7109.mp2':
  Duration: 00:01:47.99, start: 0.000000, bitrate: 254 kb/s
    Stream #0:0: Audio: mp2, 48000 Hz, stereo, s16p, 254 kb/s

播放和转码
~/ffmpeg/bin/ffplay -i 7109.pcm -f s32le -ab 48000 -ac 2
~/ffmpeg/bin/ffmpeg  -i 7109.mp2 -t 5 -f s16le -ab 48000 -ac 2 raw.s16le

transcode raw pcm 
ffmpeg -f s16le -ar 44.1k -ac 2 -i file.pcm file.wav


参考

[1] http://keyj.emphy.de/kjmp2/

[2] http://en.wikipedia.org/wiki/MP2 


0 0
原创粉丝点击