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

FFmpeg4.2.1 系列

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


1.安装与配置ffmpeg

1.1:安装ffmpeg

brew能够安装ffmpeg,它是全副武装的ffmpeg,enable了不少东西,因此下载起来比较耗时间。你也能够在ffmpeg官方下载,本身根据需求来编译。ios

---[· brew install ffmpeg
复制代码
1.2:查看ffmpeg信息

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

---[· 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路径,方便全局访问内部可自行文件。github

export PATH=$PATH:/usr/local/Cellar/ffmpeg/4.2.1_2/bin
复制代码

1.4:查看ffmpeg环境是否OK

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

---[· 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

头文件,也就是全部功能的索引,使用时须要引入相关头文件json

---[· 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播放音视频api

---[· 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,很具备参考价值。bash


3.Clion集成FFmpeg

3.1 新建项目

选择C++ 和C都无所谓,若是想用C++ 的特性就选C++,不然直接写C也能够。app


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 ~

相关文章
相关标签/搜索