【從零沖擊音視頻開(kāi)發(fā)】移動(dòng)環(huán)境搭建

前言

文章開(kāi)始之前先給大家分享一個(gè)B站的視頻教程弦叶,感興趣的小伙伴可以去看看席镀。

音視頻開(kāi)發(fā)全系列教程:https://www.bilibili.com/video/BV1fb4y1d7JU?spm_id_from=333.999.0.0

移動(dòng)環(huán)境搭建(以AS為例)

其實(shí)很多網(wǎng)站都已經(jīng)有過(guò)這樣的介紹了硬萍,不過(guò)既然是自己的文章,還是需要講講的塞颁,嘿嘿浪讳。創(chuàng)建一個(gè)新的AS項(xiàng)目,并且選擇到我們的Native C++的選項(xiàng)來(lái)創(chuàng)建我們的項(xiàng)目惑芭。當(dāng)然我們里面會(huì)看到一個(gè)C++ standard坠狡,我直接默認(rèn)選的Toolchain Defalut

到了這里其實(shí)我們的程序就可以運(yùn)行了强衡,不信你可以直接跑擦秽,不過(guò)看看代碼码荔,你會(huì)發(fā)現(xiàn)存在一定的不同

為什么我們要是用Native C++?

這個(gè)問(wèn)題是讀者必須清楚的漩勤,Java終究并不是一門萬(wàn)能的語(yǔ)言,每門語(yǔ)言都是如此缩搅,有著自己的長(zhǎng)處和局限性越败。不然為什么還需要Binder機(jī)制去調(diào)用一些底層的服務(wù),因?yàn)楹芏鄸|西硼瓣,上層做不了究飞。

情況可以分為以下幾種:

(1)應(yīng)用程序需要一些平臺(tái)的相關(guān)特性支持,而Java層并沒(méi)有提供相應(yīng)的API堂鲤,(比如OpenSL ES的使用)亿傅。

(2)調(diào)用已然存在的用C\C++編寫的函數(shù)庫(kù)。

(3)應(yīng)用程序?qū)σ恍╆P(guān)鍵操作存在一定的處理速度要求瘟栖。

如何去調(diào)用Native代碼

(1)編寫一個(gè)帶native方法的函數(shù)葵擎。

public class NativeTest {
    public native void encode();
}

就如上面一般創(chuàng)建一個(gè)文件,用native修飾即可半哟,但是你可能會(huì)看到這個(gè)函數(shù)爆紅酬滤,其實(shí)沒(méi)什么關(guān)系签餐,我們先用小錘子Build一下,正常情況下是不會(huì)報(bào)錯(cuò)的盯串,因?yàn)橹皇沁@個(gè)native函數(shù)沒(méi)有找到對(duì)應(yīng)的C\C++函數(shù)而已氯檐,并不影響我們本身的Java類。

(2)生成一個(gè)我們需要的C\C++文件了体捏。

1\. 切換到src/main/java目錄下
2\. 在Terminal中輸入javah -jni  包名.帶native的Java類
// 在我的項(xiàng)目中的語(yǔ)句
javah -jni  com.clericyi.player.NativeTest
3\. 得到一個(gè)格式為:(包名_類名).h的頭文件冠摄,并將他移動(dòng)到cpp的目錄下

(3)得到的.h的頭文件并不能夠被使用,自然需要.cpp的文件來(lái)支持使用了译打。(上圖已經(jīng)給出位置)

#include <jni.h>
#include <string.h>
#include "com_clericyi_player_NativeTest.h"

JNIEXPORT jstring JNICALL Java_com_clericyi_player_NativeTest_encode
        (JNIEnv *env, jobject) {
    return env->NewStringUTF("Encoder encoding");
}

(4)使用

其實(shí)這個(gè)時(shí)候還是用不起來(lái)的耗拓,需要進(jìn)行一定的配置才行,走完下面的流程應(yīng)該就能看到我們的運(yùn)行效果了奏司。

(1) 修改CMakeList.txt中的對(duì)應(yīng)數(shù)據(jù)乔询,添加創(chuàng)建的cpp文件
add_library(
        # 。韵洋。竿刁。
        audioencoder.cpp)

(2) app -> build.gradle
android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                cFlags "-DSTDC_HEADERS"
            }
        }
        ndk {
            // 可以加入x86等等,跟應(yīng)用的手機(jī)架構(gòu)相對(duì)應(yīng)
            // 寫了幾個(gè)搪缨,到時(shí)候build中就會(huì)生成幾個(gè)
            abiFilters "armeabi-v7a"
        }
    }
}

關(guān)于NDK的安裝

因?yàn)槲覀冊(cè)陂_(kāi)發(fā)過(guò)程中必須要使用到NDK食拜,而NDK的版本兼容是一個(gè)很重要的事情。為了能向下兼容一些版本副编,我們選用低一級(jí)的版本即可负甸。(下載路徑:Prefereces -> Android SDK -> SDK Tools)

相信很多人會(huì)在查資料時(shí)發(fā)現(xiàn)別人安裝的都是NDK,而我安裝的是NDK(Side by Side)痹届,但是你在自己的AS上也同樣的找不到我們需要的NDK呻待。所以給出一個(gè)網(wǎng)址來(lái)給讀者們作為安裝的教程:安裝及配置 NDK 和 CMake

效果圖

交叉編譯的原理及實(shí)踐

什么叫做交叉編譯?

三部分構(gòu)成:

  1. 來(lái)自于第三方的源碼
  2. 運(yùn)行設(shè)備為Android或者iOS
  3. 編譯機(jī)器是我們的PC

簡(jiǎn)單來(lái)說(shuō)就是我們本地PC編譯生成了一份給別人用的東西队腐。

交叉編譯實(shí)踐

LAME作為示范例子蚕捉,來(lái)做一個(gè)詳細(xì)的示范。

這里已經(jīng)不再建議用書上的方法了柴淘,我試了一天了迫淹,太難調(diào)通了。這里還是使用Android Studio現(xiàn)在自動(dòng)生成帶有的解決方案 -- CMake为严。

  1. 下載完我們的LAME敛熬,把libmp3lame下的文件和include下的lame.h文件全都移動(dòng)到AScpp\lame的文件夾下。
  1. 修改CMakeLists.txt
add_library( # Sets the name of the library.
        # 資源庫(kù)的目標(biāo)名
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        # 我們要放入的cpp文件
        native-lib.cpp

        # lame
        lame/bitstream.c lame/encoder.c lame/gain_analysis.c
        lame/lame.c lame/id3tag.c lame/mpglib_interface.c
        lame/newmdct.c lame/presets.c lame/psymodel.c
        lame/quantize.c lame/fft.c lame/quantize_pvt.c
        lame/reservoir.c lame/set_get.c lame/tables.c
        lame/takehiro.c lame/util.c lame/vbrquantize.c
        lame/VbrTag.c lame/version.c)
  1. 用小錘子build一下我們的項(xiàng)目第股,會(huì)報(bào)錯(cuò)应民,我出現(xiàn)的錯(cuò)誤即解決方案下方給出。
錯(cuò)誤1:#include <lame.h>
解決方案:#include "lame.h"
---
錯(cuò)誤2:ieee754_float32_t fast_log2(ieee754_float32_t x);
解決方案:float fast_log2(float x);
  1. 報(bào)錯(cuò)調(diào)整好以后我們就可以開(kāi)始我們的使用了。
#include <jni.h>
#include <string.h>
#include "com_clericyi_player_NativeTest.h"

JNIEXPORT jstring JNICALL Java_com_clericyi_player_NativeTest_encode
        (JNIEnv *env, jobject) {
    return env->NewStringUTF(get_lame_version());
}

可以把上文中使用過(guò)的那個(gè)C++文件的返回值修改成這個(gè)瑞妇,就能夠得到效果了稿静。

基本這就完事兒了,如果想要做更深層次的了解辕狰,你可以看這樣項(xiàng)目結(jié)構(gòu)用于自學(xué)改备,對(duì)應(yīng)的項(xiàng)目中的內(nèi)容是書上的一個(gè)用于將PCM格式文件轉(zhuǎn)化為MP3格式的范例。

PCM的文件可以自己去隨便撈一個(gè)蔓倍,因?yàn)榍蠓奖阄沂怯?code>adb直接推到虛擬機(jī)中的悬钳。

本文轉(zhuǎn)自 https://juejin.cn/post/6844904086744072200,如有侵權(quán)偶翅,請(qǐng)聯(lián)系刪除默勾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市聚谁,隨后出現(xiàn)的幾起案子母剥,更是在濱河造成了極大的恐慌,老刑警劉巖形导,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件环疼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡朵耕,警方通過(guò)查閱死者的電腦和手機(jī)炫隶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阎曹,“玉大人伪阶,你說(shuō)我怎么就攤上這事〈ο樱” “怎么了栅贴?”我有些...
    開(kāi)封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)锰霜。 經(jīng)常有香客問(wèn)我筹误,道長(zhǎng)桐早,這世上最難降的妖魔是什么癣缅? 我笑而不...
    開(kāi)封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮哄酝,結(jié)果婚禮上友存,老公的妹妹穿的比我還像新娘。我一直安慰自己陶衅,他們只是感情好屡立,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著搀军,像睡著了一般膨俐。 火紅的嫁衣襯著肌膚如雪勇皇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天焚刺,我揣著相機(jī)與錄音敛摘,去河邊找鬼。 笑死乳愉,一個(gè)胖子當(dāng)著我的面吹牛兄淫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔓姚,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捕虽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坡脐?” 一聲冷哼從身側(cè)響起泄私,我...
    開(kāi)封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎备闲,沒(méi)想到半個(gè)月后挖滤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浅役,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年斩松,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觉既。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惧盹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞪讼,到底是詐尸還是另有隱情钧椰,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布符欠,位于F島的核電站嫡霞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏希柿。R本人自食惡果不足惜诊沪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望曾撤。 院中可真熱鬧端姚,春花似錦、人聲如沸挤悉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至昏鹃,卻和暖如春尚氛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洞渤。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工怠褐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人您宪。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓奈懒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宪巨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磷杏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容