目录

  • FFmpeg 命令行工具
    • 将相关文件加入到项目中
    • 修改 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.hadd_library(ffmpegSHAREDfftools/cmdutils.cfftools/ffmpeg.cfftools/ffmpeg_filter.cfftools/ffmpeg_hw.cfftools/ffmpeg_opt.c
    )target_link_libraries(ffmpegavfilteravformatavdeviceavcodecavutilswresampleswscalepostproc${log-lib})target_link_libraries(ffmpegtestffmpeg${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 来排查故障

Android 下使用 FFmpeg 命令行工具与问题排查相关推荐

  1. FFmpeg命令行工具系列二---转码流程及过滤器

    一.概述 在FFmpeg命令行工具系列一中,对FFmpeg的命令行工具FFmpeg.exe进行了简单的介绍,并举出了几个简单的例子.在这一章中,将进行一次详细的介绍,主要是对转码过程和过滤器进行介绍. ...

  2. [总结]FFMPEG命令行工具之ffmpeg详解

    目录 0 前言 1 语法 Synopsis 2 描述 Description 3 详细描述 Detailed description 3.1 滤镜 Filtering 3.1.1 简单滤镜图 Simp ...

  3. [总结]FFMPEG命令行工具之ffplay详解

    目录 0 前言 1 语法 Synopsis 2 描述 Description 3 选项 Options 3.1 流指定器 Stream specifiers 3.2 通用选项 Generic opti ...

  4. [总结]FFMPEG命令行工具之ffprobe详解

    目录 0 前言 1 语法 Synopsis 2  描述 Description 3 选项 Options 3.1 流指定器 Stream specifiers 3.2 通用选项 Generic opt ...

  5. FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe

    一.简述 ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具. 二.命令格式 在命令行中输入如下格式的命令: ffprobe [文件名] 三.使用ffprobe查看 ...

  6. linux下的安装命令行工具下载,本地安装DEB包的3种命令行工具(适合Debian体系)

    1. 前言 在本教程中,我们将学习如何使用三种不同的命令行工具(dpkg.apt和gdebi)在Debian及其衍生产品(如Ubuntu和Linux Mint)中安装本地软件包(. deb). 这对那 ...

  7. FFmpeg命令行工具-实用命令

    目录 help命令使用 流选择选项 视频封装解封装 3.1 视频格式转换 3.2 分离/合并视频音频流 3.3 截取视频片段 3.4 视频转换为m3u8格式 3.5 把视频文件推送到rtmp服务器 3 ...

  8. FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg

    一.简述 ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑.有了它,我们就可以对媒体文件做很多我们想做的 ...

  9. 【Android】玩转命令行工具-apkanalyzer

    文章目录 1 打印App ID.版本信息 2 打印apk的文件大小 3 打印apk的download大小 4 打印apk用到的feature 5 比较两个apk的大小 6 打印apk中的文件列表 7 ...

最新文章

  1. 转://点评Oracle11g新特性之动态变量窥视
  2. 【html 及 HTML5所有标签汇总】★★★
  3. 【正一专栏】《神秘巨星》总有一种真诚让你泪流满面
  4. Ⅵ:zookeeper的Watcher事件监听机制
  5. 【android】3.0以后系统给广播默认加上FLAG_EXCLUDE_STOPPED_PACKAGES标记
  6. Android下拉刷新-SwipeRefreshLayout
  7. 8k分辨率需要多大带宽_又一支持8K分辨率的接口标准发布
  8. matlab画图显示中文
  9. 施一公又火了!曾突然回国震惊所有美国人,如今所创公司IPO在即,还有基金大佬重仓加盟!...
  10. selenium模拟登陆去哪儿网
  11. Bootstrap3 工具提示插件的使用方法
  12. 【SAS BASE】PROC SORT
  13. 补丁生成与应用工具 V1.5.4
  14. php样式优美的错误提示框,弹出框美化 alert样式美化
  15. 用游戏外挂的方式修复有道云笔记的BUG
  16. oracle中两个日期相减
  17. A3的PDF试卷怎么对半拆分成A4打印?
  18. 电脑突然变成繁体字,格式化代码快捷键失灵
  19. 【解惑】女生适合干计算机什么方面的工作
  20. vue2之v-for详解

热门文章

  1. java swing mysql实现的仓库商品管理系统
  2. vivo 推送平台架构演进
  3. mysql 配置自动截断_MySql超长自动截断
  4. Python Web简介
  5. 浅谈SQL注入漏洞原理及利用方式
  6. Conhash 和 Maglev hash对比
  7. PyCharm修改背景颜色
  8. springboot整合Chat Generative Pre-trained Transformer
  9. linux下添加新用户,并赋予root权限
  10. swfobject.js for flash 的使用(for swfobject 2.0)