ffmepg是一个音视频的开发工具。
一套可以用来记录、处理数字音频、视频,并将其转换为流的开源框架。采用 LPL、GPL许可制,提供了录制、转换以及流化音视频的完整解决方案。
下面是一些FFmepg使用时的基本命令,是最基础的内容,我们不用太熟悉FFmpeg里面的代码是如何写的,如我们只需调用:
ffmpge -i input.avi -r 24 output.avi
就可以把input.avi中的帧率变成24,输出的output.avi就是24fps的视频
在Windows下编译FFmpeg需要准备工具 MSYS2
和 Yasm
MSYS2集成了 Pacman、MinGW-w64的Cygwin
升级版,下载地址在:MSYS2下载地址
Yasm是一个汇编器。在地址在:Yasm下载地址,下载对应的 .exe
文件,下载完后放入到 Windows\System32文件夹下就行了。
关于安装完MSYS2后,需要配置一些东西,重点去看这个blog:msys2在windows10下编译安装ffmpeg+x265
至于265的可以考虑先装。
在这个地方(使用WIN10编译)我踩坑无数,花了几天的休息时间终于编译出来了。
这里先列出我所有踩过的坑:
./
来执行文件,它的作用和linux的终端一样,功能非常强大这里就不多探究为什么要怎么怎么改。具体的可以参考这篇文章(完全ok):编译 FFmpeg 之 clang
先说下目的:ffmpeg4之后使用clang编译器进行编译,但是它并没有专门为clang声明一套方案,这导致如果我们不在其配置文件下加入clang的一些声明,会导致后期我们编译ffmpeg不成功。
首先在ffmpeg的文件下找到configure,用文本打开。
找到 --cross-prefix=PREFIX use PREFIX for compilation tools [$cross_prefix]
在其下面加一行:
--corss-prefix-clang=PREFIX use PREFIX for compilation clang tools [$cross_prefix]
接着找到 CMDLINE_SET="..... corss_prefix
在其下面添加一行:
cross_prefix_clang
接着找到
set_default target_os
if test "$target_os" = android; then
cc_default="clang"
fi
ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix}${cc_default}"
cxx_default="${cross_prefix}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
替换成:
set_default target_os
if test "$target_os" = android; then
cc_default="clang"
cxx_default="clang++"
fi
ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix_clang}${cc_default}"
cxx_default="${cross_prefix_clang}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
保存文件,使用msys2进入到ffmpeg根目录下执行 ./configure
来跑一边配置文件
在根目录下新建一个名为 temp
的文件夹作为 编译过程中的临时文件。
在ffmpeg根目录下编写一个脚本名为build_android.sh
,用来编译ffmpeg。
在里面编辑(注意看注释):
#!/bin/bash
make clean
#指定ndk路径
export NDK=C:/Users/msn/AppData/Local/Android/Sdk/ndk-bundle
#指定ffmpeg路径
export FFMPEG=C:/Users/msn/Desktop/ffmpeg-4.2.1
#指定临时文件夹
export TMPDIR=$FFMPEG/temp
#指定sysroot
export SYSROOT=$NDK/toolchains/llvm/prebuilt/windows-x86_64/sysroot
#指定平台
export PLATFORM=$NDK//toolchains/llvm/prebuilt/windows-x86_64
#指定cpu(如果用clang编译,必须指定cpu为armv7-a)
export CPU=armv7-a
#指定产出文件
export PREFIX=C:/Users/msn/Desktop/ffmpeg-4.2.1/android/$cpu
function build
{
./configure \
--prefix=$PREFIX \
--target-os=android \
--arch=$CPU \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-symver \
--enable-cross-compile \
--sysroot=$SYSROOT \
--cross-prefix=$PLATFORM/bin/arm-linux-androideabi- \
#指定为android28编译,当然也可以把28换成16以上的其他数字
--cross-prefix-clang=$PLATFORM/bin/armv7a-linux-androideabi28- \
--extra-cflags="-I$SYSROOT/usr/include" \
--extra-ldflags="-L$SYSROOT/usr/lib" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j2
make install
}
build
编辑完后保存。
在根目录下运行 ./build_android
运行之后的结果,是会在目录下看到产出的文件:
里面的内容就是编译之后的结果。