mp3转speex的一些研究(貌似不能播放,暂存着)
思路是,先从mp3中提取pcm(raw原始数据),再将原始数据转成speex。
貌似不能播放,可能还存在其他问题,需要继续研究。
使用了两个类库NSpeex和NAudio
using (var waveStream = new NAudio.Wave.Mp3FileReader(@"D:\我的项目源码\Record\Record\bin\Debug\2.mp3"))
{
using (var fileOutputStream = new FileStream(@"D:\我的项目源码\Record\Record\bin\Debug\xxx.spx", FileMode.Create, FileAccess.Write))
{
byte[] buff = new byte[waveStream.Length];
var r = waveStream.Read(buff, , buff.Length);
var bytes = EncodeSpeech(buff, buff.Length);
fileOutputStream.Write(bytes, , bytes.Length);
}
}
private static byte[] EncodeSpeech(byte[] buf, int len)
{
SpeexEncoder encoder = new SpeexEncoder(BandMode.Narrow); // set encoding quality to lowest (which will generate the smallest size in the fastest time)
encoder.Quality = ; int inDataSize = len / ;
// convert to short array
short[] data = new short[inDataSize];
int sampleIndex = ;
for (int index = ; index < len; index += , sampleIndex++)
{
data[sampleIndex] = BitConverter.ToInt16(buf, index);
} // note: the number of samples per frame must be a multiple of encoder.FrameSize
inDataSize = inDataSize - inDataSize % encoder.FrameSize; var encodedData = new byte[len];
int encodedBytes = encoder.Encode(data, , inDataSize, encodedData, , len);
if (encodedBytes != )
{
// each chunk is laid out as follows:
// | 4-byte total chunk size | 4-byte encoded buffer size | <encoded-bytes> |
byte[] inDataSizeBuf = BitConverter.GetBytes(inDataSize);
byte[] sizeBuf = BitConverter.GetBytes(encodedBytes + inDataSizeBuf.Length);
byte[] returnBuf = new byte[encodedBytes + sizeBuf.Length + inDataSizeBuf.Length];
sizeBuf.CopyTo(returnBuf, );
inDataSizeBuf.CopyTo(returnBuf, sizeBuf.Length);
Array.Copy(encodedData, , returnBuf, sizeBuf.Length + inDataSizeBuf.Length, encodedBytes);
return returnBuf;
}
else
return buf;
}
/// <summary>
/// byte数组转short数组
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
private static short[] BytesToShorts(byte[] bytes)
{
//short[] data = new short[bytes.Length / 2];
//Buffer.BlockCopy(bytes, 0, data, 0, bytes.Length);
//return data; //convert to short
short[] data = new short[bytes.Length / ];
int sampleIndex = ;
for (int index = ; sampleIndex < data.Length; index += , sampleIndex++)
{
data[sampleIndex] = BitConverter.ToInt16(bytes, index);
}
return data;
} /// <summary>
/// 获取音频时长
/// </summary>
/// <param name="voiceFile"></param>
/// <returns></returns>
private static int GetVoiceTimeLength(string voiceFile)
{
ShellClass sh = new ShellClass();
var dir = sh.NameSpace(Path.GetDirectoryName(voiceFile));
var item = dir.ParseName(Path.GetFileName(voiceFile));
string str = dir.GetDetailsOf(item, );// 获取歌曲时长。 if (!String.IsNullOrEmpty(str))
{
var arr = str.Split(':');
var i = int.Parse(arr[]) * + int.Parse(arr[]) * + int.Parse(arr[]);
return i;
}
else
return ;
}
第二种获取时长方法
private static double GetVoiceTimeLength2(string voiceFile)
{
using (var waveStream = new NAudio.Wave.Mp3FileReader(voiceFile))
{
return Math.Floor(waveStream.TotalTime.TotalSeconds);
}
}
mp3转speex的一些研究(貌似不能播放,暂存着)的更多相关文章
- HTML5+学习笔记2-------边看代码边研究貌似还是有点问题...还在研究中api中
// 拍照 function getImage() { outSet( "开始拍照:" ); var cmr = plus.camera.getCamera(); cmr.capt ...
- (原创)speex与wav格式音频文件的互相转换(二)
之前写过了如何将speex与wav格式的音频互相转换,如果没有看过的请看一下连接 http://www.cnblogs.com/dongweiq/p/4515186.html 虽然自己实现了相关的压缩 ...
- [C++] 将 mp3 等音乐资源以资源形式嵌入 exe 文件中
引用:http://www.easyx.cn/skills/View.aspx?id=6 本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用.嵌 ...
- 将 mp3 等音乐资源以资源形式嵌入 exe 文件中
引用:http://www.easyx.cn/skills/View.aspx?id=6 本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用.嵌 ...
- VC播放mp3的方法
1.使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") ....... //打开文件 MCI_O ...
- Ubuntu终端命令行播放音乐(mp3)
有很多在终端命令行播放mp3的工具,有的甚至可以生成播放列表.也只有命令行重度使用者有这个需求,下面我们来看一看这些工具. Sox Sox(Sound eXchange)是操作声音文件的瑞士军刀,它可 ...
- 嵌入式mp3播放器
分四部分:按键驱动,声卡驱动,Madplay播放器移植,MP3主播放器处理 按键1:播放,按键2:停止,按键3:上一曲,按键4:下一曲 UA1341内核自带声卡驱动 .解压内核: tar zxvf l ...
- Java NIO ByteBuffer 的使用与源码研究
一.结论 ByteBuffer 是Java NIO体系中的基础类,所有与Channel进行数据交互操作的都是以ByteBuffer作为数据的载体(即缓冲区).ByteBuffer的底层是byte数组, ...
- git的初步研究1
工作中很多项目再往git上迁移,所以打算研究下git git是个版本控制系统 理解git工作区.暂存区.版本库的概念 工作区:在电脑中能看到的目录 暂存区:index即索引 即首先add加入暂存区 c ...
随机推荐
- java中创建对象的方法
有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor ...
- Spring 通知
1. AspectJ 支持 5 种类型的通知注解: @Before: 前置通知, 在方法执行之前执行 @After: 后置通知, 在方法执行之后执行 @AfterRunning: 返回通知, 在方法 ...
- Oracle Key Flexfields Qualifiers
Oracle Key Flexfields Qualifiers 1. Application Developer è Flexfield è Key è Register Title: Ac ...
- Sharepoint安装的几处注意事项
0.sharepoint自带组件安装,无需另下载安装 1.必须安装域(不安装会提示sharepoint 指定的用户是本地账户) 2.域安装后需要在sharepoint设置的数据库账号具有域权限及高级权 ...
- DMV--sys.dm_os_ring_buffers
DMV 'sys.dm_os_ring_buffers' 可以用来诊断数据库连接和数据库内存方面的问题,但MSDN上找不到相应的介绍,网上找到以下相关资料: 1>sys.dm_os_ring_b ...
- maven项目搜索依赖jar包顺序
local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > setti ...
- Let it crash philosophy part II
Designing fault tolerant systems is extremely difficult. You can try to anticipate and reason about ...
- MysqliDb 库的一些使用简单技巧(php)
一.分页功能 假设接口要接受输入:page, page_limit,key,value,table 来查询 table 中 key like value 的元组中以 page_limit 为 page ...
- BZOJ 4002--有意义的字符串(矩阵乘法)
4002: [JLOI2015]有意义的字符串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 963 Solved: 416[Submit][Sta ...
- AngularJS入门讲解2:过滤器和双向绑定
我们在上一课做了很多基础性的训练,接下来,我们讲一些难点的知识点,首先,讲一下如何实现一个全文检索功能: <html ng-app> <head> ... <script ...