[- 壹 FFmpeg4.2.1 -] CLion 集成 、Xcode 集成、 Android集成

FFmpeg4.2.1 系列

吾的最终目的在移动端。但为了方便对FFmpeg的认知和调试,先在桌面把它消化一下,毕竟在Android中修改、调试都比较费事。知识殊途同归,重要的不是它在哪里,而是它能干嘛,你想拿他干嘛
FFmpeg是c写的,在使用时需要动态链接到相应的库上。虽然用文本编辑器和命令行也能手撕代码,但IDE能让人少调些头发。这里记录一下Xcode 和 CLion 桌面、Android集成FFmpeg的方式。本篇的目标只有一个:跑起来


1.安装与配置ffmpeg

1.1:安装ffmpeg

brew可以安装ffmpeg,它是全副武装的ffmpeg,enable了很多东西,所以下载起来比较耗时间。你也可以在ffmpeg官方下载,自己根据需求来编译。

---[· brew install ffmpeg
1.2:查看ffmpeg信息

brew info ffmpeg 查看一下当前信息,会看到安装的文件夹

---[· brew info ffmpeg
ffmpeg: stable 4.2.1 (bottled), HEAD
Play, record, convert, and stream audio and video
https://ffmpeg.org/
/usr/local/Cellar/ffmpeg/4.2.1_2 (287 files, 56.6MB) *
  Poured from bottle on 2019-11-26 at 09:16:29
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/ffmpeg.rb
==> Dependencies
Build: nasm ✔, pkg-config ✔, texi2html ✘
Required: aom ✔, fontconfig ✔, freetype ✔, frei0r ✔, gnutls ✔, lame ✔, libass ✔, libbluray ✔, libsoxr ✔, libvidstab ✔, libvorbis ✔, libvpx ✔, opencore-amr ✔, openjpeg ✔, opus ✔, rtmpdump ✔, rubberband ✔, sdl2 ✔, snappy ✔, speex ✔, tesseract ✔, theora ✔, x264 ✔, x265 ✔, xvid ✔, xz ✔
==> Options
--HEAD
	Install HEAD version

1.3:配置ffmpeg环境变量

在环境变量文件中添加对应的bin路径,方便全局访问内部可自行文件。

export PATH=$PATH:/usr/local/Cellar/ffmpeg/4.2.1_2/bin

1.4:查看ffmpeg环境是否OK

在环境变量文件中添加对应的bin路径,方便全局访问内部可自行文件。

---[· ffmpeg
ffmpeg version 4.2.1 Copyright (c) 2000-2019 the FFmpeg developers
  built with Apple clang version 11.0.0 (clang-1100.0.33.8)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.1_2 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/include/darwin -fno-stack-check' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

2.ffmpeg相关内容

---[· cd /usr/local/Cellar/ffmpeg/4.2.1_2
---[· ls
Changelog		README.md		lib
INSTALL_RECEIPT.json	bin			share
LICENSE.md		include

2.1 资源库lib

这里盛放着动态链接库,也就是ffmpeg的灵魂

---[· cd lib
---[· ls
libavcodec.58.54.100.dylib	libavresample.dylib
libavcodec.58.dylib		libavutil.56.31.100.dylib
libavcodec.a			libavutil.56.dylib
libavcodec.dylib		libavutil.a
libavdevice.58.8.100.dylib	libavutil.dylib
libavdevice.58.dylib		libpostproc.55.5.100.dylib
libavdevice.a			libpostproc.55.dylib
libavdevice.dylib		libpostproc.a
libavfilter.7.57.100.dylib	libpostproc.dylib
libavfilter.7.dylib		libswresample.3.5.100.dylib
libavfilter.a			libswresample.3.dylib
libavfilter.dylib		libswresample.a
libavformat.58.29.100.dylib	libswresample.dylib
libavformat.58.dylib		libswscale.5.5.100.dylib
libavformat.a			libswscale.5.dylib
libavformat.dylib		libswscale.a
libavresample.4.0.0.dylib	libswscale.dylib
libavresample.4.dylib		pkgconfig
libavresample.a


2.2 头文件include

头文件,也就是所有功能的索引,使用时需要引入相关头文件

---[· cd ..
---[· cd include
---[· ls
libavcodec	libavfilter	libavresample	libpostproc	libswscale
libavdevice	libavformat	libavutil	libswresample

---[· cd libavutil 
---[· ls
adler32.h			hwcontext_vaapi.h
aes.h				hwcontext_vdpau.h
aes_ctr.h			hwcontext_videotoolbox.h
attributes.h			imgutils.h
audio_fifo.h			intfloat.h
略...

2.3 盛放可执行文件 bin

可以直接通过ffmpeg通过命令行操作音视频,ffplay播放音视频

---[· 4.2.1_2 % cd /usr/local/Cellar/ffmpeg/4.2.1_2/bin
---[· bin % ls
略...
ffmpeg			normalize.py		zmqshell.py
ffplay			patcheck

另外share文件夹有一些小demo,很具有参考价值。


3.Clion集成FFmpeg

3.1 新建项目

选择C++ 和C都无所谓,如果想用C++ 的特性就选C++,否则直接写C也可以。


3.2 CMakeLists配置

注意替对应的ffmpeg目录。在target_link_libraries中添加需要的链接库,一共有八根大葱,可以根据需求自己添加。八葱住在上面的lib文件夹里,食用时掐头去尾,以保健康。

----[CMakeLists.txt]----
cmake_minimum_required(VERSION 3.15)
project(TolyFF)

set(CMAKE_CXX_STANDARD 14)


set(FFMPEG_DIR /usr/local/Cellar/ffmpeg/4.2.1_2) # FFmpeg的安装目录
include_directories(${FFMPEG_DIR}/include/) # 头文件路径
link_directories(${FFMPEG_DIR}/lib/) # 链接库路径

add_executable(TolyFF main.cpp)

target_link_libraries(TolyFF
        avutil # 链接 avutil
        avcodec # 链接 avcodec
        )

3.3 简单使用FFmpeg

这里用C++玩,引用时需要extern "C"来安照C规范引入头文件
ffmpeg有自己的日志系统,在libavutil#log.h中定义,使用如下。
这里通过avcodec_configuration()可以查看编译时的配置参数

#include <iostream>

extern "C" { //C++中特殊处理
#include "libavutil/log.h"
#include "libavcodec/avcodec.h"
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    av_log_set_level(AV_LOG_DEBUG);//设置日志级别

    av_log(nullptr,AV_LOG_INFO,"hello ffmpeg\n");//打印日志
    auto info=avcodec_configuration();//avcodec配置信息
    av_log(nullptr,AV_LOG_DEBUG,"配置:%s",info);
    return 0;
}

OK,就这么简单,地狱的大门已经打开,进去吧,孩子。


4.Xcode 集成FFmpeg

可能你比较习惯使用Xcode,这里也介绍一下

4.1 新建项目


4.2 配置链接库

如下分别配置Build Settings和Build Phases


4.3 写代码与崩溃
#include <iostream>

extern "C" { //C++中特殊处理
#include "libavutil/log.h"
#include "libavcodec/avcodec.h"
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    av_log_set_level(AV_LOG_DEBUG);//设置日志级别

    av_log(nullptr,AV_LOG_INFO,"hello ffmpeg\n");//打印日志
    auto info=avcodec_configuration();//avcodec配置信息
    av_log(nullptr,AV_LOG_DEBUG,"配置:%s",info);
    return 0;
}

不出意外会崩掉:找不到库,看日志显示,是签名的锅。


4.4 对库进行签名

钥匙串里查看你的证书(没有可新建)

---[· codesign -f -s "Apple Development: 1981462002@qq.com" /usr/local/Cellar/ffmpeg/4.2.1_2/lib/*.dylib
---[· codesign -f -s "Apple Development: 1981462002@qq.com" /usr/local/opt/*/lib/*.dylib

OK,地狱之门已打开,尽情玩耍吧。


4.Android集成FFmpeg

编译什么的,网上一堆,以后有机会单写一篇C/C++库编译相关的文章

4.1 新建Native项目

一步步创建就不废话了


4.2 引入ffmpeg

我只编译了v7a的,将include头文件和so拷贝到相应的位置
CMakeLists.txt和CLion中的是类似的,辅助构建,进行链接到动态库。网上基本上都是把一堆全配置上,但要知道每个库都有各自的功能,打个蚊子是不需要拿出洲际导弹的。这里只使用avcodec看一下编译的配置信息。其他库需要的时候可以依葫芦画瓢添加。

----[CMakeLists.txt]----
cmake_minimum_required(VERSION 3.4.1)

include_directories(include)#引入头文件

add_library(TolyFF SHARED native-lib.cpp)

set(distribution_DIR ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

add_library(avcodec SHARED IMPORTED)
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavcodec.so)

find_library(log-lib log)

target_link_libraries(
        TolyFF
        avcodec
        ${log-lib})

4.3 C++代码

初始有个helloworld方法,把avcodec_configuration返回看看

#include <jni.h>
#include <string>

extern "C"{
#include <libavcodec/avcodec.h>
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_toly1994_tolyff_TolyFF_getConfiguration(JNIEnv *env, jclass clazz) {
    return env->NewStringUTF(avcodec_configuration());
}

所以知识殊途同归,重要的不是它在哪里,而是它能干嘛,你想拿他干嘛,桌面上的功能可以很容易移植到移动端,它们是一通百通的。平台上面的都是纸老虎,重点和难点是对流程和音视频本质的理解。


@张风捷特烈 2019.11.26 未允禁转
我的公众号:编程之王
~ END ~