BD(蓝光)的LPCM格式到PCM格式的转换
最近因为一些原因在折腾这方面的事情,朋友负责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)
- bits per sample (2 bits)
- unknown (6 bits)
见下图(我用红线圈住的地方就是头,后面的就是LPCM数据):
前后2个未知我们不需要知道,其中有10个bit把我们需要的关键信息都给交出来了。
可以看到我们上图的头是03 C0 31 40,这个如何解析呢,代码在下面:
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <string>
#include <iostream>
#include <memory>
#include <Windows.h>
#include <ks.h>
#include <ksmedia.h>
#include <winsock.h>#pragma comment(lib,"ws2_32.lib")bool BDHeaderParse(void* ph,int* nch,int* srate,int* bits,unsigned int* ch_layout)
{unsigned int head = ntohl((*(unsigned int*)ph));switch ((head & 0xF000) >> 12){case 1:*nch = 1;*ch_layout = SPEAKER_FRONT_CENTER;break;case 3:*nch = 2;*ch_layout = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT;break;case 4:*nch = 3;*ch_layout = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER;break;case 5:*nch = 3;*ch_layout = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_CENTER;break;case 6:*nch = 4;*ch_layout = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_CENTER;break;case 7:*nch = 4;*ch_layout = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT;break;case 8:*nch = 5;*ch_layout = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT;break;case 9:*nch = 6;*ch_layout = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_LOW_FREQUENCY;break;case 10:*nch = 7;*ch_layout = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT;break;case 11:*nch = 8;*ch_layout = SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT|SPEAKER_LOW_FREQUENCY;break;default:return false;}switch ((head >> 6) & 3){case 1:*bits = 16;break;case 2:case 3:*bits = 24;break;default:return false;}switch ((head >> 8) & 15){case 1:*srate = 48000;break;case 4:*srate = 96000;break;case 5:*srate = 192000;break;default:return false;}return true;
}int main()
{unsigned int i = 0x4031C003;int nch = 0,srate = 0,bits = 0;unsigned ch_layout = 0;BDHeaderParse(&i,&nch,&srate,&bits,&ch_layout);printf("nch:%d\nsrate:%d\nbits:%d\nch_layout:%d",nch,srate,bits,ch_layout);getchar();return 0;
}
好了,我们提取出了声道数、采样率、采样大小,就可以进行后面的LPCM->PCM转换了。
还有一个问题,就是声道布局,这个布局的问题上面我也写了。
不过在转换的时候,前面的1-5个声道,布局都对应有Windows布局,但是5.1(6声道)跟Windows布局不同,就是LFE的位置不同,在这里进行转换的时候,需要进行声道位置调整。
还有,貌似在m2ts文件中,LPCM每次的Packet大小都是一样的?
BD(蓝光)的LPCM格式到PCM格式的转换相关推荐
- 随笔(十) mp3格式转pcm格式并调用百度语音识别
前言: 近期做帮做毕业设计,需求里面要做语音识别,识别出用户朗读的文章,将识别出来的字符串返回给用户查看.这个想到的就只有百度开放平台的api了. 思路: ① 前往百度开放平台拿到APP_ID,API ...
- 如何将蓝光文件转换为流行的格式
Tipard Blu-ray Converter for Mac可以帮户用户在 Mac 上将任何自制蓝光光盘或蓝光文件夹翻录成许多流行的视频和音频格式.此外,用户可以将其作为 Mac DVD Ripp ...
- PS3简易蓝光规格视频制作说明
本教程对应刻录光碟播放蓝光视频封装制作,并且可以实现软字幕 本教程对应的封装软件下载 http://gilleco.2alien.net/MediaTools/tsMuxer.rar 添加文件 添加是 ...
- 「蓝光」「720/1080p」「HR-HDTV」等视频制式都是什么意思?清晰度对比如何?
内容整理自https://www.zhihu.com/question/20106926/answer/24733203 网络高清视频产生的流程 1.电影公司拍好电影后(电影筹备到实景过程叫做前期和中 ...
- 产业链羽翼渐丰 蓝光将在奥运后放量增长
"我个人认为蓝光普及将在奥运会之后开始,因为奥运电视转播都采用高清格式,很多电视节目自然也会用高清,这样下半年音像制品店里就会出现很多BD蓝光制品,内容一解决,机器价格再降到1000元以内, ...
- 如何播放蓝光电影的XBMC
如何播放蓝光电影的XBMC 虽然XBMC功能非常好,一个标准的媒体播放器应用程序为您的计算机,它的设计是完美的伴侣为您的HTPC.支持几乎无尽的范围远程控制,并结合其漂亮的界面和强大的皮肤引擎,XBM ...
- 氨基羧基化二氧化硅包覆核壳结构上转换纳米粒(808激发,蓝光,980激发,绿光)
氨基化二氧化硅包覆核壳结构上转换纳米粒(808激发,蓝光) 材料组成:氨基化二氧化硅包覆NaYF4,Yb,Tm@NaYF4,Yb,Nd, 激发波长808,发射波长365/450/470nm±15 nm ...
- 蓝光原版与蓝光Remux格式到底有什么区别?
蓝光原版即蓝光盘直接拷贝出来的文件,未经过任何加工处理,保留了BD盘的完整性,Remux是无损的提取出BluRay-DVD和HD-DVD里面的视频数据和音频数据,封装到我们熟悉的TS或者AVI文件中. ...
- 钢铁侠2 蓝光BD高清下载
钢铁侠2刚刚上映网上就出现了视频下载资源,怪就怪制片方的安全措施不到位啊,看看人家阿凡达的安全措施.现在的钢铁侠2下载资源其实也不能算作高清版本,只不过是个CAM版,什么?不知道什么叫CAM版本,灰太 ...
最新文章
- 一线互联网技术:Java工程师架构知识系统化汇总,面完45K!
- byte[] 和string的转换
- A Class For Executing MSSql Store Procedure
- Delphi指针用法
- Online Learning算法理论与实践
- springmvc配置同时支持html和jspl两种格式的页面
- 用React开发SAP Fiori应用
- android源码包下载
- 主元排序法c语言程序,C语言算法竞赛入门(二)---数组元素移动 、排序问题 、猴子选大王问题...
- 1分钟 搭建xxl-job任务调度中心
- 机器字长、存储字长、指令字长
- 用计算机听音乐和看电影教学反思,与计算机交朋友
- python if else 与 if elif else 的区别
- 初识ARM嵌入式系统
- windows live mail图片签名不显示图片
- SQL相关知识点(一)
- Eureka注册中心上服务老是自动挂掉相关问题总结
- 2020 最新的 65 道 Java 经典面试题及答案
- 用Python获取大众点评上长沙口味虾店铺信息,并进行数据分析
- 国内外电信运营商云计算实施情况对比分析
热门文章
- 2023年【甘肃省安全员C证】考试题库及甘肃省安全员C证考试总结
- 公司KPI考核代码行数,程序员神操作:10行变500行!
- 一个常见的文字无缝滚动效果
- gcc/g++ 编译C/C++代码
- SiteRAS一款外贸网站SEO分析工具,给您的网站做个深度体检
- 【计算机视觉】OpenCV中直方图处理函数简述
- 支持linux的usb无线网卡芯片,Realtek RTL8188CUSamp;RTL8188ETV 型芯片USB无线网卡驱动程序for Linuxamp;Android...
- 小米计算机使用技巧,小米手机使用小技巧(小米10手机玩机技巧)
- dz论坛数据库php网址,discuz论坛更换域名,搬家步骤
- 人的差异在于业余时间