Cocos2d-x项目移植到WP8系列之五:播放MP3
原文链接: http://www.cnblogs.com/zouzf/p/3972549.html
这一块的细节还是不太了解,只是东凑西拼能跑起来而已
1、网上下载lamb库 生成需要的lib库,详情见 【Advanced Windows Phone Programming】在windows phone 8中录制MP3和AAC及Amr音频 第三点的前半部分,也就是生成lib那一部分,然后在CocosDenshion工程里引用那两个lib。
2、把CocosDenshion工程里的Audio.cpp里的void Audio::PreloadSoundEffect(const char* pszFilePath, bool isMusic) 方法里的m_soundEffects[sound].m_soundID = sound; 这句代码之前的代码改成如下:
if (m_engineExperiencedCriticalError) {
return;
} std::string path(pszFilePath); int sound = Hash(pszFilePath); MediaStreamer mediaStreamer; // no MP3 support for CC_PLATFORM_WP8
std::string::size_type pos = path.find(".mp3");
if (pos != path.npos)
{
//path.replace(pos, path.length(), ".wav"); mediaStreamer.Initialize_MP3(CCUtf8ToUnicode(pszFilePath).c_str());
}
else
{
mediaStreamer.Initialize(CCUtf8ToUnicode(pszFilePath).c_str());
} // mediaStreamer.Initialize(CCUtf8ToUnicode(pszFilePath).c_str());
m_soundEffects[sound].m_soundID = sound;
3、CocosDenshion工程里的MediaStreamer类加多一个方法:void MediaStreamer::Initialize_MP3(__in const WCHAR* url),实现如下:
void MediaStreamer::Initialize_MP3(__in const WCHAR* url)
{ WCHAR filePath[MAX_PATH] = {};
if ((wcslen(url) > && url[] == ':'))
{
// path start with "x:", is absolute path
wcscat_s(filePath, url);
}
else if (wcslen(url) >
&& (L'/' == url[] || L'\\' == url[]))
{
// path start with '/' or '\', is absolute path without driver name
wcscat_s(filePath, m_locationPath->Data());
// remove '/' or '\\'
wcscat_s(filePath, (const WCHAR*)url[]);
}else
{
wcscat_s(filePath, m_locationPath->Data());
wcscat_s(filePath, url);
} hip_t hip = hip_decode_init();
if (!hip)
{
printf("创建mp3解码失败");
return ;
} mp3data_struct mp3str;//mp3文件编码信息
std::vector<short*> mp3Buffer;// mp3数据流
std::vector<int> mp3BufferSize; int samples;
int mp3_bytes;
int write_bytes = ; const int BUF_SIZE = ;
const int INBUF_SIZE = ;
const int MP3BUF_SIZE = (int)(1.25 * BUF_SIZE) + ; short pcm_l[INBUF_SIZE];
short pcm_r[INBUF_SIZE];
unsigned char mp3_buf[MP3BUF_SIZE]; FILE * MP3File; std::wstring wstr = std::wstring(filePath);
// return std::string(wstr.begin(),wstr.end()); std::string str_filePath = std::string(wstr.begin(),wstr.end());//"C:\\Data\\Programs\\{4AE99D96-62EE-4A1C-A345-F1B0A81D07BC}\\Install\\Assets\\Resources\\islandbg.mp3"; auto error = fopen_s(&MP3File, str_filePath.c_str(), "rb");
mp3data_struct mp3Header; while ((mp3_bytes = fread(mp3_buf, , , MP3File)) > )
{
samples = hip_decode_headers(hip, mp3_buf, , pcm_l, pcm_r, &mp3Header);
if (samples > )
{
short *tt = new short[samples*sizeof(short)];
memcpy((void*)tt, (const void*)pcm_l, samples*sizeof(short));
mp3Buffer.push_back(tt);
write_bytes += samples*sizeof(short);
mp3BufferSize.push_back(samples*sizeof(short));
//write_bytes = fwrite(pcm_l, sizeof(short), samples, wavfp);
}
} byte* _mp3Buffer = new byte[write_bytes];
byte* temp = _mp3Buffer;
int size = mp3BufferSize.size();
for(int i=;i<size;i++)
{
memcpy(temp, mp3Buffer[i],mp3BufferSize[i]);
delete mp3Buffer[i];
temp += mp3BufferSize[i];
}
mp3Buffer.clear();
hip_decode_exit(hip);
//m_soundEffects[sound].m_soundEffectBufferData m_data.resize(write_bytes);
for(int i=;i<write_bytes;i++)
{
m_data[i]=_mp3Buffer[i];
} fclose(MP3File); m_waveFormat.wFormatTag = WAVE_FORMAT_PCM; //固定
m_waveFormat.nChannels = ; //固定
m_waveFormat.nSamplesPerSec = (DWORD) mp3Header.samplerate;// 固定 m_waveFormat.wBitsPerSample = ;// mp3Header.bitrate * m_waveFormat.nChannels / 8;
//m_waveFormat.wBitsPerSample = mp3Header.bitrate * m_waveFormat.nChannels / 8.0;
m_waveFormat.nBlockAlign = m_waveFormat.nChannels * m_waveFormat.wBitsPerSample / 8.0;
m_waveFormat.nAvgBytesPerSec = m_waveFormat.nSamplesPerSec * m_waveFormat.nBlockAlign; //越大越快
m_waveFormat.cbSize = ; }
完成。
大概流程就是,通过lamb的两个lib库的方法,读取MP3文件的流构建成wav文件格式的流,重点在于通过MP3的文件头信息mp3data_struct 构建出 wav文件的文件头信息WAVEFORMATEX。
另外,因为只读取了一个声道的流,所以m_waveFormat.nChannels = 1;如果对声道有要求的,可以在while循环里把右声道的流也处理一下。
附上一些参考文章: lame mp3解码 Suche MP3 to WAV decoder
原文链接: http://www.cnblogs.com/zouzf/p/3972549.html
Cocos2d-x项目移植到WP8系列之五:播放MP3的更多相关文章
- Cocos2d-x项目移植到WP8系列之二:开篇
原文链接: http://www.cnblogs.com/zouzf/p/3970130.html 开发环境一笔带过吧,主板和CPU要支持虚拟化技术,要开启才行,装个64位win8.1系统,win8不 ...
- Cocos2d-x项目移植到WP8系列之三:C++和C#的交互
原文链接: http://www.cnblogs.com/zouzf/p/3971021.html 上一篇提到工程使用 XAML 和 Direct3D 项目模板 是因为要涉及到C++和C#的交互,微软 ...
- Cocos2d-x项目移植到WP8系列之一:前传
原文链接: http://www.cnblogs.com/zouzf/p/3969993.html 许久没动笔了,随想一直都有动笔的想法,但拖来拖去,归根到底还是一个懒字吧 .发现人的惰性真是太强大了 ...
- Cocos2d-x项目移植到WP8系列之九:使用自定义shader
本文原链接:http://www.cnblogs.com/zouzf/p/3995132.html 有时候想得到一些例如灰度图等特殊的渲染效果,就得用到自定义shader,关于shader的一些背景知 ...
- Cocos2d-x项目移植到WP8系列之八:CCLabelTTF显示中文不换行
原文链接: http://www.cnblogs.com/zouzf/p/3985330.html 在wp8平台上,CCLabeTTF显示中文不会自动换行,看了下源码,原来底层的实现是根据text的空 ...
- Cocos2d-x项目移植到WP8系列之六:C#工程使用C++的DLL
原文链接: http://www.cnblogs.com/zouzf/p/3984510.html 此时,一些大问题都被解决后,整个工程基本能跑起来了,最后一个大问题是:业务层是用Lua开发的,底层的 ...
- Cocos2d-x项目移植到WP8系列之四:文件操作
原文链接: http://www.cnblogs.com/zouzf/p/3972457.html 读写文件Cocos已经用fopen fwrite来做好了,这里说的主要是文件和文件夹的创建.删除.判 ...
- Cocos2d-x项目移植到WP8系列之七:中文显示乱码
原文链接:http://www.cnblogs.com/zouzf/p/3984628.html C++和C#互调时经常会带一些参数过去例如最常见的字符串,如果字符串里有中文的话,会发现传递过去后变成 ...
- Cocos2d-x项目移植到WP8小记
Cocos2d-x项目移植到WP8小记 作者: K.C. 日期: 10/24/2013 Date: 2013-10-24 00:33 Title: Cocos2d-x项目移植到WP8小记 Tags: ...
随机推荐
- 怎样在asp.net中用一般处理文件ashx实现下载功能
/// <summary> /// 下载文件,支持大文件.续传.速度限制.支持续传的响应头Accept-Ranges.ETag,请求头Range . /// Accept-Ranges:响 ...
- 第二章----python函数
第一节:调用函数 1.函数是什么? 函数是组织好的,可以重复利用的. 2.为什么要用到函数? 提高应用的模块性,提高重复利用率.指的是:多个文件中可能都要用到该函数,直接拿来调用就行,不用在重复写一个 ...
- Android Studio3.0 配置ButterKnife出错的解决
需要注意的问题: (1)ButterKnife.bind(this);必须在设置布局之后进行初始化: 官方升级到了8.8.1了 compile 'com.jakewharton:butterknife ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.2——设置Flavors和Variants
问题: 需要构建大体上一样,但是使用不同资源或者类的应用. 解决方案: 产品的flavors可以帮助你对同一个app创建不同的版本. 讨论: build types是开发过程的一部分,一般用来将app ...
- Java 基础巩固:装箱拆箱 你真的熟悉吗
先考两道题: Integer a1 = 300; Integer a2 =300; System.out.print(a1 == a2); Integer b1 = 1; Integer b2 = 1 ...
- 回溯法——最大团问题(Maximum Clique Problem, MCP)
概述: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题.最大团问题又称为最大独立集问题(Maximum Independent ...
- jetty;linux 目录结构
[说明]今天看了看jetty这个web容器,上午看基础理论框架知识(后面半点没用到),下午下载了jetty,并且在上面部署了一个war应用,晚上在做eclipses整合jetty的时候出现了问题,下载 ...
- UVA Dividing coins
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
- delphi小知识 点(if条件符,to_date)
1.if条件 与:and 或:or 不等于:<> 等于:= 例子: if(j=1)and(nFH<>0) then begin tLCH:=Trim(copy(tSAMPLEI ...
- Python: names, values, assignment and mutability
推荐先看视频(youtube) Ned Batchelder - Facts and Myths about Python names and values - PyCon 2015 Change v ...