FFmpeg和X264的交叉编译环境

arm linux交叉编译x264 ffmpeg

ffmpeg与x264差异?

Linux下交叉编译FFMPEG与X264库:目标板友善之臂Tiny4412开发板_EXYNOS4412(ARMV7_32位)(这个还有直接用ffmpeg在arm下采集摄像头数据生成MP4视频的代码呢!)

FFmpeg需要X264库才能正常编码x264,所以不知道我们arm摄像头里是否缺少x264库,所以我们先交叉编译个x264进去看看?

1、交叉编译x264(x264要先编译,因为到时编译ffmpeg时要用到x264的头文件和库)

我可以参照我之前交叉编译netkit-ftp的方法

下载 x264:git clone VideoLAN / x264

拷贝到ubuntu虚拟机中,在里面运行configure --help查看make配置指令,发现出现/bin/bash^M: bad interpreter: No such file or directory,用linux arm 运行 shell .sh 脚本文件报错:/bin/bash^M: bad interpreter: No such file or directory(dos2unix )方法解决一下就好了
在这里插入图片描述

查看编译帮助

[root@ubuntu /arnold_test/20220105_crossCompile_x264_ffmpeg/x264]1# ./configure  --help
Usage: ./configure [options]

Help:
  -h, --help               print this message

Standard options:
  --prefix=PREFIX          install architecture-independent files in PREFIX
                           [/usr/local]
  --exec-prefix=EPREFIX    install architecture-dependent files in EPREFIX
                           [PREFIX]
  --bindir=DIR             install binaries in DIR [EPREFIX/bin]
  --libdir=DIR             install libs in DIR [EPREFIX/lib]
  --includedir=DIR         install includes in DIR [PREFIX/include]
  --extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS
  --extra-rcflags=ERCFLAGS add ERCFLAGS to RCFLAGS

Configuration options:
  --disable-cli            disable cli	//取消命令行(command line)
  --system-libx264         use system libx264 instead of internal
  --enable-shared          build shared library
  --enable-static          build static library
  --disable-bashcompletion disable installation of bash-completion script
  --enable-bashcompletion  force installation of bash-completion script
  --bashcompletionsdir=DIR install bash-completion script in DIR [auto]
  --disable-opencl         disable OpenCL features
  --disable-gpl            disable GPL-only features
  --disable-thread         disable multithreaded encoding
  --disable-win32thread    disable win32threads (windows only)
  --disable-interlaced     disable interlaced encoding support
  --bit-depth=BIT_DEPTH    set output bit depth (8, 10, all) [all]
  --chroma-format=FORMAT   output chroma format (400, 420, 422, 444, all) [all]

Advanced options:
  --disable-asm            disable platform-specific assembly optimizations
  --enable-lto             enable link-time optimization
  --enable-debug           add -g
  --enable-gprof           add -pg
  --enable-strip           add -s
  --enable-pic             build position-independent code

Cross-compilation:
  --host=HOST              build programs to run on HOST
  --cross-prefix=PREFIX    use PREFIX for compilation tools
  --sysroot=SYSROOT        root of cross-build tree

External library support:
  --disable-avs            disable avisynth support
  --disable-swscale        disable swscale support
  --disable-lavf           disable libavformat support
  --disable-ffms           disable ffmpegsource support
  --disable-gpac           disable gpac support
  --disable-lsmash         disable lsmash support

[root@ubuntu /arnold_test/20220105_crossCompile_x264_ffmpeg/x264]2# 

新建arnold_run.sh

touch arnold_run.sh

并在里面键入:

#!/bin/sh

./configure --prefix=/arnold_test/20220105_crossCompile_x264_ffmpeg/x264/arnold_build --enable-shared --enable-static --host=arm-linux --cross-prefix=arm-linux-gnueabihf-gcc --disable-opencl --enable-pic --disable-asm

虽说我已经配置了交叉编译器的环境变量,但还是跟上次编译netkit-ftp一样,报了找不到编译器的错误:
在这里插入图片描述
参考解决方法:KYSL laoyuan 发来交叉编译后的ftp仓库 源码分析 在arm摄像头下用法分析(数据服务器ip、登录用户及密码)ftp(netkit-ftp)客户端交叉编译(arm移植ftp)

根据上面方法还是没解决,还是报No working C compiler found.

但是因为laoyuan直接在网上下了个别人编译好的,所以我就不自己编译了。。。先看看他那个能不能正常用吧。。
在这里插入图片描述
完全不能正常用啊,运行ffmpeg提示找不到ffmpeg,GAN!

然后我自己又在网上花了三块钱下了个,也有问题,报错还古里八怪的
在这里插入图片描述
还是重回编译正道吧!

重新编译:

参考文章:windows 编译 x264 报错 No working C compiler found 处理方法

根据文中指示,我们查看config.log文件

哎呦我去,,一看就看明白了
在这里插入图片描述
修改arnold_run.sh,把gnueabihf-后面的gcc删掉

在这里插入图片描述
arnold_run.sh

#!/bin/sh

./configure --prefix=/arnold_test/20220105_crossCompile_x264_ffmpeg/x264/arnold_build --enable-shared --enable-static --cross-prefix=arm-linux-gnueabihf- --host=arm-linux --disable-opencl --enable-pic --disable-asm

继续运行arnold_run.sh,还是不行,报错:

invalid -march= option: `armv7-a'

解决不了啊。。。

能解决了,换上laoyuan给的交叉编译器,参考:KYSL 我们瑞芯微的交叉编译工具链位置

主要laoyuan说之前的交叉编译器给我搞坏了。。。

然后arnold_run.sh改成:

#!/bin/sh

./configure --prefix=/arnold_test/20220105_crossCompile_x264_ffmpeg/x264/arnold_build --enable-shared --enable-static --cross-prefix=/home/yg/rv/sdk/rv1.8/rv1126_rv1109/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- --host=arm-linux --disable-opencl --enable-pic --disable-asm

执行:

[root@ubuntu /arnold_test/20220105_crossCompile_x264_ffmpeg/x264]10# ./arnold_run.sh 
platform:       ARM
byte order:     little-endian
system:         LINUX
cli:            yes
libx264:        internal
shared:         yes
static:         yes
bashcompletion: no
asm:            no
interlaced:     yes
avs:            avxsynth
lavf:           no
ffms:           no
mp4:            no
gpl:            yes
thread:         posix
opencl:         no
filters:        crop select_every
lto:            no
debug:          no
gprof:          no
strip:          no
PIC:            yes
bit depth:      all
chroma format:  all

You can run 'make' or 'make fprofiled' now.
[root@ubuntu /arnold_test/20220105_crossCompile_x264_ffmpeg/x264]11# 

然后执行这个version.sh,不然make会提示x264.c:506:21: error: ‘X264_VERSION’ undeclared
在这里插入图片描述
然后执行makemake install,一切顺利
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
执行完make install后,设置的arnold_build中也出现了binincludelib三个文件夹,眼前瞬间一亮,有种感觉全身经脉被打通的快感!
在这里插入图片描述

2、接着我们编译ffmpeg

搁这下:https://launchpad.net/ubuntu/+search?text=ffmpeg
在这里插入图片描述
下这个版本: 7:4.4-6ubuntu5,这个看起来顺眼一点
在这里插入图片描述
下这个:ffmpeg_4.4.orig.tar.xz
在这里插入图片描述

下载好后拷贝到ubuntu里解压:
在这里插入图片描述

老样子,进去先执行./configure --help查看编译配置帮助

[yg@ubuntu /arnold_test/20220105_crossCompile_x264_ffmpeg/ffmpeg/ffmpeg-4.4]7$ ./configure --help

配置帮助太长就不看了

还是要看下的,不看找不着北了。。。。执行./configure --help

[yg@ubuntu /arnold_test/20220105_crossCompile_x264_ffmpeg/ffmpeg/ffmpeg-4.4]12$ ./configure --help
tput: unknown terminal "xterm-256color"
tput: unknown terminal "xterm-256color"
Usage: configure [options]
Options: [defaults in brackets after descriptions]	//描述后括号中的默认值

Help options:
  --help                   print this message
  --quiet                  Suppress showing informative output	//抑制显示信息输出
  --list-decoders          show all available decoders
  --list-encoders          show all available encoders
  --list-hwaccels          show all available hardware accelerators
  --list-demuxers          show all available demuxers
  --list-muxers            show all available muxers	//显示所有可用的多路复用器(封装器)
  --list-parsers           show all available parsers	//解析器
  --list-protocols         show all available protocols	//协议
  --list-bsfs              show all available bitstream filters	//显示所有可用的位流筛选器
  --list-indevs            show all available input devices
  --list-outdevs           show all available output devices
  --list-filters           show all available filters

Standard options:	//不是可选的,应该是默认都有的
  --logfile=FILE           log tests and output to FILE [ffbuild/config.log]	//记录测试并输出到文件(默认)[ffbuild/config.log]
  --disable-logging        do not log configure debug information	//不要记录配置调试信息
  --fatal-warnings         fail if any configure warning is generated	//如果生成任何配置警告,则失败
  --prefix=PREFIX          install in PREFIX [/usr/local]	//以前缀安装(默认)[/usr/local]
  --bindir=DIR             install binaries in DIR [PREFIX/bin]	//在目录[PREFIX/bin]中安装二进制文件(可执行文件)
  --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]	//在目录[PREFIX/share/ffmpeg]中安装数据文件
  --docdir=DIR             install documentation in DIR [PREFIX/share/doc/ffmpeg]
  --libdir=DIR             install libs in DIR [PREFIX/lib]
  --shlibdir=DIR           install shared libs in DIR [LIBDIR]	//动态库(sh = share)
  --incdir=DIR             install includes in DIR [PREFIX/include]	//头文件(inc = include)
  --mandir=DIR             install man page in DIR [PREFIX/share/man]
  --pkgconfigdir=DIR       install pkg-config files in DIR [LIBDIR/pkgconfig]
  --enable-rpath           use rpath to allow installing libraries in paths
                           not part of the dynamic linker search path
                           use rpath when linking programs (USE WITH CARE)	//不懂
  --install-name-dir=DIR   Darwin directory name for installed targets	//不懂

Licensing options:
  --enable-gpl             allow use of GPL code, the resulting libs
                           and binaries will be under GPL [no]
  --enable-version3        upgrade (L)GPL to version 3 [no]
  --enable-nonfree         allow use of nonfree code, the resulting libs
                           and binaries will be unredistributable [no]	//如果允许使用非自由代码,则生成的库和二进制文件将不可分发[no]

Configuration options:
  --disable-static         do not build static libraries [no]
  --enable-shared          build shared libraries [no]
  --enable-small           optimize for size instead of speed	//优化尺寸而不是速度
  --disable-runtime-cpudetect disable detecting CPU capabilities at runtime (smaller binary)	//禁用运行时检测CPU功能(较小的二进制文件)
  --enable-gray            enable full grayscale support (slower color)	//启用全灰度支持(较慢的颜色)
  --disable-swscale-alpha  disable alpha channel support in swscale	//禁用swscale中的alpha通道支持
  --disable-all            disable building components, libraries and programs
  --disable-autodetect     disable automatically detected external libraries [no]

Program options:
  --disable-programs       do not build command line programs
  --disable-ffmpeg         disable ffmpeg build
  --disable-ffplay         disable ffplay build
  --disable-ffprobe        disable ffprobe build

Documentation options:
  --disable-doc            do not build documentation
  --disable-htmlpages      do not build HTML documentation pages
  --disable-manpages       do not build man documentation pages
  --disable-podpages       do not build POD documentation pages
  --disable-txtpages       do not build text documentation pages

Component options:
  --disable-avdevice       disable libavdevice build
  --disable-avcodec        disable libavcodec build
  --disable-avformat       disable libavformat build
  --disable-swresample     disable libswresample build
  --disable-swscale        disable libswscale build
  --disable-postproc       disable libpostproc build
  --disable-avfilter       disable libavfilter build
  --enable-avresample      enable libavresample build (deprecated) [no]
  --disable-pthreads       disable pthreads [autodetect]
  --disable-w32threads     disable Win32 threads [autodetect]
  --disable-os2threads     disable OS/2 threads [autodetect]
  --disable-network        disable network support [no]
  --disable-dct            disable DCT code
  --disable-dwt            disable DWT code
  --disable-error-resilience disable error resilience code
  --disable-lsp            disable LSP code
  --disable-lzo            disable LZO decoder code
  --disable-mdct           disable MDCT code
  --disable-rdft           disable RDFT code
  --disable-fft            disable FFT code
  --disable-faan           disable floating point AAN (I)DCT code
  --disable-pixelutils     disable pixel utils in libavutil

Individual component options:
  --disable-everything     disable all components listed below
  --disable-encoder=NAME   disable encoder NAME
  --enable-encoder=NAME    enable encoder NAME
  --disable-encoders       disable all encoders
  --disable-decoder=NAME   disable decoder NAME
  --enable-decoder=NAME    enable decoder NAME
  --disable-decoders       disable all decoders
  --disable-hwaccel=NAME   disable hwaccel NAME
  --enable-hwaccel=NAME    enable hwaccel NAME
  --disable-hwaccels       disable all hwaccels
  --disable-muxer=NAME     disable muxer NAME
  --enable-muxer=NAME      enable muxer NAME
  --disable-muxers         disable all muxers
  --disable-demuxer=NAME   disable demuxer NAME
  --enable-demuxer=NAME    enable demuxer NAME
  --disable-demuxers       disable all demuxers
  --enable-parser=NAME     enable parser NAME
  --disable-parser=NAME    disable parser NAME
  --disable-parsers        disable all parsers
  --enable-bsf=NAME        enable bitstream filter NAME
  --disable-bsf=NAME       disable bitstream filter NAME
  --disable-bsfs           disable all bitstream filters
  --enable-protocol=NAME   enable protocol NAME
  --disable-protocol=NAME  disable protocol NAME
  --disable-protocols      disable all protocols
  --enable-indev=NAME      enable input device NAME
  --disable-indev=NAME     disable input device NAME
  --disable-indevs         disable input devices
  --enable-outdev=NAME     enable output device NAME
  --disable-outdev=NAME    disable output device NAME
  --disable-outdevs        disable output devices
  --disable-devices        disable all devices
  --enable-filter=NAME     enable filter NAME
  --disable-filter=NAME    disable filter NAME
  --disable-filters        disable all filters

External library support:

  Using any of the following switches will allow FFmpeg to link to the
  corresponding external library. All the components depending on that library
  will become enabled, if all their other dependencies are met and they are not
  explicitly disabled. E.g. --enable-libopus will enable linking to
  libopus and allow the libopus encoder to be built, unless it is
  specifically disabled with --disable-encoder=libopus.
  //使用以下任何开关将允许FFmpeg链接到相应的外部库。如果满足所有其他依赖项且未明确禁用,则依赖于该库的所有组件都将启用。例如--enable libopus将启用到libopus的链接并允许构建libopus编码器,除非使用--disable encoder=libopus专门禁用它。

  Note that only the system libraries are auto-detected. All the other external
  libraries must be explicitly enabled.
  //请注意,只有系统库是自动检测的。所有其他外部库都必须显式启用。

  Also note that the following help text describes the purpose of the libraries
  themselves, not all their features will necessarily be usable by FFmpeg.
  //还请注意,以下帮助文本描述了库本身的用途,但FFmpeg不一定能使用它们的所有功能。

  --disable-alsa           disable ALSA support [autodetect]
  --disable-appkit         disable Apple AppKit framework [autodetect]
  --disable-avfoundation   disable Apple AVFoundation framework [autodetect]
  --enable-avisynth        enable reading of AviSynth script files [no]
  --disable-bzlib          disable bzlib [autodetect]
  --disable-coreimage      disable Apple CoreImage framework [autodetect]
  --enable-chromaprint     enable audio fingerprinting with chromaprint [no]
  --enable-frei0r          enable frei0r video filtering [no]
  --enable-gcrypt          enable gcrypt, needed for rtmp(t)e support
                           if openssl, librtmp or gmp is not used [no]
  --enable-gmp             enable gmp, needed for rtmp(t)e support
                           if openssl or librtmp is not used [no]
  --enable-gnutls          enable gnutls, needed for https support
                           if openssl, libtls or mbedtls is not used [no]
  --disable-iconv          disable iconv [autodetect]
  --enable-jni             enable JNI support [no]
  --enable-ladspa          enable LADSPA audio filtering [no]
  --enable-libaom          enable AV1 video encoding/decoding via libaom [no]
  --enable-libaribb24      enable ARIB text and caption decoding via libaribb24 [no]
  --enable-libass          enable libass subtitles rendering,
                           needed for subtitles and ass filter [no]
  --enable-libbluray       enable BluRay reading using libbluray [no]
  --enable-libbs2b         enable bs2b DSP library [no]
  --enable-libcaca         enable textual display using libcaca [no]
  --enable-libcelt         enable CELT decoding via libcelt [no]
  --enable-libcdio         enable audio CD grabbing with libcdio [no]
  --enable-libcodec2       enable codec2 en/decoding using libcodec2 [no]
  --enable-libdav1d        enable AV1 decoding via libdav1d [no]
  --enable-libdavs2        enable AVS2 decoding via libdavs2 [no]
  --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                           and libraw1394 [no]
  --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
  --enable-libflite        enable flite (voice synthesis) support via libflite [no]
  --enable-libfontconfig   enable libfontconfig, useful for drawtext filter [no]
  --enable-libfreetype     enable libfreetype, needed for drawtext filter [no]
  --enable-libfribidi      enable libfribidi, improves drawtext filter [no]
  --enable-libglslang      enable GLSL->SPIRV compilation via libglslang [no]
  --enable-libgme          enable Game Music Emu via libgme [no]
  --enable-libgsm          enable GSM de/encoding via libgsm [no]
  --enable-libiec61883     enable iec61883 via libiec61883 [no]
  --enable-libilbc         enable iLBC de/encoding via libilbc [no]
  --enable-libjack         enable JACK audio sound server [no]
  --enable-libklvanc       enable Kernel Labs VANC processing [no]
  --enable-libkvazaar      enable HEVC encoding via libkvazaar [no]
  --enable-liblensfun      enable lensfun lens correction [no]
  --enable-libmodplug      enable ModPlug via libmodplug [no]
  --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
  --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
  --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
  --enable-libopencv       enable video filtering via libopencv [no]
  --enable-libopenh264     enable H.264 encoding via OpenH264 [no]
  --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
  --enable-libopenmpt      enable decoding tracked files via libopenmpt [no]
  --enable-libopenvino     enable OpenVINO as a DNN module backend
                           for DNN based filters like dnn_processing [no]
  --enable-libopus         enable Opus de/encoding via libopus [no]
  --enable-libpulse        enable Pulseaudio input via libpulse [no]
  --enable-librabbitmq     enable RabbitMQ library [no]
  --enable-librav1e        enable AV1 encoding via rav1e [no]
  --enable-librist         enable RIST via librist [no]
  --enable-librsvg         enable SVG rasterization via librsvg [no]
  --enable-librubberband   enable rubberband needed for rubberband filter [no]
  --enable-librtmp         enable RTMP[E] support via librtmp [no]
  --enable-libshine        enable fixed-point MP3 encoding via libshine [no]
  --enable-libsmbclient    enable Samba protocol via libsmbclient [no]
  --enable-libsnappy       enable Snappy compression, needed for hap encoding [no]
  --enable-libsoxr         enable Include libsoxr resampling [no]
  --enable-libspeex        enable Speex de/encoding via libspeex [no]
  --enable-libsrt          enable Haivision SRT protocol via libsrt [no]
  --enable-libssh          enable SFTP protocol via libssh [no]
  --enable-libsvtav1       enable AV1 encoding via SVT [no]
  --enable-libtensorflow   enable TensorFlow as a DNN module backend
                           for DNN based filters like sr [no]
  --enable-libtesseract    enable Tesseract, needed for ocr filter [no]
  --enable-libtheora       enable Theora encoding via libtheora [no]
  --enable-libtls          enable LibreSSL (via libtls), needed for https support
                           if openssl, gnutls or mbedtls is not used [no]
  --enable-libtwolame      enable MP2 encoding via libtwolame [no]
  --enable-libuavs3d       enable AVS3 decoding via libuavs3d [no]
  --enable-libv4l2         enable libv4l2/v4l-utils [no]
  --enable-libvidstab      enable video stabilization using vid.stab [no]
  --enable-libvmaf         enable vmaf filter via libvmaf [no]
  --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
  --enable-libvorbis       enable Vorbis en/decoding via libvorbis,
                           native implementation exists [no]
  --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
  --enable-libwebp         enable WebP encoding via libwebp [no]
  --enable-libx264         enable H.264 encoding via x264 [no]	//通过x264启用H.264编码[否]
  --enable-libx265         enable HEVC encoding via x265 [no]
  --enable-libxavs         enable AVS encoding via xavs [no]
  --enable-libxavs2        enable AVS2 encoding via xavs2 [no]
  --enable-libxcb          enable X11 grabbing using XCB [autodetect]
  --enable-libxcb-shm      enable X11 grabbing shm communication [autodetect]
  --enable-libxcb-xfixes   enable X11 grabbing mouse rendering [autodetect]
  --enable-libxcb-shape    enable X11 grabbing shape rendering [autodetect]
  --enable-libxvid         enable Xvid encoding via xvidcore,
                           native MPEG-4/Xvid encoder exists [no]
  --enable-libxml2         enable XML parsing using the C library libxml2, needed
                           for dash demuxing support [no]
  --enable-libzimg         enable z.lib, needed for zscale filter [no]
  --enable-libzmq          enable message passing via libzmq [no]
  --enable-libzvbi         enable teletext support via libzvbi [no]
  --enable-lv2             enable LV2 audio filtering [no]
  --disable-lzma           disable lzma [autodetect]
  --enable-decklink        enable Blackmagic DeckLink I/O support [no]
  --enable-mbedtls         enable mbedTLS, needed for https support
                           if openssl, gnutls or libtls is not used [no]
  --enable-mediacodec      enable Android MediaCodec support [no]
  --enable-mediafoundation enable encoding via MediaFoundation [auto]
  --enable-libmysofa       enable libmysofa, needed for sofalizer filter [no]
  --enable-openal          enable OpenAL 1.1 capture support [no]
  --enable-opencl          enable OpenCL processing [no]
  --enable-opengl          enable OpenGL rendering [no]
  --enable-openssl         enable openssl, needed for https support
                           if gnutls, libtls or mbedtls is not used [no]
  --enable-pocketsphinx    enable PocketSphinx, needed for asr filter [no]
  --disable-sndio          disable sndio support [autodetect]
  --disable-schannel       disable SChannel SSP, needed for TLS support on
                           Windows if openssl and gnutls are not used [autodetect]
  --disable-sdl2           disable sdl2 [autodetect]
  --disable-securetransport disable Secure Transport, needed for TLS support
                           on OSX if openssl and gnutls are not used [autodetect]
  --enable-vapoursynth     enable VapourSynth demuxer [no]
  --enable-vulkan          enable Vulkan code [no]
  --disable-xlib           disable xlib [autodetect]
  --disable-zlib           disable zlib [autodetect]

  The following libraries provide various hardware acceleration features:
  --disable-amf            disable AMF video encoding code [autodetect]
  --disable-audiotoolbox   disable Apple AudioToolbox code [autodetect]
  --enable-cuda-nvcc       enable Nvidia CUDA compiler [no]
  --disable-cuda-llvm      disable CUDA compilation using clang [autodetect]
  --disable-cuvid          disable Nvidia CUVID support [autodetect]
  --disable-d3d11va        disable Microsoft Direct3D 11 video acceleration code [autodetect]
  --disable-dxva2          disable Microsoft DirectX 9 video acceleration code [autodetect]
  --disable-ffnvcodec      disable dynamically linked Nvidia code [autodetect]
  --enable-libdrm          enable DRM code (Linux) [no]
  --enable-libmfx          enable Intel MediaSDK (AKA Quick Sync Video) code via libmfx [no]
  --enable-libnpp          enable Nvidia Performance Primitives-based code [no]
  --enable-mmal            enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no]
  --disable-nvdec          disable Nvidia video decoding acceleration (via hwaccel) [autodetect]
  --disable-nvenc          disable Nvidia video encoding code [autodetect]
  --enable-omx             enable OpenMAX IL code [no]
  --enable-omx-rpi         enable OpenMAX IL code for Raspberry Pi [no]
  --enable-rkmpp           enable Rockchip Media Process Platform code [no]
  --disable-v4l2-m2m       disable V4L2 mem2mem code [autodetect]
  --disable-vaapi          disable Video Acceleration API (mainly Unix/Intel) code [autodetect]
  --disable-vdpau          disable Nvidia Video Decode and Presentation API for Unix code [autodetect]
  --disable-videotoolbox   disable VideoToolbox code [autodetect]

Toolchain options:
  --arch=ARCH              select architecture []	//选择架构
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
  --cross-prefix=PREFIX    use PREFIX for compilation tools []	//为编译工具使用前缀(就是让它知道你的编译工具链在哪)
  --progs-suffix=SUFFIX    program name suffix []
  --enable-cross-compile   assume a cross-compiler is used
  --sysroot=PATH           root of cross-build tree
  --sysinclude=PATH        location of cross-build system headers
  --target-os=OS           compiler targets OS []
  --target-exec=CMD        command to run executables on target
  --target-path=DIR        path to view of build directory on target
  --target-samples=DIR     path to samples directory on target
  --tempprefix=PATH        force fixed dir/prefix instead of mktemp for checks
  --toolchain=NAME         set tool defaults according to NAME
                           (gcc-asan, clang-asan, gcc-msan, clang-msan,
                           gcc-tsan, clang-tsan, gcc-usan, clang-usan,
                           valgrind-massif, valgrind-memcheck,
                           msvc, icl, gcov, llvm-cov, hardened)
  --nm=NM                  use nm tool NM [nm -g]
  --ar=AR                  use archive tool AR [ar]
  --as=AS                  use assembler AS []
  --ln_s=LN_S              use symbolic link tool LN_S [ln -s -f]
  --strip=STRIP            use strip tool STRIP [strip]
  --windres=WINDRES        use windows resource compiler WINDRES [windres]
  --x86asmexe=EXE          use nasm-compatible assembler EXE [nasm]
  --cc=CC                  use C compiler CC [gcc]
  --cxx=CXX                use C compiler CXX [g++]
  --objcc=OCC              use ObjC compiler OCC [gcc]
  --dep-cc=DEPCC           use dependency generator DEPCC [gcc]
  --nvcc=NVCC              use Nvidia CUDA compiler NVCC or clang []
  --ld=LD                  use linker LD []
  --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [pkg-config]
  --pkg-config-flags=FLAGS pass additional flags to pkgconf []
  --ranlib=RANLIB          use ranlib RANLIB [ranlib]
  --doxygen=DOXYGEN        use DOXYGEN to generate API doc [doxygen]
  --host-cc=HOSTCC         use host C compiler HOSTCC
  --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
  --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
  --host-ld=HOSTLD         use host linker HOSTLD
  --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
  --host-extralibs=HLIBS   use libs HLIBS when linking for host
  --host-os=OS             compiler host OS []	//编译器主机操作系统
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS []
  --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS []
  --extra-objcflags=FLAGS  add FLAGS to OBJCFLAGS []
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS []
  --extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS []
  --extra-ldsoflags=ELDFLAGS add ELDFLAGS to LDSOFLAGS []
  --extra-libs=ELIBS       add ELIBS []
  --extra-version=STRING   version string suffix []
  --optflags=OPTFLAGS      override optimization-related compiler flags
  --nvccflags=NVCCFLAGS    override nvcc flags []
  --build-suffix=SUFFIX    library name suffix []
  --enable-pic             build position-independent code	//构建位置无关代码(?)
  --enable-thumb           compile for Thumb instruction set
  --enable-lto             use link-time optimization
  --env="ENV=override"     override the environment variables

Advanced options (experts only):
  --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
  --custom-allocator=NAME  use a supported custom allocator
  --disable-symver         disable symbol versioning
  --enable-hardcoded-tables use hardcoded tables instead of runtime generation
  --disable-safe-bitstream-reader
                           disable buffer boundary checking in bitreaders
                           (faster, but may crash)
  --sws-max-filter-size=N  the max filter size swscale uses [256]

Optimization options (experts only):
  --disable-asm            disable all assembly optimizations
  --disable-altivec        disable AltiVec optimizations
  --disable-vsx            disable VSX optimizations
  --disable-power8         disable POWER8 optimizations
  --disable-amd3dnow       disable 3DNow! optimizations
  --disable-amd3dnowext    disable 3DNow! extended optimizations
  --disable-mmx            disable MMX optimizations
  --disable-mmxext         disable MMXEXT optimizations
  --disable-sse            disable SSE optimizations
  --disable-sse2           disable SSE2 optimizations
  --disable-sse3           disable SSE3 optimizations
  --disable-ssse3          disable SSSE3 optimizations
  --disable-sse4           disable SSE4 optimizations
  --disable-sse42          disable SSE4.2 optimizations
  --disable-avx            disable AVX optimizations
  --disable-xop            disable XOP optimizations
  --disable-fma3           disable FMA3 optimizations
  --disable-fma4           disable FMA4 optimizations
  --disable-avx2           disable AVX2 optimizations
  --disable-avx512         disable AVX-512 optimizations
  --disable-aesni          disable AESNI optimizations
  --disable-armv5te        disable armv5te optimizations
  --disable-armv6          disable armv6 optimizations
  --disable-armv6t2        disable armv6t2 optimizations
  --disable-vfp            disable VFP optimizations
  --disable-neon           disable NEON optimizations
  --disable-inline-asm     disable use of inline assembly
  --disable-x86asm         disable use of standalone x86 assembly
  --disable-mipsdsp        disable MIPS DSP ASE R1 optimizations
  --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
  --disable-msa            disable MSA optimizations
  --disable-msa2           disable MSA2 optimizations
  --disable-mipsfpu        disable floating point MIPS optimizations
  --disable-mmi            disable Loongson SIMD optimizations
  --disable-fast-unaligned consider unaligned accesses slow

Developer options (useful when working on FFmpeg itself):
  --disable-debug          disable debugging symbols
  --enable-debug=LEVEL     set the debug level []
  --disable-optimizations  disable compiler optimizations
  --enable-extra-warnings  enable more compiler warnings
  --disable-stripping      disable stripping of executables and shared libraries
  --assert-level=level     0(default), 1 or 2, amount of assertion testing,
                           2 causes a slowdown at runtime.
  --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data
  --valgrind=VALGRIND      run "make fate" tests through valgrind to detect memory
                           leaks and errors, using the specified valgrind binary.
                           Cannot be combined with --target-exec
  --enable-ftrapv          Trap arithmetic overflows
  --samples=PATH           location of test samples for FATE, if not set use
                           $FATE_SAMPLES at make invocation time.
  --enable-neon-clobber-test check NEON registers for clobbering (should be
                           used only for debugging purposes)
  --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                           should be used only for debugging purposes)
  --enable-random          randomly enable/disable components
  --disable-random
  --enable-random=LIST     randomly enable/disable specific components or
  --disable-random=LIST    component groups. LIST is a comma-separated list
                           of NAME[:PROB] entries where NAME is a component
                           (group) and PROB the probability associated with
                           NAME (default 0.5).
  --random-seed=VALUE      seed value for --enable/disable-random
  --disable-valgrind-backtrace do not print a backtrace under Valgrind
                           (only applies to --disable-optimizations builds)
  --enable-ossfuzz         Enable building fuzzer tool
  --libfuzzer=PATH         path to libfuzzer
  --ignore-tests=TESTS     comma-separated list (without "fate-" prefix
                           in the name) of tests whose result is ignored
  --enable-linux-perf      enable Linux Performance Monitor API
  --disable-large-tests    disable tests that use a large amount of memory

NOTE: Object files are built at the place where configure is launched.
[yg@ubuntu /arnold_test/20220105_crossCompile_x264_ffmpeg/ffmpeg/ffmpeg-4.4]13$ 

然后撰写arnold_run.sh,同时新建文件夹arnold_build,在arnold_run.sh中填入:

一开始的配置(弃用)
arnold_run.sh

#!/bin/sh

./configure \

        --prefix=/arnold_test/20220105_crossCompile_x264_ffmpeg/ffmpeg/ffmpeg-4.4/arnold_build \

        --enable-filters   \

        --enable-asm \

        --enable-ffmpeg \

        --enable-ffplay \

        --enable-ffprobe \

        --enable-doc \

        --enable-cross-compile \

        --cross-prefix=/home/yg/rv/sdk/rv1.8/rv1126_rv1109/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- \

        --arch=aarch64 \armhf

        --target-os=linux \

        --host-os=linux \

        --enable-gpl \

        --enable-version3 \

        --enable-small \

        --enable-shared \

        --enable-static \

        --enable-encoder=rawvideo \

        --enable-encoder=mpeg2video \

        --enable-encoder=mp2 \

        --enable-encoder=libx264 \

        --enable-libx264 \

        --enable-muxer=adts \

        --enable-muxer=mpegts \

        --enable-muxer=mpeg2video \

        --enable-muxer=rtsp \

        --enable-muxer=hls \

        --enable-muxer=h264 \

        --enable-muxer=rtp \

        --enable-muxer=avi \

        --enable-muxer=flv \

        --enable-muxer=mp4 \

        --enable-demux

新配置(参考:Linux下交叉编译FFMPEG与X264库:目标板友善之臂Tiny4412开发板_EXYNOS4412(ARMV7_32位))
(注意其中链接x264头文件和库目录,,,其实到时ffmpeg运行的时候也得把x264的动态库文件给弄进去,不然ffmpeg找不到x264的动态库文件也会报错)

arnold_run.sh

#!/bin/sh

./configure \
--enable-shared \
--enable-static \
--prefix=/arnold_test/20220105_crossCompile_x264_ffmpeg/ffmpeg/ffmpeg-4.4/arnold_build \
--cross-prefix=/home/yg/rv/sdk/rv1.8/rv1126_rv1109/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- \
--arch=arm \
--target-os=linux \
--enable-gpl \
--extra-cflags=-I/arnold_test/20220105_crossCompile_x264_ffmpeg/x264/arnold_build/include \
--extra-ldflags=-L/arnold_test/20220105_crossCompile_x264_ffmpeg/x264/arnold_build/lib \
--enable-ffmpeg \
--enable-libx264

然后make && make install,一切顺利,就是最后出来的lib文件有点大,总共200多兆
在这里插入图片描述
然后我们将ffmpeg二进制文件拷贝到arm的/opt/ffmpeg目录下,执行./ffmpeg -h发现提示缺少库文件,然后我们创建lib文件夹,并将它添加到环境变量的搜索库目录

(提示缺少库文件)

[root@RV1126_RV1109:/opt/ffmpeg]# ./ffmpeg -h
./ffmpeg: error while loading shared libraries: libpostproc.so.55: cannot open shared object file: No such file or directory
[root@RV1126_RV1109:/opt/ffmpeg]# 

(创建lib目录)
在这里插入图片描述
(添加环境变量库搜索路径,参考:linux armv7_32环境变量配置(LD_LIBRARY_PATH 库搜索路径)
在这里插入图片描述
(执行source /etc/profile让环境变量生效)

[root@RV1126_RV1109:/opt/ffmpeg]# source /etc/profile
[root@RV1126_RV1109:/opt/ffmpeg]# 

然后运行提示缺哪个库文件,就用xftp从我们交叉编译生成的lib目录里拷贝哪个进去

对了,那个前面编译生成的libx264的库文件也要拷进去(我也没管缺哪个,静态库动态库,三个都拷进去了)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

还没拷贝完呢,我们的命令就能运行了

[root@RV1126_RV1109:/opt/ffmpeg]# ./ffmpeg -i 1e1fee9790f26fa3_202214225310.h264 -vcodec copy -f mp4 test.mp4

在这里插入图片描述

...
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58.  5.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  3.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, h264, from '1e1fee9790f26fa3_202214225310.h264':
  Duration: N/A, bitrate: N/A
  Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1920x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc
File 'test.mp4' already exists. Overwrite? [y/N] y
Output #0, mp4, to 'test.mp4':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, q=2-31, 25 fps, 25 tbr, 1200k tbn, 1200k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[mp4 @ 0x60170] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
frame=  150 fps=0.0 q=-1.0 Lsize=    1451kB time=00:00:05.96 bitrate=1994.0kbits/s speed= 289x     
video:1449kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.098579%
[root@RV1126_RV1109:/opt/ffmpeg]# 

然后转换后的视频也能方到浏览器运行了,没有编码问题
在这里插入图片描述

Logo

更多推荐