【從零衝擊音視頻開發】移動環境搭建

前言

這裏先作一個道歉,由於我還大三,身上還有很多課程。最近五門的必修課壓身因此更新的進度上會有嚴重的脫節,可是我仍是會盡可能保證一週一篇文章的,但願可以理解。java

文章內容參考書目《音視頻開發進階指南 -- 基於 Android 與 iOS 平臺的實踐》android

GitHub傳送門

目錄

【1】【從零衝擊音視頻開發】音視頻開發必備知識基礎git

【2】【從零衝擊音視頻開發】移動環境搭建github

【3】【從零衝擊音視頻開發】FFmpeg的介紹和基本使用面試

移動環境搭建(以AS爲例)

其實不少網站都已經有過這樣的介紹了,不過既然是本身的文章,仍是須要講講的,嘿嘿。建立一個新的AS項目,而且選擇到咱們的Native C++的選項來建立咱們的項目。固然咱們裏面會看到一個C++ standard,我直接默認選的Toolchain Defalutbash

到了這裏其實咱們的程序就能夠運行了,不信你能夠直接跑,不過看看代碼,你會發現存在必定的不一樣架構

爲何咱們要是用Native C++?

這個問題是讀者必須清楚的,Java終究並非一門萬能的語言,每門語言都是如此,有着本身的長處和侷限性。否則爲何還須要Binder機制去調用一些底層的服務,由於不少東西,上層作不了。app

狀況能夠分爲如下幾種:ide

(1)應用程序須要一些平臺的相關特性支持,而Java層並無提供相應的API,(好比OpenSL ES的使用)。函數

(2)調用已然存在的用C\C++編寫的函數庫。

(3)應用程序對一些關鍵操做存在必定的處理速度要求。

如何去調用Native代碼

(1)編寫一個帶native方法的函數。

public class NativeTest {
    public native void encode();
}
複製代碼

就如上面通常建立一個文件,用native修飾便可,可是你可能會看到這個函數爆紅,其實沒什麼關係,咱們先用小錘子Build一下,正常狀況下是不會報錯的,由於只是這個native函數沒有找到對應的C\C++函數而已,並不影響咱們自己的Java類。

(2)生成一個咱們須要的C\C++文件了。

1. 切換到src/main/java目錄下
2. 在Terminal中輸入javah -jni  包名.帶native的Java類
// 在個人項目中的語句
javah -jni  com.clericyi.player.NativeTest
3. 獲得一個格式爲:(包名_類名).h的頭文件,並將他移動到cpp的目錄下
複製代碼

(3)獲得的.h的頭文件並不可以被使用,天然須要.cpp的文件來支持使用了。(上圖已經給出位置)

#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)使用

其實這個時候仍是用不起來的,須要進行必定的配置才行,走完下面的流程應該就能看到咱們的運行效果了。

(1) 修改CMakeList.txt中的對應數據,添加建立的cpp文件
add_library(
        # 。。。
        audioencoder.cpp)

(2) app -> build.gradle
android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                cFlags "-DSTDC_HEADERS"
            }
        }
        ndk {
            // 能夠加入x86等等,跟應用的手機架構相對應
            // 寫了幾個,到時候build中就會生成幾個
            abiFilters "armeabi-v7a"
        }
    }
}
複製代碼

關於NDK的安裝

由於咱們在開發過程當中必需要使用到NDK,而NDK的版本兼容是一個很重要的事情。爲了能向下兼容一些版本,咱們選用低一級的版本便可。(下載路徑:Prefereces -> Android SDK -> SDK Tools)

相信不少人會在查資料時發現別人安裝的都是NDK,而我安裝的是NDK(Side by Side),可是你在本身的AS上也一樣的找不到咱們須要的NDK。因此給出一個網址來給讀者們做爲安裝的教程:安裝及配置 NDK 和 CMake

效果圖

交叉編譯的原理及實踐

什麼叫作交叉編譯?

三部分構成:

  1. 來自於第三方的源碼
  2. 運行設備爲Android或者iOS
  3. 編譯機器是咱們的PC

簡單來講就是咱們本地PC編譯生成了一份給別人用的東西。

交叉編譯實踐

LAME做爲示範例子,來作一個詳細的示範。

這裏已經再也不建議用書上的方法了,我試了一天了,太難調通了。這裏仍是使用Android Studio如今自動生成帶有的解決方案 -- CMake

  1. 下載完咱們的LAME,把libmp3lame下的文件和include下的lame.h文件全都移動到AScpp\lame的文件夾下。

  1. 修改CMakeLists.txt
add_library( # Sets the name of the library.
        # 資源庫的目標名
        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一下咱們的項目,會報錯,我出現的錯誤即解決方案下方給出。
錯誤1:#include <lame.h>
解決方案:#include "lame.h"
---
錯誤2:ieee754_float32_t fast_log2(ieee754_float32_t x);
解決方案:float fast_log2(float x);
複製代碼
  1. 報錯調整好之後咱們就能夠開始咱們的使用了。
#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());
}
複製代碼

能夠把上文中使用過的那個C++文件的返回值修改爲這個,就可以獲得效果了。

基本這就完事兒了,若是想要作更深層次的瞭解,你能夠看這樣項目結構用於自學,對應的項目中的內容是書上的一個用於將PCM格式文件轉化爲MP3格式的範例。

PCM的文件能夠本身去隨便撈一個,由於求方便我是用adb直接推到虛擬機中的。

以上就是個人學習成果,若是有什麼我沒有思考到的地方或是文章內存在錯誤,歡迎與我分享。


相關文章推薦:

面試官問我:「泛型擦除是什麼,會帶來什麼問題?」

【從零衝擊音視頻開發】音視頻開發必備知識基礎

答應我,收好這份釘釘和抖音的面經,真的很重要!!!

相關文章
相關標籤/搜索