IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 下使用 FFmpeg 命令行工具与问题排查 -> 正文阅读

[移动开发]Android 下使用 FFmpeg 命令行工具与问题排查

上一篇文章 中,我们已经成功编译了 FFmpeg 的主要库并集成到了我们的 Android 应用中。我们暂时不需要知道这些库具体的作用和用法是什么,FFmpeg 已经为我们提供了方便的命令行工具来进行音视频操作,这个工具就在源码文件夹的 fftools 目录下,将其集成到 Android 应用中,我们便可方便快捷地使用 FFmpeg 来进行音视频操作。

如果你还不清楚命令行工具如何使用,不如看看 这里

在完成了前文的编译与集成后,我们在原工程的基础上继续。

FFmpeg 命令行工具

FFmpeg 命令行工具的主体是源码 fftools/ffmpeg.c 中的 main 函数,我们只需要将命令及命令的长度传入 main 函数即可,ffmpeg.c 还依赖其他文件中的其他函数,我们也要一并加入到项目中。

将相关文件加入到项目中

  1. 进入源码目录(而非编译后输出库文件的目录),将 fftools 文件夹复制到项目的 cpp 目录下(其他目录也可以,只要能保证 CMake 找得到相关文件)。

  2. 编辑 CMakeLists.txt :

    ……
    
    include_directories(${CMAKE_SOURCE_DIR}/fftools)
    #引入ffmpeg.h与cmdutils.h
    
    add_library(ffmpeg
            SHARED
            fftools/cmdutils.c
            fftools/ffmpeg.c
            fftools/ffmpeg_filter.c
            fftools/ffmpeg_hw.c
            fftools/ffmpeg_opt.c
    )
    
    target_link_libraries(
            ffmpeg
            avfilter
            avformat
            avdevice
            avcodec
            avutil
            swresample
            swscale
            postproc
            ${log-lib})
            
    target_link_libraries(
            ffmpegtest
            ffmpeg
            ${log-lib})
    

说明:

前文中,我们将我们编写的 ffmpegtest.cppffmpeg 的依赖库链接到一起,实际上我们在实际使用中不需要直接访问这些库的函数,只需要调用 ffmpeg.c 的命令行工具即可,这里我们将 fftools 中的 c 文件编译成 libffmpeg.so 库,使其与依赖库建立链接,再将我们编写的实现了 JNI 的代码(ffmpegtest 库)与 ffmpeg 库建立链接,即可达成预期功能。

  1. 打开 ffmpeg.hffmpeg.c 添加函数方便我们调用

    int ffmpeg_exec(int argc, char **argv);
    
    int ffmpeg_exec(int argc, char **argv){
        return main(argc,argv);
    }
    
  2. 将 Java 类中 native 函数修改为 public native void run(String[] commands),在ffmpegtest.cpp 中生成相应函数,添加函数体及头文件。

    #include <jni.h>
    #include <android/log.h>
    extern "C"{
    #include "fftools/ffmpeg.h"
        
    JNIEXPORT void JNICALL
    Java_com_example_anotherffmpegtest_MainActivity_run(JNIEnv *env, jobject thiz, jobjectArray commands) {
        int argc = (*env).GetArrayLength(commands);
        char *argv[argc];
        int i;
        for (i = 0; i < argc; i++) {
            auto js = (jstring) (*env).GetObjectArrayElement(commands, i);
            argv[i] = (char*) (*env).GetStringUTFChars(js, 0);
        }
        ffmpeg_exec(argc, argv); //这里就是我们的 main 函数
    }}
    
  3. build 一下,程序大量报错,不要害怕,这是头文件缺失引起的,找到报错说明,将报错的头文件从源码文件夹中找到,一个一个地复制进我们的 include 文件夹的相应目录内,这里记录我报错缺失之后复制的头文件:

    config.h
    libavutil/thread.h
    compat/va_copy.h
    libavutil/libm.h
    libavutil/internal.h
    libavutil/timer.h			//这里我直接把所有架构的文件夹都复制了进去
    libavcodec/mathops.h
    libavutil/reverse.h
    libavformat/os_support.h
    

    复制完头文件之后我这边还提示了两个语法错误,按照提示修改即可。

修改 ffmpeg 源码

懒得写了,请参考 王英豪 的这两篇博客,写得很好:

Android 集成 FFmpeg (二) 以命令方式调用 FFmpeg

(此文编译使用的 ndk-build 现已过时,故本文使用目前较为推荐的 CMake)

Android 集成 FFmpeg (三) 获取 FFmpeg 执行进度

问题排查

  • ffmpeg.c 所依赖的 .c 文件与头文件是否添加,是否在 CMakeLists.txt 中正确添加库与链接
  • 报错后从源码复制的头文件是否放置到了正确路径,是否在 CMakeLists.txt 中 include 进去
  • 如果运行命令时闪退,在 main() 函数中输出 log 来排查故障
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:42:39  更:2021-11-12 19:44:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:04:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码