Silk解码 开发日志

本人用的是SILK_SDK_SRC_v1.0.9进行开发.开发过程是曲折的,结果自然也是丰盛的.

SDK是从github下载的,由于这个已被整合到一个Android项目,但是文件目录结构尚完整.

所以本人就尝试直接编译整个项目,结果无法编译过去,个人认为是NDK版本不对.后来又看到有

Makefile文件,尝试用make来编译,发现不大理想,首先要生成一堆make用到的文件,这方面不

大熟悉.后来看见有一个Silk_SDK.sln文件,干脆就从这个文件入手,用vs2013打开这文件,先编

译Silk_Fix项目,再编译Dec_SDK项目,完美编译,在项目文件夹中生成Decoder_debug.exe.点

击可以直接运行.算是成功了一半.在控制台中运行,发现输出参数说明是.pcm格式的,到了这里有

点眉目了,.pcm应该是音频数据的最原始数据,声卡能够直接的数据.因为以前在开发webp图片解

码工具,就是直接生成图像的像素数据的.所以认为.pcm应该就是音频最直接的原始数据.接着就是

用Decoder_debug.exe来解码一段Sdk提供的样本.在目录test_vectors\bitstream中.

用法: 样本数据路径 输出路径

当然可以设置其他的参数,这里选择默认不输入,结果完整输出,所以认为程序的输入参数正确.那有了

解码生成的.pcm数据,怎中么检查是否正确,再回过头来想一想,既然.pcm数据是最原始数据,那应该

有程序可以播放.后来经过百度一下:java pcm 发现可以编写java应用来播放.pcm.就马上动手,打开

eclipse 复制代码编译运行,尝试播放,结果可以播放,不过听得不清楚,是不是样本数据本身就这样的?

后来就去手机QQ里找一段silk来进行尝试.为什么我会从手机QQ里找?这里面是有缘由的.

因为自从前几天升级手机QQ之后,发现里面的amr文件居然是零字节,只能在手机QQ里面找聊天

记录播放,当然也可以在里面收藏起来,但是问题来了,只能在手机QQ里播放,就算能收藏起来,谁知道

那天腾讯不再提供收藏了怎么办?里面的很多音频声音都是很动听的呀,对于程序汪汪那是很珍贵的呀!

后来在该目录下还发现有.slk文件,这个也是不能播放,发现和amr文件同名,可以断定那是音频数据,传到

电脑,用notepad++ hex方式打开,发现文件头有这么一个标识 #!SILK_V3,后来经过百度搜索,发现这

是silk文件,后来找到了相关的SDK进行编译.最开始找到的是v1.0.7版本的,里面被上传者写有一个例子,

下载下来编译不过去,其实应该还是NDK的问题吧.再找其他版本,然后就从github下载了v1.0.9版本,就

开始了上面的工作.

回到前面的话题,QQ里面的silk文件不是标准的silk文件,腾讯在文件最前面加了一个字节,后面的与

标准的silk文件格式相同.马上用java编写程序,截取QQ语言文件里面的silk文件.然后用

Decoder_debug.exe解码,生成.pcm文件,用刚才的java程序进行播放,终于传出动人的完整声音.那种

感觉大家都懂的.

接着就是想办法如何封装pcm数据了,首先想到的是无损压缩.因为在解码silk的时候都是用了最好

的参数,这样才能拥有更高保真度.搜索一番,发现都没有好的工具来封装pcm数据,convert可以实现,但

是又要下载安装,很不方便.但是发现和pcm数据有直接关系的是wav格式,写个文件头再复制pcm数据

就可以了.马上写个java程序进行尝试,果然能够完美播放.

又回到NDK的推荐编译方式上,因为咱要把Android版的应用做出来才能方便大众,毕竟不是每个

人都有电脑吧,咱程序猿就讲究奉献吧?!一定要把Android的解码工具做出来!既然不能直接编译,就老

老实实地删繁就简,提取SILK_SDK_SRC_ARM_v1.0.9里面的src和interface目录的文件到Android

项目的jni目录下,大家都知道编译原生应用很关键的一步是,如何编写Android.mk文件.可是无论怎么

写这个文件就是编译不过去.那就先编译SDK成静态库,发现能通过编译.为什么v1.0.7里面的例子就无

法编译?后来干脆删除掉,再回头看看vs2013里面的程序是可以完美运行的,那好直接将里面的

Decoder.c复制过来.先不写任何关于jni的代码,先将Decoder编译成动态库试试,结果还是不行.再回

过头看看下载下来的项目,发现里面的Android.mk文件多了些.S文件需要编译,终于明白了是怎么的

回事,原来S文件和.c文件作为源文件一起编译,当然interface里面的头文件也要添加到Android.mk

里面.Android.mk先编译SDK静态库,再编译Decoder.c成动态库,可是还是无法编译,百度后网友说,

NDK的版本不对,换了NDK版本还是不行,就想是不是ARM版本不兼容?那就舍弃ARM最低版本,直接

将ABI设置为ARMv7.这一次完美编译.接着就是怎么整合了,由于QQ语音和微信语音文件不是标准的

silk文件,一个方案是在java里面先将QQ语音截取成标准的silk文件.后来用了这样的一个方案,将main

函数改成int decode(int argc, char* argv[], int offset);前面两个参数和控制台的一样.为什么要

加offset,不在argv多添加一个字符串,原因是int 类型比字符串类型处理上方便些.再在jni.c文件中将

参数传进去.完美编译!问题又来了,ARM的虚拟机不好用,试试上X86 Android虚拟机,果然不行.那就

在Android.mk里面添加条件语句,编译X86版本的源文件变量不添加.S汇编.完美编译.再用java写封

装方法,成功运行,解码silk文件.

剩下的工作就是进行应用的修改,使得更加人性化.同时用C#编写PC端工具,PC端主要是为

Decoder.exe写一个GUI的参数输入工具,并同时实现封装.

这次就写到这里,后面有好的编程经历也会写出来和大家分享.

时间: 2024-11-08 22:06:01

Silk解码 开发日志的相关文章

[课程设计]任务进度条&开发日志目录

[课程设计]任务进度条&开发日志目录 任务进度条&开发日志目录         周    期          时     间       任       务   Sprint One    11.14     ●  Scrum团队分工及明确任务1.0    Sprint One     11.15      ● Sprint One    11.16     ● Sprint One    11.17     ●

独立开发日志转移说明

为了加强与其他独立游戏开发者的沟通和交流,以后独立开发日志将发在专注独立游戏的indienova,其他通用性的技术文章将继续发在博客园,让不同内容的文章各归其位. 独立开发日志新地址:http://indienova.com/u/guigui/blog

《Invert》开发日志05:终止

今天终于看了久闻大名的<独立游戏大电影>,然后我就做了一个坑爹的决定:终止“Invert”项目的开发.没错,在还没正式开工之前,我就决定停掉这个项目,而且是永久终止.做这个决定并不是因为觉得凭一己之力开发一个游戏不可能,而是因为我突然发现自己正在做的并不是自己想要的游戏.几乎照抄别人的创意,在动工之前就想好如何盈利,只想着如何吸引玩家如何增加留存,这不全是商业游戏的思维和模式吗?这样的游戏又有什么独立开发的意义? 不管是“大电影”还是IndieACE上的讨论都明白无误地告诉我们,真正好的独立游

常规功能和模块自定义系统 (cfcmms)—029开发日志(创建ManyToMany的column4)

029开发日志(创建ManyToMany的column4) 根据以上几节的准备,在这一节中可以加入ManyToManyColumn.js了.先来看看做好的样子如下图: 单击文字链接可以显示该条记录的情况.按下删除按钮则会显示一个提示窗口,询问是否删除此项. 下面即为ManyToManyColumn.js的代码. /** * * ManyToMany记录的管理,将根据权限设置来显示修改或删除按钮 * * 蒋锋 2015.12.31 * */ Ext .define( 'app.module.wid

开发日志-14-07-30

Anaconda == Build == 获取源码:git clone git://git.fedorahosted.org/git/anaconda.git 安装依赖包: sudo yum install libtool $(grep ^BuildRequires: anaconda.spec.in | awk '{print $2}') 安装.配置transifex:sudo yum install transifex-client:tx init /tmp ./autogen.sh &&am

仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源代码)

转载请说明原出处,谢谢~~ 上一篇仿酷狗日志结束后,整个换肤功能就仅仅剩下调色板功能没有做了.我本以为会非常easy.可是研究了酷狗的调色板功能后发现不是那么简单的事情.首先看一下酷狗的调色板的样子: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1aG9uZ3NodQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > waterm

常规功能和模块自定义系统 (cfcmms)—030开发日志(创建ManyToMany的column5)

030开发日志(创建ManyToMany的column5) 现在对于这个字段来说,还剩最后一个功能了,那就是可以修改ManyToMany的值了.在grid的inline操作里面,是可以直接删除已有值,但是如果要新增的话,就必须要有一个新的界面了.下面来看看开发修改ManyToMany字段所需要的步骤. 1.创建一个修改窗口,在里面创建一个可check的树: 2?到后台请求数据,读取当前记录的所有的ManyToMany的可选项,并把已经选中的打勾: 3?根据读取到的数据更新树: 4?用户操作che

常规功能和模块自定义系统 (cfcmms)—032开发日志(用GoJS来绘制模块关系图)

032开发日志(用GoJS来绘制模块关系图) 本系统现在尚没有流程和图表的功能,现在感觉在操作模块的各种功能的时候如果有一个模块关系图,那么就会更直观.网上找了一些绘制图表的库,看了一下GoJS也不错,入门也比较容易.经过一些工作,对业务模块作了一个简单的关系图. GoJS的基础知识请看官网的介绍,在上面的模块图中,有模块节点和连线二种信息需要定义.用户业务模块数据都是由后台组织好后发送到前台的. 整个绘制流程图的界面模块是一个Panel,在render的时候从后台加载数据,然后绘制.js类如下

(中级篇 NettyNIO编解码开发)第十章-Http协议开发应用

HTTPC超文本传输协议〉协议是建立在TCP传输协议之上的应用层协议,它的发展是万维网协会和Internet工作小组IET'F合作的结果.HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过多年的使用和发展,得到了不断地完善和扩展.由于HTTP协议是目前Web开发的主流协议,基于HTTP的应用非常广泛,因此,掌握HTTP的开发非常重要,本章将重点介绍如何基于Netty的HTTP协议技进行HTTP服务端和客户端开发.由于Netty的