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()); }
所以
知识殊途同归,重要的不是它在哪里,而是它能干嘛,你想拿他干嘛
,桌面上的功能可以很容易移植到移动端,它们是一通百通的。平台上面的都是纸老虎,重点和难点是对流程和音视频本质的理解。
共同学习,写下你的评论
评论加载中...
作者其他优质文章