您现在的位置是:首页» windows系统» android音视频开发书籍,ffmpeg实现视频解码

android音视频开发书籍,ffmpeg实现视频解码

2024-07-12 22:50:18
本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。1. 对开放的GLES的基本理解2. 为制作视频图片,使用OpenGL。第三, OpenGL 制作了几部视频,第四,熟悉一下

本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。

1. 对开放的GLES的基本理解 2. 为制作视频图片,使用OpenGL。 第三, OpenGL 制作了几部视频, 第四,熟悉一下 OpenGL EGL。 5. OpenGL 中的 FBO 数据缓冲 6个机器人音频视频硬编码: 制作 MP4 文件 。
三. 使用FFmpeg的机器人视频解码
1份FFmpeg soku汇编 FFmpeg现在可用在Android上。 3个机器人视频解码 与FFmpeg 4个FFmpeg+OpenSL 自动机器人的音频解码 5个FFmpeg+OpenGL ES视频 基本合成MP4:未封闭和隐蔽屏幕 使用 FFmpeg 的7个机器人视频编码

本文你可以了解到

使用GCC或CLANG为了做一个体面的举动, 跨集成 FFmpeg图书馆 为Android平台。FFmpeg发展的第一步是不仅了解它,而且了解它。不仅要理解如何成功编译,而且要理解为什么。在开始之前,我们建议您阅读整个文本,希望它能为您提供一些洞察力。

一、前言

网络上已经有大量的FFmpeg编集共享,但其中多数只是发表简介。 我相信搜索“如何编译FFmpeg图书馆”的人大多不熟悉交叉编译这一集。

特别是大多数移动终端开发商大多建在爪哇楼层上,很少接触NDK层。 如果你直接看跨编辑设置,它很可能非常出色。

通常,在由 FFmpeg 组合成的项目下, 有好几项评论, 例如“为什么不能按照业主的配置来建?”, 那么为什么我们就不能坐下来写?”

造成这种情况有几个原因,其中多数位于下列地点:

祈求一个可以成功编译的愚蠢的配置, 无脑复制; FFmpeg和NDK有几种版本,每种版本都有自己的要求。 我不知道拥有每一个组合意味着什么, 即使机会在我身边, 但它不能被正确的构建 与微小的调整。

为什么FFmpeg让事情变得如此困难?

我认为,这主要是因为很难迈出第一步,甚至不能迈出索马里的脚步,而其余的则是无稽之谈。

二、什么是交叉编译

定义

根据《英国新闻》,交叉汇编是在一个平台上从另一个平台上生成可执行代码。

更具体地说,在一台计算机上制作一个程序,可以在另一台计算机上操作。栗子:PC产生一个Apk,可以用Android电话运行,这基本上是一个交叉编辑过程。

为什么要交叉编译

我们知道个人电脑的软件是直接在电脑上创建的, 所以为什么不能直接用Android软件 直接编集在Android产品上, 即个人电脑的软件是直接在电脑上创建的, 那么为什么不能直接用Android软件 来编集Android软件呢?

从理论上讲,这是可以想象的,但是Android的手机资源是受到限制的。在计算机上,汇编Apk需要很长的时间。你能理解Android的手机需要多久才能创建Apk吗?

然后我们会想,因为电脑太机智了, 它不能用来开发 可以在手机上操作的软件。

因此,出现了交叉编辑。

交叉编译需要的什么

编译环境

我们知道,个人电脑上的操作环境与移动电话上的操作环境完全不同,如果个人电脑上的环境是直接建造的,汇编的App可能在几分钟内死亡。

交叉汇编的最重要方面是配置汇编过程中使用的环境,即目标计算机(如Android的电话)正在运行的环境。

编译工具链

C/C++/汇编一般有两种工具。GCC和CLANG。

GCC如你所知,这是一个古老的汇编工具,不仅汇编C/C++,而且还汇编爪哇语、对象C语、Go语和其他语言。

CLANG是一个与海合会兼容的更有效率的C/C++/汇编工具,鼓励谷歌使用叮当进行早期编辑。ndk 17以后,把GCC删除,充分利用。CLANG。

三. 如何在交叉组合中使用FFmpeg

FFmpeg是什么

甚至连不制作视听录像的制作人, 也只对著名的FFmpeg小耳熟能详, 更别提是视听舞台上的闪电。

官方简介

A complete, cross-platform solution to record, convert and stream audio and video.

翻译为:FFmpeg是用于音像汇编、转换和处理的完整跨平台解决方案。

从本摘要可明显看出,FFmpeg具有以下特点:

能够记录、解码、编码、编辑、推力和其他任务。 跨平台

编译流程

以下是基于上一个介绍的FFmepg汇编过程的概述:

选择编译工具 配置交叉编译环境 设定汇编参数(例如,排除所有不需要的例行程序) 启动编译

仅此而已,我们再试一次 看看情况如何CLANG和GCC两种方式来编译。

四. FFembeg的相互协调

注:撰写这篇文章的平台是Mac, 建议使用Mac或Linux来汇编, 因为Windows声称有许多洞。

安装Android NDK。

Android 的NDK有几种不同的情况。r17c谷歌稍后将删除。GCC,不再支持GCC,新版本的NDK都是使用CLANG进行编译。

这是最新版本NDK r20b版本来编译。

NDK Android-NDK是下载的 URL 。

NDK 目录

最关键的是以下两条道路:

编译工具链目录:toolchains/llvm/prebuilt/darwin-x86_64/bin

交叉编译环境目录:toolchains/llvm/prebuilt/darwin-x86_64/sysroot

编译工具路径

不同的CPU建筑领域和安多尔德不同版本不同,因此,各种叮当工具各有不同,最好根据自己的需要来选择。

对于此内容, 请选择 CPU 结构 。armv7aAndroid 的版本21:

armv7a-linux-androideabi21-clangarmv7a-linux-androideabi21-clang++

编译环境路径

在toolchains/llvm/prebuilt/darwin-x86_64/sysroot目录下有两个目录 :usr/include,usr/lib,分别对应了头文件和库文件。

下载 FFmpeg 源代码

FFmpeg 在线下载可立即下载。

这是目前可用的最新版本。ffmpeg-4.2.2。

下载一个固态源, 导航到根目录, 并查找一个名称 。congfigure这是用于创建特定数据的 shell 脚本 。FFmpeg汇编必要的配置文件 。

这个文件非常重要,FFmpeg这就是它的方式做。

我们稍后再讨论这些关键点,这是公认的FFmpeg编译配置的关键。

FFmpeg可能建在这个基地上。

配置脚本

更改未来脚本 新增cross_prefix_clang参数

(注:不要双击运行)ffmpeg-4.2.2根目录下的configure文件,搜索CMDLINE_SET,您可以找到下面的代码,然后添加一个新的命令行选项:cross_prefix_clang

CMDLINE_SET="$PATHS_LISTararchasassert_levelbuild_suffixccobjcccpucross_prefix

新增命令行参数

cross_prefix_clangcustom_allocatorcxxdep_cc

省略其他…

"

更改汇编工具的路径参数 。

搜索ar_default="${cross_prefix}${ar_default}", 找到以下代码

ar_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {ar_default}"cc_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {cc_default}"cxx_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {cxx_default}"nm_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {nm_default}"pkg_config_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {pkg_config_default}"

将中间两行修改为

ar_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {ar_default}"#------------------------------------------------cc_default=" c r o s s p r e f i x c l a n g {cross_prefix_clang} c r o s s p ​ r e f i x c ​ l a n g {cc_default}"cxx_default=" c r o s s p r e f i x c l a n g {cross_prefix_clang} c r o s s p ​ r e f i x c ​ l a n g {cxx_default}"#------------------------------------------------nm_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {nm_default}"pkg_config_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {pkg_config_default}"

它会在后面被排泄出来 说明它为什么变了configure分析中详细讲解

新建编译配置脚本

在ffmpeg-4.2.2根目录下新建shell脚本,命名为:build_android_clang.sh

#!/bin/bashset -x

A. A. A. A. A. 用于

API=21CPU=armv7-a#so库输出目录OUTPUT=/Users/cxp/Desktop/FFmpeg/ffmpeg-4.2.2/android/$CPU

NDK 路径, 根据您的 NDK 位置配置

NDK=/Users/cxp/Desktop/FFmpeg/android-ndk-r20b

编译工具链路径

TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64

编译环境

SYSROOT=$TOOLCHAIN/sysroot

function build{./configure–prefix=$OUTPU

“机器人研究笔记摘要+新鲜移动结构视频+Andre访谈王国+保理工程实时调查”

[Docs.]我不知道,qq.http://t.co/doc/DSkLaerkbnFoS0ZF

T–target-os=android–arch=arm–cpu=armv7-a–enable-asm–enable-neon–enable-cross-compile–enable-shared–disable-static–disable-doc–disable-ffplay–disable-ffprobe–disable-symver–disable-ffmpeg–sysroot=KaTeX parse error: Undefined control sequence: at position 9: SYSROOT ̲ ̲--cross-prefix=TOOLCHAIN/bin/arm-linux-androideabi-–cross-prefix-clang= T O O L C H A I N / b i n / a r m v 7 a − l i n u x − a n d r o i d e a b i TOOLCHAIN/bin/armv7a-linux-androideabi T O O L C H A I N / b i n / a r m v 7 a − l i n u x − a n d r o i d e a b i API-–extra-cflags="-fPIC"

make clean all

下面是关于如何使用几个处理器来编译它的细数。

make -j12make install}

build

例如,这种外壳脚本很容易理解。

--disabble-static --enable-shared禁止静态图书馆出口和动态图书馆出口;

--arch --cpu用于配置输出的所谓“局”是什么?

--prefix用于配置 so-bureau 输出的存储路径 。

让我着重谈几个可能性:

target-os

--target-os=android:在旧版本的FFmpeg缺乏对Android平台的支持。android正如前面一些条款所指出的,这一目标要求安卓尔德平台的所谓主席团。configure如果你不作出必要的调整, 你会变成这样:linux出口所谓主席团的典型方法与Android没有相同名称,不能装载。

SLIBNAME_WITH_VERSION=’ ( S L I B N A M E ) . (SLIBNAME). ( S L I B N A M E ) . (LIBVERSION)’SLIBNAME_WITH_MAJOR=’ ( S L I B N A M E ) . (SLIBNAME). ( S L I B N A M E ) . (LIBMAJOR)’LIB_INSTALL_EXTRA_CMD=’?(RANLIB) “ ( L I B D I R ) / (LIBDIR)/ ( L I B D I R ) / (LIBNAME)”’SLIB_INSTALL_NAME=’ ( S L I B N A M E W I T H V E R S I O N ) ′ S L I B I N S T A L L L I N K S = ′ (SLIBNAME_WITH_VERSION)' SLIB_INSTALL_LINKS=' ( S L I B N A M E W ​ I T H V ​ E R S I O N ) ′ S L I B I ​ N S T A L L L ​ I N K S = ′ (SLIBNAME_WITH_MAJOR) $(SLIBNAME)’

修改为:

SLIBNAME_WITH_VERSION=’ ( S L I B N A M E ) . (SLIBNAME). ( S L I B N A M E ) . (LIBVERSION)’SLIBNAME_WITH_MAJOR=’ ( S L I B P R E F ) (SLIBPREF) ( S L I B P R E F ) (FULLNAME)- ( L I B M A J O R ) (LIBMAJOR) ( L I B M A J O R ) (SLIBSUF)’LIB_INSTALL_EXTRA_CMD=’?(RANLIB)" ( L I B D I R ) / (LIBDIR)/ ( L I B D I R ) / (LIBNAME)"’SLIB_INSTALL_NAME=’ ( S L I B N A M E W I T H M A J O R ) ′ S L I B I N S T A L L L I N K S = ′ (SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS=' ( S L I B N A M E W ​ I T H M ​ A J O R ) ′ S L I B I ​ N S T A L L L ​ I N K S = ′ (SLIBNAME)’

然而,该问题在最新版本的FFmpeg中得到了成功解决。 FFmpeg加入了其中。android这个target。 因此,我们不再需要人工改变。 。

sysroot

--sysroot=$SYSROOT用于建立交叉汇编环境根路径代码编译后, 将默认从此路径进行搜索 。usr/include usr/lib这两种办法导致发现相关的主文件和图书馆文件。

r20b版本的NDK该系统的头条新闻和图书馆档案现已在线提供。$SYSYROOT/usr/include和$SYSYROOT/usr/lib中。

从根本上说,许多新兵在建造时将无法找到所有头条文件,导致汇编失败,因此,当没有头条时,首先检查的是这条路线。

一点疑问

在使用最新的ndk r20b即使一个版本没有配置,它还是被构建了。sysroot或者你可以把它编成正确的, 作为Android嫌疑人。clang工具是否已经处理过, 它会寻找匹配的路径 。 尚未 。configure文件中找到原因。

如果有人知道这件事 他们会告诉你的

说到sysroot我必须加上另一个变数。-isysyroot这一参数长期以来也使我感到困惑,因为讨论这两个参数之间联系和差异的文件很少,然而,它也造成了无法理解的汇编失败。

extra-cflags

介绍-isysroot之前,先看看这个extra-cflags选项。

此选项导致编译器推出一个例外 。sysroot对于信头以外的文件,请使用以下搜索路径:

–extra-cflags="-I$SYSROOT/usr/include"

-I 用于区分多个路径

而-isysroot这个选项的设置是什么?

–extra-cflags="-isysroot $SYSROOT"

-isysroot函数使后路路径成为默认页眉搜索路径。sysroot配置路径就不再作为头文件尽管如此,这是默认的搜索路径。库文件默认的搜索路径。

可以看出,这两组情况相似:

–extra-cflags="-I$SYSROOT/usr/include"

约等于

–extra-cflags="-isysroot $SYSROOT"

extra-ldflags

这个和上面的extra-cflags可比的,只是特别定制的库文件搜索路径,如

–extra-ldflags="-L$SYSROOT/usr/lib"

-L 用于区分多个路径的 -L

可以看到extra-cflags extra-ldflags结合起来可以替代sysroot。

cross-prefix

这个选项直译为交叉编译前缀,表示交叉汇编工具的前缀。

经常使用此选项和另一个选项。cc一起出现搭配使用。

这意味着什么?cc此选项通常以两种方式配置 :

一种是只配置cross-prefix,没有配置cc,比如本文。

另一种是既配置cross-prefix,又配置cc。

比如:

–cc=KaTeX parse error: Undefined control sequence: at position 41: …ndroideabi-gcc ̲ ̲--cross-prefix=TOOLCHAIN/bin/arm-linux-androideabi-

这是两个完全不同的构件, 但它令人着迷的是,有时它们能够成功建造, 有时由于无法找到汇编链的工具而失败。

为了搞明白cross-prefix cc这两种选择的设置与如何使用这些选择究竟有什么关系?FFmpeg根目录下的configure配置脚本并查找提示。

检查未来配置脚本

注:以下分析基于ffmpeg-4. 2.Verion 2;其他版本可能改变,但逻辑不变。

获取用户配置选项

(注:不要双击运行)configure首先,运行一个 shell 脚本, 以了解用户可配置的编译选项 。

搜索for opt do,可以找到以下代码

for opt dooptval=“KaTeX parse error: Expected '}', got '#' at position 5: {opt#̲*=}" case "opt” in–extra-ldflags=)add_ldflags $optval;;–extra-ldexeflags=)add_ldexeflags $optval;;–extra-ldsoflags=)add_ldsoflags $optval;;–extra-ldlibflags=)warn “The --extra-ldlibflags option is only provided for compatibility and will ben”“removed in the future. Use --extra-ldsoflags instead.”add_ldsoflags $optval;;–extra-libs=*)add_extralibs $optval;;–disable-devices)disable $INDEV_LIST O U T D E V L I S T ; ; − − e n a b l e − d e b u g = ∗ ) d e b u g l e v e l = " OUTDEV_LIST ;; --enable-debug=*) debuglevel=" O U T D E V L ​ I S T ; ; − − e n a b l e − d e b u g = ∗ ) d e b u g l e v e l = " optval";;

省略中间一些代码…

*)optname="KaTeX parse error: Expected '}', got 'EOF' at end of input: …%=*}" optname="{optname#–}"optname= ( e c h o " (echo " ( e c h o " optname" | sed ‘s/-/_/g’)if is_in $optname $CMDLINE_SET; theneval o p t n a m e = ′ optname=' o p t n a m e = ′ optval’elif is_in $optname $CMDLINE_APPEND; thenappend o p t n a m e " optname " o p t n a m e " optval"elsedie_unknown $optfi;;esacdone

外壳脚本代码包含几种语法, 不需要挖掘, 所以可能很简单。

通过拆分循环的第一行=无法关闭临时文件夹:%s。optval。

除了一些不寻常的替代品, 让我们来看看最后的通配符。*)代码的目的是连接用户配置设置和值。

比如--cpu=armv7-a,前面三行就是把cpu分割出来,赋值给optname,再把optval赋值给cpu它完成启动。cpu这个变量为armv7-a。

Android 的配置

搜索android关键词可在以下代码中找到:

ffmpeg-4.2.2/configure

if test “$target_os” = android; thencc_default=“clang”fi

ar_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {ar_default}"cc_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {cc_default}"cxx_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {cxx_default}"nm_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {nm_default}"pkg_config_default=" c r o s s p r e f i x {cross_prefix} c r o s s p ​ r e f i x {pkg_config_default}"

当你配置了--target-os=android,默认的 FFmpeg 编译器是clang。

cc_default其实就是配置项cc的默认值,可以看到cc_default在这里和cross_prefix进行拼贴,这就是我们来这里的原因cross_prefix是交叉兼容工具的前缀。

拼接完是这样的:

cc_defalut= T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi- T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − cc

看下ar_default cc_default cxx_default这些默认值是什么。

搜索cc_default可以找到以下代码

ffmpeg-4.2.2/configure

ar_default=“ar”cc_default=“gcc”cxx_default=“g++”host_cc_default=“gcc”

可以看到,默认的 FFmpeg 编译器是GCC。

当你编辑Android平台的图书馆时, 因为configure强制设置cc_default="clang",所以:

当你使用GCC您必须同时配置一个编译工具 。cc选项,或修改configure中的cc_default="clang"为cc_default="gcc";

当你使用CLANG您无法配置编译工具 。cc选项。

如果你考虑一下,你会明白的cc如果设置为低值, 它是否正确编译?

–cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc

这时cc_defalut不就等于

cc_defalut= T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi- T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi-gcc

这条路线一定不正确!

这就要来看到底cc_default是怎么使用的了。

cc"

可以看到,默认的 FFmpeg 编译器是GCC。

当你编辑Android平台的图书馆时, 因为configure强制设置cc_default="clang",所以:

当你使用GCC您必须同时配置一个编译工具 。cc选项,或修改configure中的cc_default="clang"为cc_default="gcc";

当你使用CLANG您无法配置编译工具 。cc选项。

如果你考虑一下,你会明白的cc如果设置为低值, 它是否正确编译?

–cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc

这时cc_defalut不就等于

cc_defalut= T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi- T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − TOOLCHAIN/bin/arm-linux-androideabi-gcc

这条路线一定不正确!

这就要来看到底cc_default是怎么使用的了。

XTw.com.Cn系统网专业应用软件下载教程,免费windows10系统,win11,办公软件,OA办公系统,OA软件,办公自动化软件,开源系统,移动办公软件等信息,解决一体化的办公方案。

免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!

联系邮箱:773537036@qq.com