交叉编译ffmpeg-4.2.2

2023-05-16

最近想弄个USB camera, 测试下视频功能。看到网上推荐使用FFmpeg这个开源工具。
FFmpeg: A complete, cross-platform solution to record, convert and stream audio and video.
官网地址: http://ffmpeg.org/
下载最新的 FFmpeg 4.2.2源码。参考了其他文章,FFmpeg编译还需要以下3个开源库:
1)x264  -- library and application for encoding video streams into the H.264/MPEG-4 AVC compression format
官网地址: http://www.videolan.org/developers/x264.html

2)YASM  -- a complete rewrite of the NASM assembler
官网地址:http://yasm.tortall.net/ 

3)SDL2 --  Simple DirectMedia Layer
官网地址:http://www.libsdl.org/index.php
 

在编译之前,准备好交叉工具链, 初始化编译工具交叉变量 CROSS_COMPILE
推荐用绝对路径:
  export CROSS_COMPILE=/home/golden/gcc/usr/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi-
  export CC=${CROSS_COMPILE}gcc

也可以 export  CROSS_COMPILE=arm-oe-linux-gnueabi-  ,但在后续编译过程中,会经常遇到类似的错误:

INSTALL	libavdevice/libavdevice.so
STRIP	install-libavdevice-shared
/bin/sh: 1: arm-oe-linux-gnueabi-strip: not found
make: *** [ffbuild/library.mak:104: install-libavdevice-shared] Error 127

解决办法就是需要手动用绝对路径代替,
./ffbuild/config.mak~:STRIP=arm-oe-linux-gnueabi-strip 
./ffbuild/config.mak:STRIP=/home/golden/gcc/usr/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi-strip
 

源码编译

1) 编译x264

# wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2
# tar xvjf  x264-master.tar.bz2  
# cd x264-master
# ./configure --host=arm-linux --prefix=/usr/local/x264-arm --enable-shared --enable-debug --disable-asm

接下来,打上下面的patch

diff --git a/Makefile~ b/Makefile
index efc863f..2ad60af 100644
--- a/Makefile~
+++ b/Makefile
@@ -243,7 +243,7 @@ lib-shared: $(SONAME)
 
 $(LIBX264): $(GENERATED) .depend $(OBJS) $(OBJASM)
 	rm -f $(LIBX264)
-	$(AR)$@ $(OBJS) $(OBJASM)
+	$(AR) $@ $(OBJS) $(OBJASM)
 	$(if $(RANLIB), $(RANLIB) $@)
 
 $(SONAME): $(GENERATED) .depend $(OBJS) $(OBJASM) $(OBJSO)

diff --git a/config.mak~ b/config.mak
index f10ce66..5eaa865 100644
--- a/config.mak~
+++ b/config.mak
@@ -6,7 +6,7 @@ libdir=${exec_prefix}/lib
 includedir=${prefix}/include
 SYS_ARCH=ARM
 SYS=LINUX
-CC=gcc
+CC?=${CROSS_COMPILE}gcc
 CFLAGS=-Wno-maybe-uninitialized -Wshadow -O1 -g  -Wall -I. -I$(SRCPATH) -std=gnu99 -D_GNU_SOURCE -fPIC -fno-tree-vectorize -fvisibility=hidden
 CFLAGSSO= -DX264_API_EXPORTS
 CFLAGSCLI=
@@ -14,13 +14,13 @@ COMPILER=GNU
 COMPILER_STYLE=GNU
 DEPMM=-MM -g0
 DEPMT=-MT
-LD=gcc -o 
+LD=${CROSS_COMPILE}gcc -o 
 LDFLAGS= -lm -lpthread -ldl
 LDFLAGSCLI=-ldl 
 LIBX264=libx264.a
 CLI_LIBX264=$(LIBX264)
-AR=gcc-ar rc 
-RANLIB=gcc-ranlib
+AR=${CROSS_COMPILE}gcc-ar rc 
+RANLIB=${CROSS_COMPILE}gcc-ranlib
 STRIP=strip
 INSTALL=install
 AS=

# make
# make install

2) 编译YASM

# wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
# tar xvzf yasm-1.3.0.tar.gz
# cd yasm-1.3.0
# ./configure  --prefix=/usr/local/ --host=arm-linux
# make
# make install

3) 编译SDL2

# wget http://www.libsdl.org/release/SDL2-2.0.12.tar.gz
# tar xvzf SDL2-2.0.12.tar.gz
# cd SDL2-2.0.12
# ./configure --prefix=/usr/local/ --host=arm-linux --target=arm-linux
# make
# make install

4) 最后编译FFmpeg

# wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2
# tar xvjf ffmpeg-4.2.2.tar.bz2
# cd ffmpeg-4.2.2
# ./configure --cross-prefix=$CROSS_COMPILE --enable-cross-compile --target-os=linux --cc="$CC" --arch=arm --prefix=/usr/local/arm_ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-swscale --enable-pthreads --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-yasm   --enable-ffmpeg --enable-ffplay --enable-sdl2 

关于这一步,如果你不加上最后“ --enable-sdl2” ,那么编译出来后, 只有ffmpeg  ffprobe, 是没有ffplay,  之前网上其他文章说修改config.mak文件的CONFIG_FFPLAY宏, 在4.2.2版本上,行不通,首先文件跑到 ffbuild/config.mak中了,另外还有config.h也得改,最终一点是ffplay依赖sdl2库:
    configure:ffplay_deps="avcodec avformat swscale swresample sdl2"
这一步,报过一个错误:  ERROR: sdl2 requested but not found
 这是因为configure文件中SDL2_CONFIG定义无效,
     if enabled sdl2; then
        SDL2_CONFIG="${cross_prefix}sdl2-config"
        test_pkg_config sdl2 "sdl2 >= 2.0.1 sdl2 < 2.1.0" SDL_events.h SDL_PollEvent
        if disabled sdl2 && "${SDL2_CONFIG}" --version > /dev/null 2>&1; then
我的做法就是添加一个链接:
#  which sdl2-config
/usr/local/bin/sdl2-config
# sudo  ln -s sdl2-config /usr/local/bin/arm-oe-linux-gnueabi-sdl2-confi

# make
# make install


最后编译出来的结果,就在 /usr/local/arm_ffmpeg/。

这里提一点, ./configure配置这一步,千万不要加上 --disable-stripping  
否则编译出来的大小和内存要求,超乎你的想象,一张对比图

将bin 和lib目录下的内容分别复制到板子中的/usr/bin 、/usr/lib中,除此之外,不要忘了也要把SDL2.so也复制到/usr/lib,
如果发现so过大,也可以用strip命令裁剪掉冗余。

这样就可以测试ffmpeg了
# ffmpeg -f video4linux2 -s 640x480 -i /dev/video0 /data/test.avi     录制视频
# ffmpeg -i /dev/video0  -r 1 -f image2  image-%3d.jpg   截图,以1PFS的速度保存成JPEG图片 imag-001.jpg image-002....
# ffplay -i /dev/video0     实时视频
# ffplay -i /data/test.avi   播放视频

参考文章: https://mp.csdn.net/console/editor/html/104897666
FFmpeg/FFplay使用: https://blog.csdn.net/weixin_38513602/article/details/85165023

 

性能测试

root@mdm9607:/data# ffmpeg -f video4linux2 -s 640x480 -i /dev/video0 /data/test.

avi
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 6.4.0 (GCC)
  configuration: --cross-prefix=arm-oe-linux-gnueabi- --enable-cross-compile --t
arget-os=linux --cc='arm-oe-linux-gnueabi-gcc -march=armv7-a -marm -mfpu=neon -m
float-abi=hard' --arch=arm --prefix=/usr/local/arm_ffmpeg --enable-shared --disa
ble-static --enable-gpl --enable-nonfree --enable-swscale --enable-pthreads --di
sable-armv5te --disable-armv6 --disable-armv6t2 --disable-yasm --enable-sdl2 --d
isable-lzma
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 6541.122738, bitrate: 147456 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 k
b/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
File '/data/test.avi' already exists. Overwrite ? [y/N] y
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> mpeg4 (native))
Press [q] to stop, [?] for help
Output #0, avi, to '/data/test.avi':
  Metadata:
    ISFT            : Lavf58.29.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 640x480, q=2-31, 200
 kb/s, 30 fps, 30 tbn, 30 tbc
    Metadata:
      encoder         : Lavc58.54.100 mpeg4
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
frame=   10 fps=0.0 q=2.3 size=       6kB time=00:00:02.43 bitrate=  18.7kbits/s
frame=   21 fps= 19 q=2.7 size=       6kB time=00:00:02.90 bitrate=  15.7kbits/s
frame=   35 fps= 21 q=2.7 size=       6kB time=00:00:03.43 bitrate=  13.2kbits/s
frame=   45 fps= 21 q=2.2 size=       6kB time=00:00:03.83 bitrate=  11.8kbits/s
frame=   60 fps= 22 q=2.7 size=       6kB time=00:00:04.43 bitrate=  10.2kbits/s
frame=   70 fps= 22 q=2.6 size=       6kB time=00:00:04.83 bitrate=   9.4kbits/s
frame=   85 fps= 23 q=2.5 size=       6kB time=00:00:05.43 bitrate=   8.4kbits/s
frame=   95 fps= 22 q=2.5 size=       6kB time=00:00:05.83 bitrate=   7.8kbits/s
frame=  107 fps= 22 q=2.6 size=       6kB time=00:00:06.33 bitrate=   7.2kbits/s
frame=  117 fps= 22 q=2.7 size=       6kB time=00:00:06.73 bitrate=   6.7kbits/s
frame=  133 fps= 23 q=2.4 size=       6kB time=00:00:07.36 bitrate=   6.2kbits/s
frame=  145 fps= 23 q=2.1 size=       6kB time=00:00:07.83 bitrate=   5.8kbits/s
frame=  160 fps= 23 q=2.7 size=       6kB time=00:00:08.46 bitrate=   5.4kbits/s
frame=  172 fps= 23 q=2.9 size=       6kB time=00:00:08.93 bitrate=   5.1kbits/s
frame=  186 fps= 24 q=2.5 size=       6kB time=00:00:09.50 bitrate=   4.8kbits/s
frame=  200 fps= 24 q=2.7 size=     262kB time=00:00:10.03 bitrate= 213.5kbits/s
frame=  213 fps= 24 q=2.8 size=     262kB time=00:00:10.56 bitrate= 202.8kbits/s
frame=  229 fps= 24 q=2.1 size=     262kB time=00:00:11.20 bitrate= 191.3kbits/s
frame=  239 fps= 24 q=2.5 size=     262kB time=00:00:11.60 bitrate= 184.7kbits/s
frame=  254 fps= 24 q=2.7 size=     262kB time=00:00:12.20 bitrate= 175.6kbits/s
frame=  265 fps= 24 q=1.9 size=     262kB time=00:00:12.63 bitrate= 169.6kbits/s
frame=  280 fps= 24 q=2.8 size=     262kB time=00:00:13.23 bitrate= 161.9kbits/s
frame=  290 fps= 24 q=2.6 size=     262kB time=00:00:13.66 bitrate= 156.8kbits/s
frame=  304 fps= 24 q=3.2 size=     262kB time=00:00:14.20 bitrate= 150.9kbits/s
frame=  315 fps= 24 q=3.2 size=     262kB time=00:00:14.63 bitrate= 146.4kbits/s
frame=  328 fps= 24 q=2.9 size=     262kB time=00:00:15.16 bitrate= 141.3kbits/s
frame=  341 fps= 24 q=3.4 size=     262kB time=00:00:15.70 bitrate= 136.5kbits/s
frame=  352 fps= 24 q=3.2 size=     262kB time=00:00:16.13 bitrate= 132.8kbits/s
frame=  366 fps= 24 q=3.0 size=     262kB time=00:00:16.70 bitrate= 128.3kbits/s
frame=  379 fps= 24 q=2.8 size=     262kB time=00:00:17.20 bitrate= 124.6kbits/s
frame=  395 fps= 24 q=2.7 size=     262kB time=00:00:17.86 bitrate= 119.9kbits/s
frame=  407 fps= 24 q=2.9 size=     518kB time=00:00:18.33 bitrate= 231.3kbits/s
frame=  423 fps= 24 q=3.3 size=     518kB time=00:00:18.96 bitrate= 223.5kbits/s
frame=  436 fps= 24 q=3.1 size=     518kB time=00:00:19.50 bitrate= 217.4kbits/s
frame=  452 fps= 24 q=2.7 size=     518kB time=00:00:20.13 bitrate= 210.6kbits/s
frame=  464 fps= 24 q=2.6 size=     518kB time=00:00:20.60 bitrate= 205.8kbits/s
frame=  480 fps= 25 q=2.8 size=     518kB time=00:00:21.26 bitrate= 199.4kbits/s
frame=  491 fps= 24 q=2.9 size=     518kB time=00:00:21.70 bitrate= 195.4kbits/s
frame=  506 fps= 25 q=3.1 size=     518kB time=00:00:22.30 bitrate= 190.1kbits/s
frame=  517 fps= 24 q=2.5 size=     518kB time=00:00:22.73 bitrate= 186.5kbits/s
 speed=1.08x

内存消耗:  43.4MB 
ROM空间: 16.9MB   (stripped)
CPU Loading:   cat /proc/loadavg(armv7/1.2GHz单核)
     1.35 1.54 1.52 1/394 10703   运行前
     1.58 1.59 1.54 2/394 11321   运行2分钟后

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

交叉编译ffmpeg-4.2.2 的相关文章

随机推荐

  • Android屏幕适配dp、px两套解决办法

    最新最全文章 2018 08 25 xff1a Android dp方式的屏幕适配 原理 后期补充完整讲解 手机dp输出是横屏还是竖屏 android阿杜的博客 CSDN博客 又是屏幕适配 xff0c 这类文章网上不是很多了吗 xff1f
  • Android项目构建变体不能切换打包debug模式和release模式

    Android项目build variants不能切换打包debug模式和release模式 xff0c 不能切换active abi类型 我的项目发现的原因 xff1a 就是项目文件夹名称 xff0c 和包名不同 xff0c 如包名写的是
  • Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: ... has no certificates at entry AndroidManifest.xml]

    很长一段时间都用快速打包 packer ng plugin xff0c 没注意到底用Android Studio打包会有什么区别 xff0c 今天写了个demo xff0c 居然发现我输入了签名之后只有一次是安装成功的 xff0c 后边都是
  • Mac顶部菜单栏(Menubar)卡死

    升级了Mojave后 xff0c Mac pro 2015 early 顶部菜单栏经常卡死 重启菜单栏 xff08 Menubar xff09 笔者接下来分享两种常见的重启菜单栏的方法 方法一 xff1a 使用活动监视器 打开 OS X 预
  • 计算机专业术语大全(中~英文版)

    AGP Accelerated Graphics Port xff0d 图形加速接口 Access Time xff0d 存取时间 Address 地址 ANSI American National Standards Institute
  • hdfs 的启动

    xff08 1 xff09 先配置文件 修改 core site xml 如下 修改 hdfs site xml 如下 xff1a lt configuration gt lt property gt lt name gt dfs repl
  • Matlab并行化计算

    Matlab并行化计算及GPU计算教程 前置要求和设置 要求电脑CPU有超过2个核心 xff0c 内存大于2G 建议先调试好代码 xff0c 再进行并行化计算 查看并行化计算工具箱版本 gt gt gt ver parallel MATLA
  • 程序员怎么写情书

    今天 xff0c 我们再写一封情书去求爱 Dear xff0c 99669999996669999996699666699666999966699666699 9969999999969999999969966669966996699669
  • 解包Android的boot.img

    我們知道Adnroid的Boot img包其實就是就是把kernel和ramdisk img再加一個page的頭碼成的 其結構就如下所示 43 43 boot header 1 page 43 43 kernel n pages 43 43
  • 制作自己的个人博客网站

    拥有一个私人的博客是一件很酷的事情 xff0c 私以为有想法的同学都应该有个博客 xff0c 就像日记一样 xff0c 写写自己的经历 xff0c 感悟等 我也在B站上花费了好多时间 xff0c 终于找到了一个特别简单易行的 xff0c 感
  • 利用shell模拟linux远程登陆

    目录 1前期准备 2编写shell脚本 3测试 最近几天学习了redis及shell脚本开发 xff0c 突然想到写一个shell脚本模拟linux远程登录 前期准备 在redis中创建用户信息 设置用户账号及密码 hset account
  • DirectX修复教程

    DirectX修复教程 问题 当我们玩游戏 xff08 如绝地求生 极品飞车 FIFA等 xff09 或使用工业软件 xff08 如3ds Max Maya Autodesk系列等 xff09 时 xff0c 可能会遇到0xc000007b
  • Vue[eslint-rules配置]:解决Vue中 eslint 语法检测报错或报错改成警告 // eslint-disable-next-line to ignore the next line.

    Es lint语法严格 很多时候 在Vue中本身不应该是错的写法 在es lint下会保证代码的严谨性友好的给一个error错误 如v for的 key等 解决方法 在package json中对eslintConfig进行配置 即修改或新
  • C语言——生产者消费者问题

    百度文献查看原文 核心代码 xff1a span class token macro property span class token directive keyword include span span class token str
  • virtualbox headless 安装使用 后台运行

    公司配备的电脑太烂了 xff0c DDR2的主机简直没法说 xff0c 安装好mint xff0c 再启动eclipse基本什么其他想法都不要有了 xff0c 只好想办法扩展计算机的能力了 xff0c 还好手头有个测试server可以使用
  • windows10升级windows11后微信等软件无法连接网络

    1 同时按住 win 43 X 快捷键 xff0c 选择windows powerShell xff08 管理员 xff09 命令提示符 xff08 管理员 xff09 xff0c 会出现第二步骤页面 2 在出现的页面输入 netsh wi
  • smb连接错误“请检查服务器名称或IP地址,然后再试一次,如果问题持续发生,请联系系统管理员“

    问题 公司内部的共享服务器突然访问不了了 xff08 iMac访问Windows共享 xff09 提示错误 请检查服务器名称或IP地址 xff0c 然后再试一次 xff0c 如果问题持续发生 xff0c 请联系系统管理员 经过试验 xff0
  • [Simple] 洗牌算法

    题目要求 xff1a 平时洗牌是两打牌 xff0c 交叉洗在一起 也就是开始 1 2 3 4 5 6 7 8 第一次 1 5 2 6 3 7 4 8 第二次 1 3 5 7 2 4 6 8 第k次 给你一个数组a 2N xff0c 要求在O
  • [转]Risc-V简要概括

    Risc V简要概括 1 Risc V硬件平台术语 一个RiscV硬件平台可以包含一个或多个RiscV兼容的核心 其它非RiscV兼容的核心 固定功能的加速器 各种物理存储器结构 I O设备以及允许这些部件相互连通的互联结构 比如下面的Si
  • 交叉编译ffmpeg-4.2.2

    最近想弄个USB camera xff0c 测试下视频功能 看到网上推荐使用FFmpeg这个开源工具 FFmpeg A complete cross platform solution to record convert and strea