一、环境介绍
ubuntu桌面版本: 18.04
ffmpeg版本: 4.4.2
x264版本: x264-snapshot-20181217-2245
ARM目标开发板: RK3399
x264-snapshot-20181217-2245源码下载地址: https://download.csdn.net/download/xiaolong1126626497/12234153
ffmpeg4.4.2源码下载地址: https://download.csdn.net/download/xiaolong1126626497/12234197
编译好的库,可以直接使用,下载地址:https://download.csdn.net/download/xiaolong1126626497/12291634
二、需求介绍
需要编译x264与ffmpeg库到arm平台,完成音频视频开发。
交叉编译器采用: aarch64-linux-gcc
交叉编译器下载地址: https://download.csdn.net/download/xiaolong1126626497/12203205
三、编译X264库
下载源码解压,进入到解压目录执行下面命令。
代码语言:javascript复制wbyq@wbyq:~/work/rk3399/x264-snapshot-20181217-2245$make clean
wbyq@wbyq:~/work/rk3399/x264-snapshot-20181217-2245$./configure --prefix=$PWD/_install --disable-asm --enable-shared --enable-static --host=arm-none-linux-gnueabi
wbyq@wbyq:~/work/rk3399/x264-snapshot-20181217-2245$ gedit config.mak
修改config.mak配置。修改其中的工具链,具体看下面的代码,我的编译器是aarch64-linux-
代码语言:javascript复制SRCPATH=.
prefix=/home/wbyq/work/rk3399/x264-snapshot-20181217-2245/_install
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
includedir=${prefix}/include
SYS_ARCH=ARM
SYS=LINUX
CC=aarch64-linux-gcc
CFLAGS=-Wno-maybe-uninitialized -Wshadow -O3 -ffast-math -Wall -I. -I$(SRCPATH) -std=gnu99 -D_GNU_SOURCE -fPIC -fomit-frame-pointer -fno-tree-vectorize
COMPILER=GNU
COMPILER_STYLE=GNU
DEPMM=-MM -g0
DEPMT=-MT
LD=aarch64-linux-gcc -o
LDFLAGS= -lm -lpthread -ldl
LIBX264=libx264.a
AR=aarch64-linux-ar rc
RANLIB=aarch64-linux-ranlib
STRIP=aarch64-linux-strip
INSTALL=install
AS=
ASFLAGS= -I. -I$(SRCPATH) -DSTACK_ALIGNMENT=4 -DPIC
RC=
RCFLAGS=
EXE=
HAVE_GETOPT_LONG=1
DEVNULL=/dev/null
PROF_GEN_CC=-fprofile-generate
PROF_GEN_LD=-fprofile-generate
PROF_USE_CC=-fprofile-use
PROF_USE_LD=-fprofile-use
HAVE_OPENCL=yes
CC_O=-o $@
default: cli
install: install-cli
SOSUFFIX=so
SONAME=libx264.so.157
SOFLAGS=-shared -Wl,-soname,$(SONAME) -Wl,-Bsymbolic
default: lib-shared
install: install-lib-shared
default: lib-static
install: install-lib-static
LDFLAGSCLI = -ldl
CLI_LIBX264 = $(LIBX264)
修改之后:
代码语言:javascript复制make && make install
成功生成的文件如下:
代码语言:javascript复制wbyq@wbyq:~/work/rk3399/x264-snapshot-20181217-2245$ ls
android common config.log configure encoder filters libx264.a output x264 x264_config.h x264.o
AUTHORS config.guess config.mak COPYING example.c input libx264.so.157 tools x264.c x264dll.c x264.pc
build_android.sh config.h config.sub doc extras _install Makefile version.sh x264cli.h x264.h x264res.rc
wbyq@wbyq:~/work/rk3399/x264-snapshot-20181217-2245$ clear
wbyq@wbyq:~/work/rk3399/x264-snapshot-20181217-2245$ tree _install/
_install/
├── bin
│ └── x264
├── include
│ ├── x264_config.h
│ └── x264.h
└── lib
├── libx264.a
├── libx264.so -> libx264.so.157
├── libx264.so.157
└── pkgconfig
└── x264.pc
4 directories, 7 files
wbyq@wbyq:~/work/rk3399/x264-snapshot-20181217-2245$
四、编译FFMPEG
下载源码解压,进入到解压目录执行下面命令。
代码语言:javascript复制wbyq@wbyq:~/work/rk3399/ffmpeg-4.2.2$ make clean
wbyq@wbyq:~/work/rk3399/ffmpeg-4.2.2$ ./configure --enable-shared --enable-static --prefix=$PWD/_install --cross-prefix=aarch64-linux- --arch=arm64 --target-os=linux --enable-gpl --enable-ffmpeg --enable-libx264 --extra-cflags=-I/home/wbyq/work/rk3399/x264-snapshot-20181217-2245/_install/include --extra-ldflags=-L/home/wbyq/work/rk3399/x264-snapshot-20181217-2245/_install/lib
wbyq@wbyq:~/work/rk3399/ffmpeg-4.2.2$ make && make install
说明: 里面涉及到的X264路径,根据自己路径情况修改。
编译完成生成的文件如下:
代码语言:javascript复制wbyq@wbyq:~/work/rk3399/ffmpeg-4.2.2$ ls
Changelog configure COPYING.GPLv3 CREDITS ffmpeg ffprobe_g INSTALL.md libavfilter libavutil libswscale Makefile RELEASE tools
compat CONTRIBUTING.md COPYING.LGPLv2.1 doc ffmpeg_g fftools libavcodec libavformat libpostproc LICENSE.md presets RELEASE_NOTES VERSION
config.h COPYING.GPLv2 COPYING.LGPLv3 ffbuild ffprobe _install libavdevice libavresample libswresample MAINTAINERS README.md tests
wbyq@wbyq:~/work/rk3399/ffmpeg-4.2.2$ tree _install/
_install/
├── bin
│ ├── ffmpeg
│ └── ffprobe
├── include
│ ├── libavcodec
│ │ ├── ac3_parser.h
│ │ ├── adts_parser.h
│ │ ├── avcodec.h
│ │ ├── avdct.h
│ │ ├── avfft.h
│ │ ├── d3d11va.h
│ │ ├── dirac.h
│ │ ├── dv_profile.h
│ │ ├── dxva2.h
│ │ ├── jni.h
│ │ ├── mediacodec.h
│ │ ├── qsv.h
│ │ ├── vaapi.h
│ │ ├── vdpau.h
│ │ ├── version.h
│ │ ├── videotoolbox.h
│ │ ├── vorbis_parser.h
│ │ └── xvmc.h
│ ├── libavdevice
│ │ ├── avdevice.h
│ │ └── version.h
│ ├── libavfilter
│ │ ├── avfilter.h
│ │ ├── buffersink.h
│ │ ├── buffersrc.h
│ │ └── version.h
│ ├── libavformat
│ │ ├── avformat.h
│ │ ├── avio.h
│ │ └── version.h
│ ├── libavutil
│ │ ├── adler32.h
│ │ ├── aes_ctr.h
│ │ ├── aes.h
│ │ ├── attributes.h
│ │ ├── audio_fifo.h
│ │ ├── avassert.h
│ │ ├── avconfig.h
│ │ ├── avstring.h
│ │ ├── avutil.h
│ │ ├── base64.h
│ │ ├── blowfish.h
│ │ ├── bprint.h
│ │ ├── bswap.h
│ │ ├── buffer.h
│ │ ├── camellia.h
│ │ ├── cast5.h
│ │ ├── channel_layout.h
│ │ ├── common.h
│ │ ├── cpu.h
│ │ ├── crc.h
│ │ ├── des.h
│ │ ├── dict.h
│ │ ├── display.h
│ │ ├── downmix_info.h
│ │ ├── encryption_info.h
│ │ ├── error.h
│ │ ├── eval.h
│ │ ├── ffversion.h
│ │ ├── fifo.h
│ │ ├── file.h
│ │ ├── frame.h
│ │ ├── hash.h
│ │ ├── hdr_dynamic_metadata.h
│ │ ├── hmac.h
│ │ ├── hwcontext_cuda.h
│ │ ├── hwcontext_d3d11va.h
│ │ ├── hwcontext_drm.h
│ │ ├── hwcontext_dxva2.h
│ │ ├── hwcontext.h
│ │ ├── hwcontext_mediacodec.h
│ │ ├── hwcontext_qsv.h
│ │ ├── hwcontext_vaapi.h
│ │ ├── hwcontext_vdpau.h
│ │ ├── hwcontext_videotoolbox.h
│ │ ├── imgutils.h
│ │ ├── intfloat.h
│ │ ├── intreadwrite.h
│ │ ├── lfg.h
│ │ ├── log.h
│ │ ├── lzo.h
│ │ ├── macros.h
│ │ ├── mastering_display_metadata.h
│ │ ├── mathematics.h
│ │ ├── md5.h
│ │ ├── mem.h
│ │ ├── motion_vector.h
│ │ ├── murmur3.h
│ │ ├── opt.h
│ │ ├── parseutils.h
│ │ ├── pixdesc.h
│ │ ├── pixelutils.h
│ │ ├── pixfmt.h
│ │ ├── random_seed.h
│ │ ├── rational.h
│ │ ├── rc4.h
│ │ ├── replaygain.h
│ │ ├── ripemd.h
│ │ ├── samplefmt.h
│ │ ├── sha512.h
│ │ ├── sha.h
│ │ ├── spherical.h
│ │ ├── stereo3d.h
│ │ ├── tea.h
│ │ ├── threadmessage.h
│ │ ├── timecode.h
│ │ ├── time.h
│ │ ├── timestamp.h
│ │ ├── tree.h
│ │ ├── twofish.h
│ │ ├── tx.h
│ │ ├── version.h
│ │ └── xtea.h
│ ├── libpostproc
│ │ ├── postprocess.h
│ │ └── version.h
│ ├── libswresample
│ │ ├── swresample.h
│ │ └── version.h
│ └── libswscale
│ ├── swscale.h
│ └── version.h
├── lib
│ ├── libavcodec.a
│ ├── libavcodec.so -> libavcodec.so.58.54.100
│ ├── libavcodec.so.58 -> libavcodec.so.58.54.100
│ ├── libavcodec.so.58.54.100
│ ├── libavdevice.a
│ ├── libavdevice.so -> libavdevice.so.58.8.100
│ ├── libavdevice.so.58 -> libavdevice.so.58.8.100
│ ├── libavdevice.so.58.8.100
│ ├── libavfilter.a
│ ├── libavfilter.so -> libavfilter.so.7.57.100
│ ├── libavfilter.so.7 -> libavfilter.so.7.57.100
│ ├── libavfilter.so.7.57.100
│ ├── libavformat.a
│ ├── libavformat.so -> libavformat.so.58.29.100
│ ├── libavformat.so.58 -> libavformat.so.58.29.100
│ ├── libavformat.so.58.29.100
│ ├── libavutil.a
│ ├── libavutil.so -> libavutil.so.56.31.100
│ ├── libavutil.so.56 -> libavutil.so.56.31.100
│ ├── libavutil.so.56.31.100
│ ├── libpostproc.a
│ ├── libpostproc.so -> libpostproc.so.55.5.100
│ ├── libpostproc.so.55 -> libpostproc.so.55.5.100
│ ├── libpostproc.so.55.5.100
│ ├── libswresample.a
│ ├── libswresample.so -> libswresample.so.3.5.100
│ ├── libswresample.so.3 -> libswresample.so.3.5.100
│ ├── libswresample.so.3.5.100
│ ├── libswscale.a
│ ├── libswscale.so -> libswscale.so.5.5.100
│ ├── libswscale.so.5 -> libswscale.so.5.5.100
│ ├── libswscale.so.5.5.100
│ └── pkgconfig
│ ├── libavcodec.pc
│ ├── libavdevice.pc
│ ├── libavfilter.pc
│ ├── libavformat.pc
│ ├── libavutil.pc
│ ├── libpostproc.pc
│ ├── libswresample.pc
│ └── libswscale.pc
└── share
├── ffmpeg
│ ├── examples
│ │ ├── avio_dir_cmd.c
│ │ ├── avio_reading.c
│ │ ├── decode_audio.c
│ │ ├── decode_video.c
│ │ ├── demuxing_decoding.c
│ │ ├── encode_audio.c
│ │ ├── encode_video.c
│ │ ├── extract_mvs.c
│ │ ├── filter_audio.c
│ │ ├── filtering_audio.c
│ │ ├── filtering_video.c
│ │ ├── http_multiclient.c
│ │ ├── hw_decode.c
│ │ ├── Makefile
│ │ ├── metadata.c
│ │ ├── muxing.c
│ │ ├── qsvdec.c
│ │ ├── README
│ │ ├── remuxing.c
│ │ ├── resampling_audio.c
│ │ ├── scaling_video.c
│ │ ├── transcode_aac.c
│ │ ├── transcoding.c
│ │ ├── vaapi_encode.c
│ │ └── vaapi_transcode.c
│ ├── ffprobe.xsd
│ ├── libvpx-1080p50_60.ffpreset
│ ├── libvpx-1080p.ffpreset
│ ├── libvpx-360p.ffpreset
│ ├── libvpx-720p50_60.ffpreset
│ └── libvpx-720p.ffpreset
└── man
├── man1
│ ├── ffmpeg.1
│ ├── ffmpeg-all.1
│ ├── ffmpeg-bitstream-filters.1
│ ├── ffmpeg-codecs.1
│ ├── ffmpeg-devices.1
│ ├── ffmpeg-filters.1
│ ├── ffmpeg-formats.1
│ ├── ffmpeg-protocols.1
│ ├── ffmpeg-resampler.1
│ ├── ffmpeg-scaler.1
│ ├── ffmpeg-utils.1
│ ├── ffprobe.1
│ └── ffprobe-all.1
└── man3
├── libavcodec.3
├── libavdevice.3
├── libavfilter.3
├── libavformat.3
├── libavutil.3
├── libswresample.3
└── libswscale.3
18 directories, 208 files
wbyq@wbyq:~/work/rk3399/ffmpeg-4.2.2$
五、库的运行方式
编译ffmpeg代码的Makefile示例:
代码语言:javascript复制all:
aarch64-linux-gnu-gcc app.c -I /home/wbyq/work/rk3399/ffmpeg-4.2.2/_install/include -L /home/wbyq/work/rk3399/ffmpeg-4.2.2/_install/lib -I/home/wbyq/work/rk3399/x264-snapshot-20181217-2245/_install/include -L/home/wbyq/work/rk3399/x264-snapshot-20181217-2245/_install/lib -lavcodec -lavfilter -lavutil -lswresample -lavdevice -lavformat -lpostproc -lswscale -lm -lpthread -lasound -lx264