背景

====

由于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

mp2 解码器kjmp输出32bit相关推荐

  1. 用 JavaScript 编写 MPEG1 解码器

    几年前,我开始从事于完全用JavaScript编写的MPEG1视频解码器上.现在,我终于找到了清理该库的时间,改善其性能.使其具有更高的错误恢复能力和模块化能力,并添加MP2音频解码器和MPEG-TS ...

  2. 图片的描述生成任务、使用迁移学习实现图片的描述生成过程、CNN编码器+RNN解码器(GRU)的模型架构、BahdanauAttention注意力机制、解码器端的Attention注意力机制

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  3. 编码器和解码器的概念理解

    编码器和解码器最开始看概念的时候有点懵,因为说编码器先把原始信号给编码,然后解码器再给解出来得到原始信号.哈?这是干啥,原始信号本来就有,用这个搞啥,做无用功吗? 1. 首先,说一下编码器和解码器干什 ...

  4. 编码器-解码器(seq2seq)

    文章目录 1.编码器解码器架构 1.1.概念 1.2.代码 1.2.1.编码器(Encoder) 1.2.2.解码器(Decoder) 1.2.3.合并编码器和解码器 2.seq2seq模型 2.1. ...

  5. 什么是编码器、解码器?(CNN\RNN....)

    目录 1.CNN角度 2.RNN角度 3.编码器解码器架构 1.CNN角度 以卷积神经网络为例,输入为一个猫,进行特征提取后输出图片类别. 因此,这里可以简单的理解为:特征提取过程即为编码器,而分类过 ...

  6. 编码器—解码器和注意力机制

    在基于词语的语言模型中,我们使用了循环神经网络.它的输入是一段不定长的序列,输出却是定长的,例如一个词语.然而,很多问题的输出也是不定长的序列.以机器翻译为例,输入是可以是英语的一段话,输出可以是法语 ...

  7. 用JAVA编写MP3解码器

    [内容提要] <用JAVA编写MP3解码器>系列文章将对JAVA实现MP3解码的技术细节作介绍,本着开源的精神,文中给出完整的MPEG 1.0/2.0/2.5 Audio Layer I/ ...

  8. MPlayer软件研究篇(一)──输出驱动

    linux下面最好用的播放器当属mplayer了.一些多媒体的嵌入式产品都有用到mplayer.有的"方案"提供商,也会在mplayer上面开发,增加自己的解码器和输出驱动,然后提 ...

  9. 基于Seq2Seq的中文聊天机器人编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

最新文章

  1. Windows Azure: Blob Container的访问权限与策略设置
  2. 2015年京东面试题
  3. 数据库系统实训——实验八——数据库维护
  4. Flask 正则路由匹配——转换器
  5. 为什么沿梯度方向,函数变化最快???
  6. linux ubuntu20.04 problems
  7. linux设置服务开机自启动
  8. 自动化运维之saltstack
  9. 计算机组成和体系结构-Flynn分类法
  10. html a标签属性 rel=‘nofollow‘
  11. 三十.基于国民MCU 的COMP与ADC结合的实战功能模拟案例
  12. Android 设备兼容-[Android_YangKe]
  13. 实现一个行内三个div等分_一个div,包含三个小的div,平均分布的样式
  14. windows7下替换记事本
  15. next在java什么意思_Java中,一个类里面的关键字 next 是什么意思
  16. uva 11205 The broken pedometer
  17. Echarts之双横向柱状对比图
  18. git-bash 的安装配置及其基本使用
  19. 今个大言不惭下,讲一讲嘛是文化属性,有啥用?
  20. 李炎恢老师XHTML视频教程DIV+CSS教程与课件代码

热门文章

  1. Java中资源文件获取源码浅析
  2. yyt_hac站转的 有关 木马及进程的 文章
  3. [TIM] 微信登录TIM生产QQ号【并独立使用】
  4. 2010 ACR/EULAR 类风湿关节炎分类标准的应用:针对非常早期的滑膜炎患者与1987年ACR标准的比较...
  5. Android源码备用
  6. 宽和窄俯卧撑哪个更难_宽距俯卧撑与窄距俯卧撑,练出来的肌肉有什么差距?...
  7. 初识CMake,如何编写一个CMake工程(上)
  8. 用vis数组保证只入队一次P5594 【XR-4】模拟赛
  9. 【Spring】共性问题(九)
  10. 判断两个数运算是否越界