思路是,先从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的一些研究(貌似不能播放,暂存着)的更多相关文章

  1. HTML5+学习笔记2-------边看代码边研究貌似还是有点问题...还在研究中api中

    // 拍照 function getImage() { outSet( "开始拍照:" ); var cmr = plus.camera.getCamera(); cmr.capt ...

  2. (原创)speex与wav格式音频文件的互相转换(二)

    之前写过了如何将speex与wav格式的音频互相转换,如果没有看过的请看一下连接 http://www.cnblogs.com/dongweiq/p/4515186.html 虽然自己实现了相关的压缩 ...

  3. [C++] 将 mp3 等音乐资源以资源形式嵌入 exe 文件中

    引用:http://www.easyx.cn/skills/View.aspx?id=6 本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用.嵌 ...

  4. 将 mp3 等音乐资源以资源形式嵌入 exe 文件中

    引用:http://www.easyx.cn/skills/View.aspx?id=6 本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用.嵌 ...

  5. VC播放mp3的方法

    1.使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") ....... //打开文件 MCI_O ...

  6. Ubuntu终端命令行播放音乐(mp3)

    有很多在终端命令行播放mp3的工具,有的甚至可以生成播放列表.也只有命令行重度使用者有这个需求,下面我们来看一看这些工具. Sox Sox(Sound eXchange)是操作声音文件的瑞士军刀,它可 ...

  7. 嵌入式mp3播放器

    分四部分:按键驱动,声卡驱动,Madplay播放器移植,MP3主播放器处理 按键1:播放,按键2:停止,按键3:上一曲,按键4:下一曲 UA1341内核自带声卡驱动 .解压内核: tar zxvf l ...

  8. Java NIO ByteBuffer 的使用与源码研究

    一.结论 ByteBuffer 是Java NIO体系中的基础类,所有与Channel进行数据交互操作的都是以ByteBuffer作为数据的载体(即缓冲区).ByteBuffer的底层是byte数组, ...

  9. git的初步研究1

    工作中很多项目再往git上迁移,所以打算研究下git git是个版本控制系统 理解git工作区.暂存区.版本库的概念 工作区:在电脑中能看到的目录 暂存区:index即索引 即首先add加入暂存区 c ...

随机推荐

  1. Google Tango Java SDK开发:Motion Tracking 运动追踪

    Java API Motion Tracking Tutorial运动追踪教程 This page describes how the Java API handles motion tracking ...

  2. 如何在Windows环境下安装Linux系统虚拟机

    如何在Windows环境下安装Linux系统虚拟机 本篇经验写给想要入门学习C语言的小白们.Windows系统因为使用窗口图形化,操作简单,功能多样,所以我们在Windows环境下可以做到很多,但想要 ...

  3. 20169221 2016——2017《网络攻防》SQL注入

    准备知识 1.SQL语言 结构化查询语言(Structured Query Language)简称SQL:是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系 ...

  4. CentOS6.5中使用 iperf 检测主机间网络带宽

    安装方式 # yum install http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm# yum inst ...

  5. 用VC实现特定编辑框上对回车键响应

    一.引言 在通常的以CEditView为基类的单文档/多文档视图程序中,可以很好的响应键盘输入的回车键,只需比较最近两次的输入的字符,看看最新输入的字符是否内码是13(0x0d,回车键的内码)即可识别 ...

  6. c#中sealed修饰符

    sealed 修饰符表示密封 用法: 1.用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互相排斥 2.用于方法和属性时,表示该方法或属性不能再被重写,必须和o ...

  7. double? int?

    C# 值类型加上?表示可空类型(Nullable 结构),就是一种特殊的值类型,它的值可以为null 例: int? float? stirng? double?

  8. Linux CentOS环境下.Net Core SDK安装

    1.安装.Net SDK 在安装.NET之前,需要注册产品存储库并安装所需的依赖关系. 打开Linux命令提示符并运行以下命令: sudo rpm -Uvh https://packages.micr ...

  9. Codeforces Beta Round #75 (Div. 1 Only) B. Queue 二分

    B. Queue Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 codeforces.com/problemset/problem/91/B Descrip ...

  10. Android Studion有用的快捷键

    注释:ctrl+/ 如果代码未添加注释,则添加注释上去:否则取消已经注释. 格式化代码:ctrl+alt+L l键不需要大写锁定,这里只是为了更清楚表示是L键.