android代码 qq语音,仿QQ语音变声功能实现(二)---移植到android studio 并解决部分问题...

news/2024/11/14 3:51:47/

版权声明:转载必须注明本文转自张鹏辉的博客: http://blog.csdn.net/qingtiangg

大家好,距离上一篇博客半年过去了,关于上一篇博客很多人加我QQ留言问了几个问题,最近不忙决定解决一下,并写几个文档总结下这半年的经验,这篇文档主要是记录下移植的过程。

统计

1:因为半年前代码用Eclipse写的,有人问我能不能移植到Android Studio 上,可以

2:变声后的文件在哪里?这么保存?问这个问题的肯定没有认真阅读我上一篇博客和看源码。(我这里提供一种解决方案,在最下面认真往下看)

开始

Android Studio NDK目前有两种玩法:

1: ndk-build 、Android.mk、 Application.mk

2: CMake

我也不介绍他俩对比了,第二个是android studio2.2之后主推的,新建ndk项目直接勾选上可以玩了。

既然要移植到android studio上我们也用第二种

开撸:

1.创建新项目(Create New Project)

勾选上 Include C++ Support

09ccc55cdce2

这里写图片描述

接下来和普通创建一样一路 ---->Next到下图这个页面

2.配置C++(Customize C++ Support)

你们 C++ Standard 这里应该是默认的Toolchain Default 默认是CMake环境,这里我们用C++11没有为什么,任性。

勾选上 Exceptions Support 、Exceptions Support让其支持C++异常处理然后Finish如下图:

09ccc55cdce2

这里写图片描述

项目创建好,把他帮我们生成的文件删掉,布局以及MainActivity里的不用代码,还有cpp目录下的.cpp文件不需要,之后我们开始做移植吧。

3.拷贝资源文件到 Android Studio

09ccc55cdce2

这里写图片描述

首先看下Eclipse工程下的目录结构:

src 目录下的java代码

assets 目录下的音频资源

jni 目录下的fmod的动态库和c++代码

lib 目录下的fmod包

res 目录下的图片及布局xml代码和一些资源文件

这些复制黏贴的活我就不贴出来了,主要看下jni目录

刚才创建完成项目后,AS自动帮创建了cpp目录,原jni目录下的inc直接拷过去就好其他不要看图:

09ccc55cdce2

这里写图片描述

在Android studio 里app->libs目录下创建armeabi平台文件夹把libfmod.so和libfmodL.so这俩包放进去看下AS的现在的结构:

09ccc55cdce2

这里写图片描述

fmod.jar放到libs下右键add进去、assets这个目录as没有我们需要自己去创建把音频文件放进去。

4.Android Studio 下生成.h头文件

现在剩下头文件和supersound.cpp这俩关键文件了,因为我包结构不一样所以需要重新生成头文件。

我看了几篇文档AS下有配置直接生成头文件的,我懒不配置了,直接命令行玩吧!

从Android Studio的Terminal里进入到, /src/main/java 目录下,一定要刀这个文件夹下来执行命令操作。

执行javah XXX.XX.XXX 即可, XXX.XX.XXX是要生成.h文件的完整路径名,包名+文件名

cd 到目录下 执行javah命令会在当前文件夹下生成.h文件F5刷新目录就有了,把他拷贝到cpp目录下,把原来的supersound.cpp也拷过来,如下图

09ccc55cdce2

这里写图片描述

09ccc55cdce2

这里写图片描述

把.h文件里的这一行代码拷贝到我们原来supersound.cpp文件里替换标红这段代码,以及修改引用头文件的目录地址#include 那里地址变了,如下图:

09ccc55cdce2

这里写图片描述

至此我们资源文件拷贝完毕

5.修改CMakeList.txt构建ndk

看下CMakeList.txt的我直接写好了,简单介绍下

# Sets the minimum version of CMake required to build the native

# library. You should either keep the default value or only pass a

# value of 3.4.0 or lower.

cmake_minimum_required(VERSION 3.4.1)

find_library( # Sets the name of the path variable.

log-lib

log )

set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../libs)

add_library( fmod

SHARED

IMPORTED )

set_target_properties( fmod

PROPERTIES IMPORTED_LOCATION

../../../../libs/armeabi/libfmod.so )

add_library( fmodL

SHARED

IMPORTED )

set_target_properties( fmodL

PROPERTIES IMPORTED_LOCATION

../../../../libs/armeabi/libfmodL.so )

add_library( sound

SHARED

src/main/cpp/supersound.cpp )

include_directories(src/main/cpp/inc)

target_link_libraries( sound fmod fmodL

${log-lib} )

这里不介绍Cmake的使用了附上学习地址官方文档

中文翻译的简易的 CMake手册

最后一步配置build.gradle直接上图了:

09ccc55cdce2

这里写图片描述

可以编译安装玩一玩了

哈哈哈真是愉快的一下午啊

6.结束语-变声后保存解决思路

关于你们说的要保存变声后的声音

不知道你们为什么要保存下来哈哈哈

因为是在播放的时候加入的音轨就像唱歌的时候加入伴奏加入一段钢琴的声音达到变声效果,加了特效。

目前我们是在本机播放变声后的效果,有个哥们他的需求是这边发出去语音对方听到的是变声后效果。然后问我怎么保存说找不到解决方法所以来问我。

我这里给的思路就是我们本地不保存,就把原声发送给接收方,在接收方调fmod进行变声,这么说理解了吗?

发送的时候加上tag标示,这个标示代表用那种变声效果,然后对方点击播放的时候你把他变声了就好了啊!

有时候换一种思路你会发现真的很简单,没必要一直纠结

关键还是在于懒,懒得查资料,那么我们就用简单的方法

这只是一次移植的记录,所以资料我写的不是很详细,如果需要学习哪一方面可以找我,我写教程或者帮你找相关资料都可以。

边移植边查资料还要记录所以文档很乱,有问题来找我QQ:1344670918或者下面留言

项目源码下载地址:

https://github.com/CN-ZPH/

觉得不错请点一个star蛤!

有问题下面留言评论,我看到会回复。


http://www.ppmy.cn/news/622768.html

相关文章

qq出示测试软件语音聊天,QQ语音时语音测试时可以听到声音,播放测试语音时听不到,也听不到好友发来的语音,请问怎么处理...

您好: 以下方法供您参考: 如下几个原因可能导致您的状况: 1、使用QQ版本或语音设置不正确导致。(重新下载安装) 2、声卡驱动的BUG因素导致在进行语音聊天时,将对方的声音错误的传输到SPDIF数字端口导致。 3、声卡驱动版本过低&…

qq出示测试软件语音聊天,腾讯qq语音聊天麦克风的[qq语音语音测试]解决方案

使用QQ语音聊天时,迈克怎么了?为什么QQ语音聊天麦没有语音?如何解决这个问题呢?具体解决方案介绍如下. 解决方案: 1. 右键单击任务栏上的音量图标,打开录音设备qq语音检查话筒,对着麦克风讲话,检…

电脑分屏没有声音_怎样解决qq屏幕分享没有声音问题

我们经常会使用qq来进行屏幕分享,有时会出现没有声音和黑屏的问题,这时我们应该怎么去解决呢?下面就让学习啦小编告诉你解决qq屏幕分享没有声音的方法,希望对大家有所帮助。 解决qq屏幕分享没有声音的方法 1、登陆qq 解决qq屏幕分享没有声音的步骤图1 2、然后在我们登录成功…

Flutter卡片分享功能实现:将你的内容分享给世界

前言 在app中,在实现分享功能的时候,通常会有一种以卡片形式展示和分享内容的分享方式。这种功能可以将信息以整洁、易读的方式呈现给用户,使他们能够快速了解内容的关键信息,并将其分享给其他人。那么在这篇文章中,就…

什么是数据驱动决策?方案、示例一次讲透

目录 一、什么是数据驱动决策? 1.数据驱动决策的由来 2. 如何实现数据驱动决策 3.数据驱动决策案例 案例一:汉莎航空 案例二:沃尔玛 二、精细化数据驱动决策软件解决方案 1.大数据采集和分析类 2.客户数据 3.商业智能BI 4.客户数据…

Windows批处理 遍历当前文件夹 循环删除指定文件

::echo off rem 正在搜索... rem 删除文件 for /f "delims" %%i in (dir /b /a-d /s "*.pb.cc") do del %%i rem 删除完毕 pause 删除指定*.pb.cc 文件。

利用批处理脚本批量删除电脑上的空文件夹

echo off for /f "tokens*" %%i in (dir/s/b/ad^|sort /r) do rd "%%i"使用"记事本"编写,保存为.txt文件,直接将其修改为.bat即可 使用时复制到相应的文件夹路径下,双击运行即可。 可循环删除当前路径的所有空文件夹,包括…

批处理对文件夹、所有子文件夹内的文件重命名、删除

一、删除操作 echo off echo Welcome REM 操作目录 set use_dirD:\ddd REM 删除文件的名称 set del_nameaaa.txt echo. set /p con按回车开始 echo. setlocal enabledelayedexpansion for /f %%s in (dir %use_dir% /s /b /a:-d) do (set old_name%%~nsset ext_name%%~xsif &q…