Android音視頻——構建私有播放器(FFmpeg&Rtmp)

前言

關於如何編譯FFmpeg,前面的博客已經講過。Linux+NDK編譯FFmpeg
編譯好文件結構如下:

  • include 待引入頭文件
  • lib so庫文件
  • share C語言示例

強烈建議進入share文件夾下,瀏覽一下調用示例的C文件,對下一步的理解的使用將會有巨大幫助

一. 引入Library與檢查

1.配置

新建CPP的Android工程,配置Cmake,引入事先構建好的so文件和頭文件。工程路徑如下:
在這裏插入圖片描述
cmake.list腳本:

cmake_minimum_required(VERSION 3.4.1)

set(NAME hm-player)
file(GLOB allCpp *.cpp)

add_library(${NAME} SHARED ${allCpp})

find_library(log-lib log)

# 導入FFmpeg頭文件
include_directories(${CMAKE_SOURCE_DIR}/ffmpeg/include)

# 導入FFmpeg庫文件
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/ffmpeg/libs/${CMAKE_ANDROID_ARCH_ABI}")

# RTMP的庫文件
set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/rtmp/libs/${CMAKE_ANDROID_ARCH_ABI}")

target_link_libraries(
        ${NAME}
        -Wl,--start-group # 忽略順序引發的問題
        avcodec avfilter avformat avutil swresample swscale
        -Wl,--end-group
        ${log-lib}
        z
        rtmp
)

1.注意System.loadLibrary("hm-player")中的引用庫的名字一定跟自己cmake配置的一樣。
2.注意庫平臺類型的篩選,因爲我只用了armeabi-v7a的庫文件,所有就需要再app級別的gradle裏面配置abiFilters "armeabi-v7a"
在這裏插入圖片描述
構建成功即ready,進入代碼環節。

2. 調用驗證

首先在函數中調用一下版本號,看是否成功。我們就用native-lib.cpp系統生成的函數。

#include <jni.h>
#include <string>
extern "C" {
    #include <libavutil/avutil.h>
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_heima_ffmpegtest_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "ffmpeg version : ";
    hello.append(av_version_info());
    return env->NewStringUTF(hello.c_str());
}

千萬注意那個包裹頭文件引用的extern "C",這個牽扯到語法問題,cpp調用C的庫需要加上。我是因爲工作中經常調用C的算法庫,錯的多了也就習慣順手加上了,不熟悉的小夥伴一定要注意下。
安裝過後,手機頁面顯示版本號4.2.2,調用成功。
PS:我不知道是自己編譯器問題還是怎麼回事,我build app後,查看.apk格式文件,路徑下有lib/XXso,但是我點擊安裝,IDE自動構建新APP時候,又會丟掉lib,導致我每次用IDE安裝都會報錯,couldn't find "libnative-lib.so"。如果我build app後 ,直接命令行adb install ...XX...就成功運行,真的見了鬼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章