最近因为一些原因在折腾这方面的事情,朋友负责DVD-LPCM的,我这边则是BD-LPCM的,我轻松了很多,因为BD的LPCM的比DVD的那是舒服了不少。。
不过开发环境限制死了在VS2010我很蛋疼,并且其实源工程是基于DShow的,对我这个习惯了MediaFoundation的人来说,实在过于腐朽。
好了不废话那么多,我们来看BD的LPCM如何转换为PCM。
这个转换其实很简单,LPCM是BE的格式,首先我们解码音频需要3个关键的东西:声道数、采样率、采样大小。
BD的采样大小在16\24\32这范围内,也就是不会出现8bit的情况,我们需要判断,转换也就是:
switch bits
{
case 16:
sample = BE2LE_16BIT(old_sample);
break;
case 24:
sample = BE2LE_24BIT(old_sample);
case 32:
sample = BE2LE_32BIT(old_sample);
break;
}
这个转换虽然是十分脑残,不过BD有个啰嗦的地方就是它的头,比如在m2ts格式的BDMV中,封装的是H264的视频和LPCM的音频,每一个LPCM的Packet都有一个32bit(4字节)的信息头,然后从第五个字节开始才是LPCM的数据。
这个头是这样的:
- unknown (16 bits)
- number of channels (4 bits)
- frequency (4 bits)
不过开发环境限制死了在VS2010我很蛋疼,并且其实源工程是基于DShow的,对我这个习惯了MediaFoundation的人来说,实在过于腐朽。
好了不废话那么多,我们来看BD的LPCM如何转换为PCM。
这个转换其实很简单,LPCM是BE的格式,首先我们解码音频需要3个关键的东西:声道数、采样率、采样大小。
BD的采样大小在16\24\32这范围内,也就是不会出现8bit的情况,我们需要判断,转换也就是:
switch bits
{
case 16:
sample = BE2LE_16BIT(old_sample);
break;
case 24:
sample = BE2LE_24BIT(old_sample);
case 32:
sample = BE2LE_32BIT(old_sample);
break;
}
这个转换虽然是十分脑残,不过BD有个啰嗦的地方就是它的头,比如在m2ts格式的BDMV中,封装的是H264的视频和LPCM的音频,每一个LPCM的Packet都有一个32bit(4字节)的信息头,然后从第五个字节开始才是LPCM的数据。
这个头是这样的:
- unknown (16 bits)
- number of channels (4 bits)
- frequency (4 bits)