写点什么

FFmpeg 应用篇

用户头像
Changing Lin
关注
发布于: 2021 年 03 月 29 日
FFmpeg应用篇

一、背景

一直在思考,写这个系列文章的目的是什么?

1.构建知识体系,我认为的知识体系是怎样的,2.解决和记录我在学习过程中进展缓慢的困难和问题

本文的目的是,通过搭建一个学习、调试和开发的环境。由于操作系统环境差异,编译 FFmpeg 源码过程一定会遇到很多困难,假如把时间、精力和学习热情全部用来解决这些编译问题,可能会导致我们捡了芝麻丢了西瓜。因此,我们依赖 Github 上面的开源项目,来上手和学习。跳过编译的环节,有一点要注意的是,按照 FFmpeg 官网的编译流程,在网络正常(你懂得)的情况下,编译是没有问题的,这个小编是已经尝试过了的。在此不再展开,有兴趣的读者可以尝试一下。

二、环境准备

1.下载源码

代码仓库:https://github.com/LinChengChun/FFmpegAndroid.git    (这是一个Android平台的工程)下载源码:git clone "https://github.com/LinChengChun/FFmpegAndroid.git"
cclin@pc05:/mnt/d/StudioProjects/FFmpegAndroid$ git branch -avv // 切换到主分支 kotlin-compat afd6a87 [origin/kotlin-compat] choose kotlin or java* master 6aa24ee [origin/master] 增加调试日志 remotes/origin/HEAD -> origin/master remotes/origin/kotlin-compat afd6a87 choose kotlin or java remotes/origin/master 6aa24ee 增加调试日志
复制代码

2.编译工程:(使用 AndroidStudio IDE 打开工程,添加如下修改,即可编译成功)

diff --git a/app/CMakeLists.txt b/app/CMakeLists.txtindex 143065b..7cf58c9 100644--- a/app/CMakeLists.txt+++ b/app/CMakeLists.txt@@ -50,7 +50,7 @@ set_target_properties( mp3lame             PROPERTIES IMPORTED_LOCATION             ../../../../libs/${CMAKE_ANDROID_ARCH_ABI}/libmp3lame.so ) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -Wpointer-sign")  include_directories(src/main/cpp) include_directories(src/main/cpp/include)diff --git a/app/src/main/cpp/video_filter.c b/app/src/main/cpp/video_filter.cindex 0111f50..603c7bd 100644--- a/app/src/main/cpp/video_filter.c+++ b/app/src/main/cpp/video_filter.c@@ -41,7 +41,7 @@ AVFrame *pFrameRGBA;  AVFrame *filter_frame; -uint8_t *buffer;+static uint8_t *buffer;  struct SwsContext *sws_ctx; diff --git a/build.gradle b/build.gradleindex 6ddeb0f..3d57aa5 100644--- a/build.gradle+++ b/build.gradle@@ -3,13 +3,10 @@ buildscript {     repositories {         jcenter()-        maven {-            url 'https://maven.google.com/'-            name 'Google'-        }+        google()     }     dependencies {-        classpath 'com.android.tools.build:gradle:3.2.0'+        classpath 'com.android.tools.build:gradle:4.0.0'          // NOTE: Do not place your application dependencies here; they belong         // in the individual module build.gradle files@@ -19,10 +16,7 @@ buildscript { allprojects {     repositories {         jcenter()-        maven {-            url 'https://maven.google.com/'-            name 'Google'-        }+        google()     } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.propertiesindex 4ca64ca..f6c4f1e 100644--- a/gradle/wrapper/gradle-wrapper.properties+++ b/gradle/wrapper/gradle-wrapper.properties@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists-distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
复制代码
  • IDE 截图


  • APK 首页截图


3.至此,整个开发环境已经搭建好了

三、源码解析

1.在 IDE 全局搜索 System.loadLibrary,查看 app 模块使用的是哪个 native 库(可以发现是:libmedia-handle.so)


2.分析 libmedia-handle.so 是如何编译生成的

查看CMakeList.txt


如上图所示,项目是使用 CMake 编译 src/main/cpp 目录下的*.c 文件来生成 media-handle.so 库文件的。下面我们通过一个小功能,来分析如何使用 FFmpeg API 来解析多媒体格式。

3.解析多媒体格式 功能是如何实现的

FFmpegHandler.executeFFprobeCmd->FFmpegCmd.executeProbe->FFmpegCmd.handleProbe->ffmpeg_cmd.c->handleffmpeg.c->run
待续
复制代码

四、总结

通过编译当前工程,搭建 Android 平台的 FFmpeg 的开发环境


发布于: 2021 年 03 月 29 日阅读数: 21
用户头像

Changing Lin

关注

获得机遇的手段远超于固有常规之上~ 2020.04.29 加入

我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。

评论

发布
暂无评论
FFmpeg应用篇