- [I. Кросс-скомпилированная библиотека функций FFMPEG и файлы заголовков.](https://cloud.tencent.com/developer)
- [II. Статическая библиотека FFMPEG, упаковывающая динамическую библиотеку (только для справки).](https://cloud.tencent.com/developer)
- [III. Создайте проект Android Studio.](https://cloud.tencent.com/developer)
- [IV. Заголовочный файл FFMPEG и копия статической библиотеки.](https://cloud.tencent.com/developer)
- [V. CMakeList.txt настраивает файл заголовка FFMPEG и библиотеку функций.](https://cloud.tencent.com/developer)
- [VI. Код С++.](https://cloud.tencent.com/developer)
- [VII. Ресурсы блога.](https://cloud.tencent.com/developer)
1 . компилировать FFMPEG библиотека функций : 【Android FFMPEG Разработка】FFMPEG кресткомпилировать Конфигурация ( скачать | Скрипт конфигурации | Выходной путь | библиотека функций Конфигурация | Конфигурация программы | Конфигурация компонентов | Конфигурация кодирования и декодирования | кресткомпилировать Конфигурация | окончательный сценарий )
компилироватьвнеизстатическая библиотекасуществоватьвышеблогиз Файл ресурсовсерединаскачать ; Скриншот ниже находится в Ubuntu серединакресткомпилироватьвнеиз 6 статическая библиотека , общий 86 MB ;
2. Описание размера статической библиотеки:
① отладочная информация : компилироватьвнеиз 6 статическая библиотекаиметь 86MB , Это да, потому что когда компилировать , Будет отладочная Информация также включена в подписку. , Легко отлаживать ;
② Размер упаковки : Наконец упаковано в APK после , весь APK В файле меньше 10MB размер ,
Статические библиотеки упаковываются в динамические библиотеки. ( Только для справки ) : Поместите выше 6 статическая библиотека Пакетприезжать динамическая библиотека середина ; упакованный libffmpeg.so существоватьблогресурссередина Можетскачать ;
① настраивать кресткомпилироватьустройство Временные переменные среды :
export CC=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
② настраиватьобозначение заголовочный файлибиблиотека функций из Временные переменные среды :
export C_FLAGS="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
③ Команда пакета статической библиотеки:
CC C_FLAGS -shared -o libffmpeg.so -Wl,--whole-archive libavcodec.a libavformat.a libswresample.a libavfilter.a libavutil.a libswscale.a -Wl,--no-whole-archive
④ Процесс упаковки:
root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# export CC=/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# export C_FLAGS="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib#
root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# $CC $C_FLAGS -shared -o libffmpeg.so -Wl,--whole-archive libavcodec.a libavformat.a libswresample.a libavfilter.a libavutil.a libswscale.a -Wl,--no-whole-archive
root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# ls
libavcodec.a libavfilter.a libavformat.a libavutil.a libffmpeg.so libswresample.a libswscale.a pkgconfig
root@octopus:~/FFMPEG/ffmpeg-4.0.2/android/armeabi-v7a/lib# ll
Общая дозировка 129336
drwxr-xr-x 3 root root 4096 февраль 19 22:30 ./
drwxr-xr-x 5 root root 4096 февраль 18 22:19 ../
-rw-r--r-- 1 root root 60104544 февраль 18 22:18 libavcodec.a
-rw-r--r-- 1 root root 763728 февраль 18 22:14 libavfilter.a
-rw-r--r-- 1 root root 25221538 февраль 18 22:15 libavformat.a
-rw-r--r-- 1 root root 1609508 февраль 18 22:19 libavutil.a
-rwxr-xr-x 1 root root 41509960 февраль 19 22:30 libffmpeg.so*
-rw-r--r-- 1 root root 401316 февраль 18 22:18 libswresample.a
-rw-r--r-- 1 root root 2807636 февраль 18 22:19 libswscale.a
drwxr-xr-x 2 root root 4096 февраль 18 22:19 pkgconfig/
создавать Android Studio проект : создать один Native C++ тип Android проект ; ( Здесь нет базовых операций с чернилами. )
Копирование файлов заголовков и файлов статических библиотек : будет генерировать include и lib два каталога , скопировать в app/src/main/cpp в каталоге ;
динамическая библиотекаскопировать в jniLibs/armeabi-v7a в каталоге , Статические библиотеки могут скопировать впроизвольный Кусочекнабориспользовать ;
1 . заголовочный файл Найти путьнастраивать : использовать include_directories обозначение FFMPEG Каталог поиска заголовочных файлов , CMAKE_SOURCE_DIR Относится к текущему адресу файла ;
# IV . обозначение FFMPEG Каталог поиска заголовочных файлов
# CMAKE_SOURCE_DIR Относится к текущему адресу файла
include_directories(${CMAKE_SOURCE_DIR}/include)
2 . библиотека функцийнастраивать : библиотека функцийсуществовать cpp/lib середина , здесьиспользовать -L параметробозначениебиблиотека функции найти путь ;
# V . обозначение FFMPEG статическая библиотека
# CMAKE_CXX_FLAGS Сказал, что это будет C++ из параметров передаются компилирующему устройству
# CMAKE_C_FLAGS Сказал, что это будет C Параметры передаются компилирующему устройству
# параметрнастраивать : передача CMAKE_CXX_FLAGS C+= Когда параметры передаются компилируемому устройству , существовать За этим параметром следует обозначение библиотеки по пути.
# CMAKE_SOURCE_DIR Относится к текущему адресу файла
# -L параметробозначениединамическая библиотекаиз найти путь
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/lib")
3 . библиотека функций Связьнастраивать : Обратите внимание, что здесь есть ссылка FFMPEG из 6 статическая библиотека , не пропусти ;
# V . Ссылка на библиотеку функций
# параметр 1 : Этот скрипт сборки для создания издинамического библиотека Цель
# параметр 2 ~ ... : позжеда Предварительныйкомпилироватьиздинамическая библиотекаилистатическая библиотека , илипредставлятьиздинамическая библиотека
target_link_libraries(
native-lib
# FFMPEG статическая библиотека
avcodec
avfilter
avformat
avutil
swresample
swscale
# Библиотека журналов
${log-lib})
4. Полный сценарий сборки:
# I . обозначение CMake Минимальная версия
cmake_minimum_required(VERSION 3.4.1)
# II . настраиватьбиблиотека функцийкомпилировать
add_library( # параметр 1 : настраиватьгенерироватьиздинамическая библиотекаимя native-lib
# параметр 2 : настраиватьгенерироватьизбиблиотека функцийтип : ① статическая библиотека STATIC ② динамическая библиотека SHARED
SHARED
# параметр 3 : источникдокументация для составления конфигурации
native-lib.cpp)
# III . Искать в каталоге по умолчанию log Библиотека , Назначьте найденный путь log-lib
# Этот путь да NDK из ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so
# другой Android номер версии и CPU Архитектура Искать нужно в соответствующем из каталога середина. , Хереда 29 Версия 32 Кусочек ARM Архитектураиз Библиотека журналов
#
# Можетбез Конфигурация :
# Данную Конфигурацию выполнять не обязательно, прямойсуществоватьпозжеиз target_link_libraries середина Связь log Не могу ошибиться
find_library(
log-lib
log)
# IV . обозначение FFMPEG Каталог поиска заголовочных файлов
# CMAKE_SOURCE_DIR Относится к текущему адресу файла
include_directories(${CMAKE_SOURCE_DIR}/include)
# V . обозначение FFMPEG статическая библиотека
# CMAKE_CXX_FLAGS Сказал, что это будет C++ из параметров передаются компилирующему устройству
# CMAKE_C_FLAGS Сказал, что это будет C Параметры передаются компилирующему устройству
# параметрнастраивать : передача CMAKE_CXX_FLAGS C+= Когда параметры передаются компилируемому устройству , существовать За этим параметром следует обозначение библиотеки по пути.
# CMAKE_SOURCE_DIR Относится к текущему адресу файла
# -L параметробозначениединамическая библиотекаиз найти путь
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/lib")
# V . Ссылка на библиотеку функций
# параметр 1 : Этот скрипт сборки для создания издинамического библиотека Цель
# параметр 2 ~ ... : позжеда Предварительныйкомпилироватьиздинамическая библиотекаилистатическая библиотека , илипредставлятьиздинамическая библиотека
target_link_libraries(
native-lib
# FFMPEG статическая библиотека
avcodec
avfilter
avformat
avutil
swresample
swscale
# Библиотека журналов
${log-lib})
1 . Представляем заголовочные файлы : представлять libavcodec/avcodec.h заголовочный файл , FFMPEG да C Разработка ,существовать C++ серединаиспользоватьнуждатьсяиспользовать extern “C” для совместимости ;
// Уведомление FFMPEG да C Разработка , существовать C++ серединаиспользоватьнуждатьсяиспользовать extern "C" для совместимости
extern "C"{
#include <libavcodec/avcodec.h>
}
2 . Как получить номер версии : вызов av_version_info() можно получить FFMPEG номер версии , Прямо сейчас “4.0.2” , Перенесите эту строку в основной интерфейс для отображения. ;
3. Полный код:
#include <jni.h>
#include <string>
// Уведомление FFMPEG да C Разработка , существовать C++ серединаиспользоватьнуждатьсяиспользовать extern "C" для совместимости
extern "C"{
#include <libavcodec/avcodec.h>
}
extern "C" JNIEXPORT jstring JNICALL
Java_kim_hsl_ffmpeg_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(av_version_info());
}
4. Результаты выполнения:
Ресурсы, связанные с блогом:
① CSDN Адрес блога : [Разработка Android FFMPEG] Конфигурация проекта Android Studio FFMPEG (упаковка динамической библиотеки | копирование файла заголовка и библиотеки функций | конфигурация сценария CMake)
② блогресурсскачатьадрес : https://download.csdn.net/download/han1202012/12173019
③ Пример кода GitHub адрес : https://github.com/han1202012/010_FFMPEG