文档章节

Silk解码 开发日志

梁金堂
 梁金堂
发布于 2015/08/24 22:09
字数 1856
阅读 2847
收藏 0

      本人用的是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的参数输入工具,并同时实现封装.

 

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

 

 个人成果分享

链接1:http://pan.baidu.com/s/1eRmtVTg

链接2: http://pan.baidu.com/s/1hrzhe7q 密码: d7ug

 

© 著作权归作者所有

梁金堂
粉丝 9
博文 15
码字总数 17275
作品 0
玉林
私信 提问
silk解码 问题请教

@梁金堂 您好, 在看了您对silk解码的讲解 觉得受益匪浅,想学习一下,秉承开源的精神,能否将您相关silk解码的java代码和您使用的silk的相关资源发送一下,在此万分感谢。苦于研究silk多日未...

branwel
2015/12/08
209
1
Silk编解码在android实现

Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器。Skype已将其开源,可以访问http://developer.skype.com/silk获 取最新动向。SILK Codec是一个语音和...

stefanliao
2012/11/22
2.2K
0
苹果收购硅谷创业公司 Silk Labs,将继续布局 AI 和 IoT

雷锋网(公众号:雷锋网)消息,11 月 20 日,The Information 发布文章称,今年早些时候,苹果已经悄悄地收购了一家名为 Silk Labs 的 AI 创业公司。 根据公开资料,Silk Labs 成立于 2015 年...

I/O
2018/11/21
0
0
大数据时代下看Amazon是如何处理隐私问题的

在访问Amazon电商网站时总会看到这样的提示,对于互联网用户来说,应该已经非常熟悉这样的推荐了吧。Amazon是通过所谓协同过滤(collaborative filtering)的技术,来实现这一商品推荐功能的...

生气的散人
2013/08/28
272
3
亚马逊推云浏览器Silk 大大提高浏览速度

亚马逊今天推出了Silk浏览器,据介绍,它采用“分裂式浏览器(split browser)”架构,在移动设备中,通过利用亚马逊网络云服务( Web Services cloud (AWS))的运算力和运算速度、给硬件设备...

xianlai
2011/12/01
1K
15

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
672
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
38
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
25
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
71
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
69
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部