mikebai.com

  • Home
  • dev
  • DotNET
  • M365
  • 搞笑
  • 杂七杂八
  • FocusDict
個人BLOG
it developer
dev

Speex编/解码API手册

The libspeex library contains all the functions for encoding and decoding speech with the Speex codec. When linking on a UNIX system, one must add -lspeex -lm to the compiler command line. One important thing to know is that libspeex calls are reentrant, but not thread-safe. That means that it is fine to use calls from many threads, but calls using the same state from multiple threads must be protected by mutexes. Examples of code can also be found in Appendix A and the complete API documentation is included in the Documentation section of the Speex website (http://www.speex.org/). Speex编解码器的libspeex包囊括了所有的语音编码和解码函数。在Linux系统中连接时,必须在编译器命令行中加入-lspeex –lm。需要知道的是,虽然libspeex的函数调用是可重入的,但不是线程安全的,所以在多线程调用时,如果使用共享资源需要进行互斥保护。附录A中有代码实例,在Speex站点(http://www.speex.org/ )的文档部分能下到完整的API文档。     5.1编码 In order to encode speech using Speex, one first needs to: #include <speex/speex.h> Then in the code, a Speex bit-packing struct must be declared, along with a Speex encoder state: SpeexBits bits; void *enc_state; The two are initialized by: speex_bits_init(&bits); enc_state = speex_encoder_init(&speex_nb_mode); For wideband coding, speex_nb_mode will be replaced by speex_wb_mode. In most cases, you will need to know the frame size used at the sampling rate you are using. You can get that value in the frame_size variable (expressed in samples, not bytes) with: speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size); In practice, frame_size will correspond to 20 ms when using 8, 16, or 32 kHz sampling rate. There are many parameters that can be set for the Speex encoder, but the most useful one is the quality parameter that controls the quality vs bit-rate tradeoff. This is set by: speex_encoder_ctl(enc_state,SPEEX_SET_QUALITY,&quality); where quality is an integer value ranging from 0 to 10 (inclusively). The mapping between quality and bit-rate is…

2016-04-17 0comments 106hotness 0likes mikebai Read all
dev

由MP3隨身聽淺談數位錄音原理

常 看到同學們上課時用錄音筆錄下上課的情形,下課後錄音筆搖身一變成為MP3隨身聽,讚嘆之外也有好奇,現在的MP3隨身聽較十幾年前的錄音帶隨身聽音質可 有進境,遂借來試聽,數位的MP3,類比的錄音帶,大小各異,互有長短,惟音質不夠細膩,一問之下,原來同學為了多存幾首歌,犧牲了頻率響應,到底,要怎 麼轉檔,轉成什麼檔比較好,這其中的原理為何,請看以下介紹。 以數位訊號紀錄類比聲音的方法 為了令人更容易瞭解其中的意義,筆者使用樂譜替代一般物理課本常用的正弦波,首先,我們應該很容易瞭解,我們所聽到的聲音或是音樂在物理上的具體表現即是 聲波,簡單的說,用數位訊號記載類比聲音訊號的方法就是用數位訊號的方式表示類比聲波的過程。這個過程,就叫做數位取樣。 為了解釋數位取樣,就要使用以下幾個觀念分別說明,就能了解數位取樣的是怎麼達成的。 觀點一:取樣頻率(sample rate)--- 所謂取樣頻率,就是指要將一秒鐘的聲波分割成幾個點來加以數位化,也就是一秒鐘要取樣幾次:如CD音質的取樣頻率是44.1kHz,而現今錄音工業,甚至DVD的標準則是96 kHz。換句話說,取樣頻率指音效卡在一秒之中對聲音(波形)做記錄的次數。 聲音播出時的品質常常只能達到取樣頻率的一半,因此須採取雙倍樣率才能將原音準確重現.也就是只要取樣頻率大於原始訊號頻率的兩倍以上,即可減低錯誤,達到和原始聲音極真實的音訊。 而人類的聽力的極限約為20KHz,也就是說,將一秒鐘的音樂分割為20000等分以上時,人類就聽不出其品質上的差異,所以高品質的取樣應為其兩倍以 上,當聲音來源為音樂時,因其所橫跨的頻率變化極為寬廣,所以用44.1KHz的頻率作為CD音樂取樣率的標準,也就是每秒鐘紀錄441000次;若以語 音的記錄為主,譬如演講,人說話的語音大約為10KHz,因此加倍採樣,只取22KHz,也就是每秒鐘紀錄22000次就已具備足夠的音質。 取樣率越高, 所記錄下來的音質就越清晰;當然,越高的取樣所記錄下來的檔案就會越大。 觀點二:取樣解析度(sample resolution) 而音質分辨率則是對於聲波的「振幅」進行切割,形成類似階梯的度量單位,如果說取樣頻率是對聲波水平進行的X軸切割,那麼音質分辨率則是對Y軸的切割,切 割的數量是以最大振幅切成2的n次方計算,n就是bit數, 8位元代表我們對音波的振幅做2的八次方256種強度的區別。CD音質是16位元就是2的8次方為65536種強度區別,而DVD的標準則是24位元。取 樣頻率與解析度越大,則數位聲訊的品質就越細膩。位元數越高越能區分細緻的強弱音變化。常用區分音頻如下表。     取樣頻率 位元數 單音/立體聲 傳送位元率 DVD 96000 Hz 24bit 立體聲 562.5KB/sec CD品質 44100 Hz 16 bits 立體聲 172KB/sec 收音機品質 22050 Hz 8 bits

2016-04-17 0comments 98hotness 0likes mikebai Read all
dev

RTMP中的speex音频流与RTP的对接

    之前写过一篇《RTMP中FLV流到标准h264、acc的转换》,链接地址 http://www.cnblogs.com/chef/archive/2012/07/18/2597279.html 。着重分析了RTMP协议中h264的抽取。     带音视频交互的flash项目中,音频编码只能选择speex格式。     这篇文章分为三部分。分别为flex中提供的音频接口、RTMP中的speex数据、如何转换为RTP流。   一、flex中提供的音频接口     用flex编写客户端,它提供的接口是封装过的,与speex标准编解码器之间的调用实际上相当于一个黑盒,它们之间的差异需要我们分析。     麦克风音频的接口由类Mircophone提供,大多都有中文注释,我就不一一赘述了,只挑出其中一些做自己的讲解。 codec 编码格式,只支持Nellymoser、speex两种格式, Nellymoser多用于游戏开发,而且商业使用限制较多 rate 设置采样频率,注意是麦克风采样率,而非编码采样率 framesPerPacket 一个音频包中包含的音频帧数量(后文会有更详细的说明) encodeQuality 编码质量,在同等编码采样率下,质量越高,效果越好, 但每帧所包含的数据越多。当该值也确定下来时, 每帧数据的字节大小也就确定了 enableVAD 是否开启Voice Activation Detection。它的作用自己google。 当开启时,静音状态下speex编码器将持续编码10字节大小的音频帧       speex编码有三种模式 模式 编码采样率 一帧数据 所表示的时间 编码一帧需要的 sample数量 narrow band(窄带) 8khz 20ms 160 wide band(宽带) 16khz 20ms 320 ultra-wide band(超宽带) 32khz 20ms 640   二、RTMP中的speex数据     每个音频包(相当于FLV中的audiotag)中,第一个字节的前四位表示编码格式,等于11说明为speex编码。后4个字节分别表示编码采样率、单声道or立体声、每个sample大小8位or16位。但采用speex编码时,它们是固定不变的,协议中的为无效数据。编码采样率恒为16khz,单声道,16bit/sample。     剩余的数据为音频帧数据,可以为多帧的集合,取决于前文提到过的framesPerPacket。在flex中的默认值为2,故每个音频包中有两帧数据。注意,当前文所说的VAD功能开启时,两帧数据可以是两帧实际数据,也可以是两帧10字节数据,还可以各占一帧。   三、如何转换为RTP流     完成上面两步,这部分的工作就不难了。将音频帧数据打上RTP头就行了。具体参加rfc5574(rtp_payload_format_for_the_speex_codec)。     唯一值得注意的一点是,在RTMP协议中,音频数据的间隔是用时间做单位的,而RTP中的时间戳(timestamp),是sample数量。故当RTMP中两包音频包相差20MS时,RTP的时间戳就应该加上320(加320是因为恒采用16khz编码采样率)。

2016-04-17 0comments 105hotness 0likes mikebai Read all
dev

Speex编解码介绍

2.1 概念 采样率 比特率 质量(可变) 复杂度(可变) 变比特率 平均比特率 静音检测 非连续性传输 知觉增强 延时算法 2.2 编解码 2.3 预处理器 2.4 自适应抖动缓冲 2.5 回声消除 2.6 重采样 This section describes Speex and its features into more details 这部分详细介绍Speex及其特性 2.1 概念 Before introducing all the Speex features, here are some concepts in speech coding that help better understand the rest of the manual. Although some are general concepts in speech/audio processing, others are specific to Speex 在介绍Speex特性之前,为了便于阅读后面的文档,需要解释一些概念,尽管一些概念是在语音/音频处理过程中常见的,但也有Speex特有的一些。 采样率 The sampling rate expressed in Hertz (Hz) is the number of samples taken from a signal per second. For a sampling rate of Fs kHz, the highest frequency that can be represented is equal to Fs/2 kHz (Fs/2 is known as the Nyquist frequency). This is a fundamental property in signal processing and is described by the sampling theorem. Speex is mainly designed for three diff erent sampling rates: 8 kHz, 16 kHz, and 32 kHz. These are respectively refered to as narrowband, wideband and ultra-wideband. 采样率是指从连续信号中每秒钟采集到的采样数量。用Fs kHz来表示,最高频率可表示为Fs/2 kHz(见奈奎斯特Nyquist频率)。采样定理表明这是信号处理最基本的属性。Speex主要设计了三种不同的采样率:8kHz,16kHz和32kHz。分别表示了窄带、宽带和超宽带。 比特率 When encoding a speech signal, the bit-rate is defined as the number of bits per unit of time required to encode the speech. It is measured in bits per second (bps), or generally kilobits per second. It is important to make the distinction between kilobits per second (kbps) and kilobytes per second (kBps). 比特率是指每秒钟传送的比特数,在语音信号编码时,表示语音数据每秒钟需要多少个比特表示,单位为bps(比特/秒)或kbps(千比特/秒)。注意区分kbps和kBps(千字节/秒)。 质量(可变) Speex is a lossy codec, which means that it achives compression at the expense of fidelity of the input speech signal. Unlike ome other speech codecs, it is possible to control the tradeoff made between quality and bit-rate. The Speex encoding process is…

2016-04-17 0comments 101hotness 0likes mikebai Read all
dev

SPX数据格式

http://www.onicos.com/staff/iz/formats/ogg.html Byte order: Little-endian Offset Length Contents [ 0 4 bytes "OggS" 4 1 byte Stream structure version (0x00) 5 1 byte Packet flag: bit 0: true if page continued bit 1: true if first page bit 2: true if last page bit 3..7: reserved 6 8 bytes The end pcm sample position (64bit integer) 14 4 bytes Stream serial number 18 4 bytes Page number 22 4 bytes Check sum 26 1 byte Number of segments(s) 27 (s)bytes Sengment table 27+(s) (b)bytes Body (b := header[27] + header[27+1] + ... + header[27+s-1]) ]* http://www.file-recovery.com/ogg-signature-format.htm OGG Audio Signature Format: Specification & OGG Recovery Example Ogg is an open container format maintained by the Xiph.Org Foundation. OGG container format can multiplex a number of independent streams for audio, video, text (such as subtitles), and metadata. OGG Vorbis compressed audio files must have a signature (tag) OggS (hex: 4F 67 67 53) at the beginning of the audiofile. OGG files are organized into data segments. Each segment is prefixed with an 27 byte header: 4 byte signature (OggS) used to identify the header and storing flags, checksum and other important information. If header's Flags field has a bit 2, or TotalSegments field is a zero, this is the end of the audio file. At header's offset 26 there is byte, describing total segments number. After the header located sizes for each segment (one byte per segment), followed by the actual segments data. By searching for data headers and summarizing sizes for headers and data segments we can calculate total OGG file size.…

2016-04-13 0comments 105hotness 0likes mikebai Read all
dev

speex与wav格式音频文件的互相转换(二)(转载)

之前写过了如何将speex与wav格式的音频互相转换,如果没有看过的请看一下连接 http://www.cnblogs.com/dongweiq/p/4515186.html 虽然自己实现了相关的压缩算法,但是发现还是与gauss的压缩比例差了一些,一部分是参数设置的问题,另外一部分是没有使用ogg的问题。 本来想研究一下gauss的ogg算法,然后将他录制的音频转为wav格式,再继续进行后面的频谱绘制之类的。 在后续的研究gauss的解码过程,他是先解了ogg的格式,然后分段,然后去掉speex的头,然后把一段段的speex数据再解码成pcm的原数据,最后使用audiotrack一段段播放出来了。audiotrack播放的时候是阻塞的,所以播了多久就解了多久。 既然他得到了一段段pcm的原数据,那我就可以去将这一段段的原数据拼起来,最后得到解码完成的整个的pcm数据,最后加上wav的头不就可以直接转换成wav格式的音频了么??? 前天的时候想到这里,立马就去改了。 SpeexDecoder是gauss的demo里主要的解码类,我们复制一份,改名为SpeexFileDecoder 去掉里面跟播放相关的audiotrack变量,因为我们要得到的是解码数据,跟播放无关。 修改后代码如下 1 package com.sixin.speex; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.RandomAccessFile; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 import android.media.AudioFormat; 11 import android.media.AudioManager; 12 import android.media.AudioTrack; 13 import android.os.RecoverySystem.ProgressListener; 14 import android.util.Log; 15 16 /** 17 * 采用Jspeex方案,首先解包,从ogg里面接出来,然后使用speex decode将speex转为wav数据并进行播放 18 * 19 * @author Honghe 20 */ 21 public class SpeexFileDecoder { 22 23 protected Speex speexDecoder; 24 private String errmsg = null; 25 private List<ProgressListener> l

2016-04-07 0comments 98hotness 0likes mikebai Read all
dev

speex与wav格式音频文件的互相转换(转载)

我们的司信项目又有了新的需求,就是要做会议室。然而需求却很纠结,要继续按照原来发语音消息那样的形式来实现这个会议的功能,还要实现语音播放的计时,暂停,语音的拼接,还要绘制频谱图等等。 如果是wav,mp3不论你怎么拼接,绘制频谱图,我也没有问题,网上都有现成的例子。然而这一次居然让用speex的音频做这一切。 于是看了司信之前的发语音消息部分speex的代码,天啊,人家录的时候这是实时录音实时编码的好不好,人家放的时候也是实时解码实时播放的好不 好。你这让我怎么通过 一个speex文件就得到全部的频谱图和时间啊,你让我怎么在播放的时候暂停,然后再按一下继续播放啊,这哪里是坑啊,这简直就是坑爹啊。 speex格式的文件是不能暂停的,也不能直接得到时间长度和频谱,因此只能转化成wav或者mp3格式的才可以。要想实现上面的功能就必须实现speex文件与正常音频格式的转换。 这里可能有些人对安卓的录音过程不太懂,先介绍一下(研究了这么久,就让我卖弄一下吧) 安卓录音的时候是使用AudioRecord来进行录制的(当然mediarecord也可以,mediarecord强大一些),录制后的数据称 为pcm,这就是raw(原始)数据,这些数据是没有任何文件头的,存成文件后用播放器是播放不出来的,需要加入一个44字节的头,就可以转变为wav格 式,这样就可以用播放器进行播放了。 怎么加头,代码在下边: 1 // 这里得到可播放的音频文件 2 private void copyWaveFile(String inFilename, String outFilename) { 3 FileInputStream in = null; 4 FileOutputStream out = null; 5 long totalAudioLen = 0; 6 long totalDataLen = totalAudioLen + 36; 7 long longSampleRate = AudioFileFunc.AUDIO_SAMPLE_RATE; 8 int channels = 2; 9 long byteRate = 16 * AudioFileFunc.AUDIO_SAMPLE_RATE * channels / 8; 10 byte[] data = new byte[bufferSizeInBytes]; 11 try { 12 in = new FileInputStream(inFilename); 13 out = new FileOutputStream(outFilename); 14 totalAudioLen = in.getChannel().size(); 15 totalDataLen = totalAudioLen + 36; 16 WriteWaveFileHeader(out, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate); 17 while (in.read(data) != -1) { 18 out.write(data); 19 } 20 in.close();

2016-04-07 0comments 97hotness 0likes mikebai Read all
dev

zengin system note

Zengin TCP/IP Adapter https://www-01.ibm.com/support/knowledgecenter/mobile/#!/SS3JSW_5.2.0/com.ibm.help.svcs_adpts_m_z.doc/Zengin_adapter.html

2016-03-02 0comments 118hotness 0likes mikebai Read all
DotNET

VSTO 学习笔记(十三)谈谈VSTO项目的部署

一般客户计算机专业水平不高,但是有一些Office水平相当了得,尤其对Excel的操作非常熟练。因此如果能将产品的一些功能集成在Office中,将会有很好的基础。 但是由于客户安装的Office版本不一,所以VSTO项目的部署问题显得尤为重要,需要考虑很多问题。 测试代码下载 本系列所有测试代码均在Visual Studio 2010 Ultimate SP1 + Office 2010 Professional Plus x64 SP1 上测试通过   大致归纳一下,主要有以下一些情况: 1、Office版本不同 目前主要有Office 2003、Office 2007、Office 2010。 2、32位与64位的Office 目前只有Office 2010提供64位版本。 3、64位操作系统安装32位的Office 目前多出现在新上市的笔记本,很多都是Win7 64位,安装了Office 2007、2010 32位。 此外,不同VSTO项目的部署方式也不相同。主要有如下一些VSTO项目类型: 1、文档类型 如Word Document、Excel Workbook 2、AddIn类型 如Word AddIn、Excel AddIn 3、Shared AddIn类型 4、Excel自定义公式类型   下面我们就来逐个探讨一下相应的部署方案。 注意VS2010 只支持Office 2007、Office 2010,若要开发基于Office 2003的VSTO项目,请使用VS2005、VS2008。 一、待部署的项目是文档类型 1.1、使用VS 2010创建一个Excel Workbook项目:   1.2、选择Office 2007格式.xlsx:   1.3、在一个工作表中放置一个按钮:   1.4、在其单击事件中弹出一个对话框:   1.5、F5运行,会打开Excel,点击按钮弹出我们希望看到的信息:   1.6、在Debug目录下会发现生成了如下这些文件: 由于是文档类型,因此生成一个Excel工作簿很正常。有一个.vsto格式的文件很少见,它就是VSTO项目部署时的安装文件。 .vsto文件其实是一个XML文件,用文本编辑器打开可以看到具体内容: 包含了VSTO项目的具体信息,如.NET运行时版本,依赖的程序集,数字签名等信息,不要手动修改这个文件。 .NET运行时为4.0,所以客户端首先要安装.NET Framework 4.0。 .vsto的默认打开方式是Visual Studio Tools For Office Execution Engine: 该组件包含于Visual Studio Tools For Office 运行时,因此客户端若要运行VSTO程序,还需要安装Visual Studio Tools For Office 运行时。 Visual Studio 2010 Tools for Office Runtime 可以在这里下载。   1.7、我用了一个虚拟机模拟客户端,安装了.NET 4.0和Office 2010后就可以打开.vsto了:   1.8、安装成功后就可以打开Debug中的Excel文件了: 注意文档类型的VSTO项目安装后只对发布的一个文档有效(只对Debug中的Excel有效),不影响用户其他的Office文件,即文档类型项目不是全局性的。   1.9、在控制面板中可以将该VSTO项目卸载:   二、待部署的项目是Add In类型 2.1、新建一个Word Add In项目:   2.2、添加一个可视化Ribbon:   2.3、Ribbon中添加一个按钮:   2.4、单击弹出对话框:   2.5、F5运行后会打开Word:   2.6、在Debug目录中会生成一些文件:   2.7、客户端依旧需要安装.NET 4.0、Visual Studio 2010 Tools For Office Runtime才能运行该VSTO项目: 注意Add In 类型是全局性的,只要安装,用户随便打开一个Office文档都会包含该Add In。

2016-01-14 0comments 122hotness 0likes mikebai Read all
dev

android webview js交互 第一节 (java和js交互)

       转载请注明出处         挺帅的移动开发专栏  http://blog.csdn.net/wangtingshuai/article/details/8631835        在android的开发过程中,有很多时候需要用到本地java代码和javascript进行交互。android对交互进行了很好的封装,在开发中我们可以很简单的用java代码调用webview中的js,也可以用webview中的js来调用本地的java代码,这样我们可以实现很多原来做不了的功能,比如点击网页上的电话号码后,手机自动拨打电话,点击网页中的笑话,自动发送短信等. 废话不多说,这次教程的目标如下 android 中的java代码调用webview里面的js脚本 webview中的js脚本调用本地的java代码 java调用js并传递参数 js调用java并传递参数 功能一 android中调用webview中的js脚本非常方便,只需要调用webview的loadUrl方法即可(注意开启js支持) [html] view plaincopy // 启用javascript   contentWebView.getSettings().setJavaScriptEnabled(true);   // 从assets目录下面的加载html   contentWebView.loadUrl("file:///android_asset/wst.html");                    // 无参数调用          contentWebView.loadUrl("javascript:javacalljs()");   功能二 webview中js调用本地java方法,这个功能实现起来稍微有点麻烦,不过也不怎么复杂,首先要对webview绑定javascriptInterface,js脚本通过这个接口来调用java代码。 [java] view plaincopy contentWebView.addJavascriptInterface(this, "wst");   javainterface实际就是一个普通的java类,里面是我们本地实现的java代码, 将object 传递给webview,并指定别名,这样js脚本就可以通过我们给的这个别名来调用我们的方法,在上面的代码中,this是实例化的对象,wst是这个对象在js中的别名

2016-01-04 0comments 134hotness 0likes mikebai Read all
1…2425262728…62

Recent Posts

  • c# winform适配高dpi
  • com.microsoft.sqlserver.jdbc.SQLServerException “trustServerCertificate”属性设置为“false”,但驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server建立安全连接
  • java -cp 用法介绍
  • HTML 容器元素
  • MVC的cshtml的介绍

Recent Comments

No comments to show.

COPYRIGHT © 2025 mikebai.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang