| 文章版本号 | 变更内容 | 变更日期 | 备注 |
|---|---|---|---|
| 0.0.1 | 创建 | 2022/10/10 | 初版 |
| 0.0.2 | 补充环境搭建内容 | 2022/10/11 | 无 |
| 0.0.3 | 补充编译内容 | 2022/10/13 | 无 |
| 0.0.4 | 更换编译用的ndk版本,完成初版编写 | 2022/10/17 | 无 |
前两篇文章分别介绍了音频和视频的编码原理(还没看的可以戳音频编码原理,视频编码原理进行阅读),接下来进入开发阶段。进入到音视频开发阶段后,有个库是绕不开的,那就是有名的FFmpeg(读作ef ef em peg,也有人读作ef em peg)开源库,它十分强大,提供了很多功能API,包括但不限于:音视频重采样、音视频编码格式转换、音视频播放、素材(字幕等)添加、视频转场动画、音视频推拉流、录像等等,音视频开发过程中需要用到的功能它基本都有。
鉴于FFmpeg库如此“全能”,所以给大家介绍一下它的用法是很有必要的,而在使用前,我们需要对它进行编译,得到so库和头文件后才能在项目中进行使用。
所需资源:
双击打开下载好的Virtualbox安装程序-VirtualBox-6.1.36-152435-Win.exe,全部点击下一步安装即可,也可根据自己需求进行修改。 安装完成后运行VirtualBox:

上图中可以看到,博主这里已经添加了一个ubuntu系统了,还没有添加的点击“新建”按钮,在弹出框的名称栏中输入ubuntu后,类型和版本会自动设置,之后可以再自行修改名称,如ubuntu22.04.1等。

设置完名称后点击下一步,进入设置内存大小的页面,这里的内存大小是指分配给虚拟电脑的内存大小,根据自己电脑的内存大小和需要进行设置即可。博主的电脑内存是32GB,这里设置的是8GB:

设置完内存大小后点击下一步,创建虚拟磁盘,点击“创建”按钮。

磁盘类型选择VDI(或根据自己需求进行选择),点击下一步。

选择磁盘空间分配方式,有两种方式可选,动态分配和固定大小,具体描述可以看窗口中的介绍文本,博主选择的是固定大小,选择好后点击下一步。

选择虚拟磁盘放置的位置和设置磁盘大小,这里根据自己的需求进行配置即可,博主设置的磁盘大小是30GB。

配置完后点击创建,会弹出等待弹窗,这个创建的过程比较耗时,博主等了大概5-8分钟左右。

虚拟磁盘创建完成后,会回到首页,首页右侧会显示配置的虚拟电脑的信息。

接下来就需要把我们之前下载的ubuntu系统iso文件配置进去了。点击“启动”按钮,在弹出的页面中点击“注册”。

在文件夹中找到自己下载的ubuntu-xxx.iso文件,点击打开。

将iso文件添加到列表中后,选中它并点击选择。

回到首页后再次点击启动按钮,这时会弹出“选择启动盘”的弹窗,选中我们刚才添加的启动盘后点击启动按钮即可启动ubuntu系统。

启动报错解决:
博主在最后一步点击启动后遇到了报错,报错弹窗如下:

报错的原因是我的电脑BIOS中没有开启VT-x功能,如果你也悲催的遇到了这个报错,那么请看下面的解决方法。
博主的电脑是win10系统,其他系统的不敢保证能用同样的方式解决(不过也可以尝试一下)。
解决方法:
重启电脑,在重启时不停按F2键(有些电脑是F8/F12,如果F2不管用可以查一下自己电脑进入BIOS的方式)进入BIOS设置页面,切换到Advanced选项卡,找到VTX virtualization(或类似选项),将disable状态改为enable状态,按F10保存并退出。电脑重启后就可以正常启动ubuntu系统了。
正常运行截图:

就算是正常启动也需要等待几分钟的时间,期间可能会黑屏一阵子,请耐心等待加载。
最后,附上官方配置文档,需要梯子才能加载出页面中的图片,否则只能看到纯文本描述。
其他踩坑记录:




博主使用的ndk版本为r22b,如果你已经下载了别的版本的ndk,也可以直接使用,不过版本建议不要太低,推荐r21+。
ndk下载链接
下载完成后,通过共享文件夹将ndk压缩包转移到ubuntu系统中。打开终端,使用cd命令进入到存放压缩包的目录,然后使用以下命令对压缩包进行解压:
unzip android-ndk-r22b-linux.zip

配置环境变量:
右键点击ndk解压后生成的目录,在弹出菜单中点击Properties,将文件夹路径复制下来。


然后打开终端,输入
vim ~/.bashrc
翻到文件的末尾,按i键进入编辑模式,输入
export NDK_HOME=刚才复制的path
export PATH=$NDK_HOME:$PATH

然后按ESC键退出编辑模式,输入:wq回车,保存修改内容。
退出vim后,使用命令
source ~/.bashrc
使改动生效,至此,ndk的环境变量就配置好了。
首先更新包列表:
sudo apt update
然后下载需要的编译软件
sudo apt install autoconf \
automake \
build-essential \
cmake \
git-core \
libass-dev \
libfreetype6-dev \
libgnutls28-dev \
libmp3lame-dev \
libsdl2-dev \
libtool \
libva-dev \
libvdpau-dev \
libvorbis-dev \
libxcb1-dev \
libxcb-shm0-dev \
libxcb-xfixes0-dev \
meson \
ninja-build \
pkg-config \
texinfo \
wget \
yasm \
zlib1g-dev \
libunistring-dev \
libaom-dev \
libdav1d-dev \
pkg-config
到这一步编译所需的准备工作就做完了,接下来终于可以开始编译了。
创建一个目录用来存放FFmpeg源码,打开Terminal,使用cd命令进入该目录下,执行
git clone https://github.com/FFmpeg/FFmpeg.git
将FFmpeg源码下载到本地,如下图:

源码下载完成后,正式开始编译。
修改configure文件:
首先,我们需要对configure文件进行修改,目的是为了不生成版本号(如libavcodec7.so),因为android平台识别不了!
将:
SLIBNAME_WITH_MAJOR=‘$(SLIBNAME).$(LIBMAJOR)’
LIB_INSTALL_EXTRA_CMD=‘$$(RANLIB)“$(LIBDIR)/$(LIBNAME)”’
SLIB_INSTALL_NAME=‘$(SLIBNAME_WITH_VERSION)’
SLIB_INSTALL_LINKS=‘$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)’
修改为:
SLIBNAME_WITH_MAJOR=‘$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)’
LIB_INSTALL_EXTRA_CMD=‘$$(RANLIB)“$(LIBDIR)/$(LIBNAME)”’
SLIB_INSTALL_NAME=‘$(SLIBNAME_WITH_MAJOR)’
SLIB_INSTALL_LINKS=‘$(SLIBNAME)’

试运行configure文件:
进入FFmpeg源码根目录下,使用
sudo ./configure
命令试着编译一下,发现会报错:

按照提示,在上面的命令后面加上–disable-x86asm,命令如下
sudo ./configure --disable-x86asm
这次能够正常运行了,但是最后会报warning:

警报内容说的是没找到pkg-config,我们使用命令安装一下:
sudo apt install pkg-config
安装完成后再次执行之前的编译命令,这次能够成功运行了。博主已将pkg-config包的下载加入到了之前的“下载需要的编译软件”指令中,使用新的指令下载后应该就不会遇到这个warning了。
OK,configure文件成功运行后,接下来就可以开始筹备针对安卓平台的编译了。
创建、执行编译脚本:
在FFmpeg源码根目录下创建build_android.sh文件,并将下面的脚本代码copy进去后保存,注意要将NDK_ROOT修改成自己的ndk目录路径。
#!/bin/bash
# 以下路径需要修改成自己的NDK目录
export NDK_ROOT=/home/jessehao/Development/Android/ndk/android-ndk-r22b
export TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
echo "<<<<<<<<<<<<<基于NDK22b编译 FFmpeg 5.0 64位硬件解码版本>>>>>>>>>>>>>>"
#设置编译平台的相关参数
#armv7-a
ARCH=arm
CPU=armv7-a
#armv8-a
#ARCH=arm64
#CPU=armv8-a
API=21
OS=android
PLATFORM=$CPU-linux-androideabi
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
#指定输出路径
PREFIX=$(pwd)/android/arm
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
#CROSS_PREFIX=$TOOLCHAIN/bin/$PLATFORM-
ANDROID_CROSS_PREFIX=$TOOLCHAIN/bin/${PLATFORM}$API-
echo "开始编译 $CPU"
#该脚本命令中不能插入注释,每行命令必须以 \ 结尾
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-gpl \
--enable-neon \
--enable-hwaccels \
--enable-postproc \
--enable-jni \
--enable-small \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-ffmpeg \
--disable-static \
--disable-ffplay \
--disable-ffprobe \
--disable-ffplay \
--disable-avdevice \
--disable-debug \
--disable-static \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=$OS \
--arch=$ARCH \
--cpu=$CPU \
--cc=${ANDROID_CROSS_PREFIX}clang \
--cxx=${ANDROID_CROSS_PREFIX}clang++ \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fPIC $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
make clean
#编译
make
#安装
make install
echo "编译完成 $CPU"
然后使用
sudo ./build_android.sh
命令运行该脚本。
运行后发现并没有这么顺利,刚开始就报错了:

我们按ctrl+c终止脚本执行,因为继续执行下去也是有问题的。
进到ffbuild找到config.log并打开,拉到最下方,可以看到以下报错详情:

报错信息说的很清楚了,没有找到相应的clang文件。
我们进到报错信息中指出的目录,发现armv7-a中间多了个“-”,而实际的clang文件是没有“-”的,我们需要改一下脚本,将CPU中armv7-a中的“-”去掉,如下图所示:

修改后再次运行脚本,就没有之前的报错了:

但是出现了新的warning信息:

先不管这个warning,继续编译,发现能够正常编译完成,

且在我们指定的目录(${pwd}/android/arm)下生成了头文件和so库:


说明是有正常进行编译的。
接下来,我们就可以通过在项目中引入这些头文件和so库,调用FFmpeg提供的多功能API了!
如果你遇到了文章中没有提到的问题,请在评论区留言,博主看到后会尽快回复。
之后的文章会讲解如何利用上面编译出来的头文件和so库,利用FFmpeg提供的API进行音视频开发,我们下一篇文章见。:)
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、