音視頻開發如何“從0到1”


音視頻開發如何“從0到1”

前言

這裡先做一個道歉,因為我還大三,身上還有不少課程。最近五門的必修課壓身所以更新的進度上會有嚴重的脫節,但是我還是會盡量保證一週一篇文章的,希望能夠理解。

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

GitHub傳送門

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

其實很多網站都已經有過這樣的介紹了,不過既然是自己的文章,還是需要講講的,嘿嘿。創建一個新的AS項目,並且選擇到我們的Native C++的選項來創建我們的項目。當然我們裡面會看到一個C++ standard,我直接默認選的Toolchain Defalut。

音視頻開發如何“從0到1”

到了這裡其實我們的程序就可以運行了,不信你可以直接跑,不過看看代碼,你會發現存在一定的不同

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

這個問題是讀者必須清楚的,Java終究並不是一門萬能的語言,每門語言都是如此,有著自己的長處和侷限性。不然為什麼還需要Binder機制去調用一些底層的服務,因為很多東西,上層做不了。

情況可以分為以下幾種:

(1)應用程序需要一些平臺的相關特性支持,而Java層並沒有提供相應的API,(比如OpenSL ES的使用)。

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

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

如何去調用Native代碼

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

<code>public class NativeTest {
public native void encode();
}
/<code>

就如上面一般創建一個文件,用native修飾即可,但是你可能會看到這個函數爆紅,其實沒什麼關係,我們先用小錘子Build一下,正常情況下是不會報錯的,因為只是這個native函數沒有找到對應的C\\C++函數而已,並不影響我們本身的Java類。

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

<code>1\\. 切換到src/main/java目錄下
2\\. 在Terminal中輸入javah -jni 包名.帶native的Java類
// 在我的項目中的語句
javah -jni com.clericyi.player.NativeTest
3\\. 得到一個格式為:(包名_類名).h的頭文件,並將他移動到cpp的目錄下
/<code>
音視頻開發如何“從0到1”

(3)得到的.h的頭文件並不能夠被使用,自然需要.cpp的文件來支持使用了。(上圖已經給出位置)

<code>#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");
}
/<string.h>/<jni.h>/<code>

(4)使用

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

<code>(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"
}
}
}
/<code>

關於NDK的安裝

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

相信很多人會在查資料時發現別人安裝的都是NDK,而我安裝的是NDK(Side by Side),但是你在自己的AS上也同樣的找不到我們需要的NDK。所以給出一個網址來給讀者們作為安裝的教程:安裝及配置 NDK 和 CMake

音視頻開發如何“從0到1”

效果圖

音視頻開發如何“從0到1”

交叉編譯的原理及實踐

什麼叫做交叉編譯?

三部分構成:

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

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

交叉編譯實踐

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

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

  1. 下載完我們的LAME,把libmp3lame下的文件和include下的lame.h文件全都移動到AS中cpp\\lame的文件夾下。
音視頻開發如何“從0到1”

  1. 修改CMakeLists.txt
<code>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)
/<code>
  1. 用小錘子build一下我們的項目,會報錯,我出現的錯誤即解決方案下方給出。
<code>錯誤1:#include <lame.h>
解決方案:#include "lame.h"
---
錯誤2:ieee754_float32_t fast_log2(ieee754_float32_t x);
解決方案:float fast_log2(float x);
/<lame.h>/<code>
  1. 報錯調整好以後我們就可以開始我們的使用了。
<code>#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());
}
/<string.h>/<jni.h>/<code>

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

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

PCM的文件可以自己去隨便撈一個,因為求方便我是用adb直接推到虛擬機中的。

音視頻開發如何“從0到1”

結尾

最後,我再重複一次,如果你想成為一個優秀的 Android 開發人員,請集中精力,對基礎和重要的事情做深度研究

對於很多初中級Android工程師而言,想要提升技能,往往是自己摸索成長,不成體系的學習效果低效漫長且無助。整理的這些架構技術希望對Android開發的朋友們有所參考以及少走彎路,本文的重點是你有沒有收穫與成長,其餘的都不重要,希望讀者們能謹記這一點。

最後想要拿高薪實現技術提升薪水得到質的飛躍。最快捷的方式,就是有人可以帶著你一起分析,這樣學習起來最為高效,所以為了大家能夠順利進階中高級、架構師,我特地為大家準備了一套高手學習的源碼和框架視頻等精品Android架構師教程,保證你學了以後保證薪資上升一個臺階。(以下是一小部分,獲取更多其他精講進階架構視頻資料可以關注【我的主頁】或者【簡信我】獲取免費領取方式)

當你有了學習線路,學習哪些內容,也知道以後的路怎麼走了,理論看多了總要實踐的。

以下是今天給大家分享的一些獨家乾貨:

【Android開發核心知識點筆記】

音視頻開發如何“從0到1”

【Android思維腦圖(技能樹)】

音視頻開發如何“從0到1”

【Android核心高級技術PDF文檔,BAT大廠面試真題解析】

音視頻開發如何“從0到1”

【Android高級架構視頻學習資源】

Android精講視頻領取學習後更加是如虎添翼!進軍BATJ大廠等(備戰)!現在都說互聯網寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎麼可能會被裁掉,都是淘汰末端的業務Curd而已!現如今市場上初級程序員氾濫,這套教程針對Android開發工程師1-6年的人員、正處於瓶頸期,想要年後突破自己漲薪的,進階Android中高級、架構師對你更是如魚得水,趕快領取吧!

【Android進階學習視頻】、【全套Android面試秘籍】關注+轉發+私信【學習】查看免費領取方式!

最後送大家一句話,人生每個階段都有每個階段該乾的事,你當下能做的就是踏踏實實做好現在的事,最好你能比你身邊的人更努力些,不用太著急,你想要的,歲月都會給你!


分享到:


相關文章: