Ubuntu16.04下交叉编译ffmpeg

左手的ㄟ右手 2022-05-31 23:50 503阅读 0赞

目录

  • 目录
  • 前言
  • x264和x265库
  • SDL
  • FFmpeg的编译选项

    • FFmpeg的交叉编译
    • Ubuntu1604下编译FFmpeg
  • 总结
  • 参考链接

前言

因为项目有需求,需要用到ffmepg。所以就只能硬着头皮开始新的学习之路,搭建好环境是最基本的了!
学习!分享!感谢!

x264和x265库

H.264是ITU(International Telecommunication Union,国际通信联盟)和MPEG(Motion Picture Experts Group,运动图像专家组)联合制定的视频编码标准。而x264是一个开源的H.264/MPEG-4 AVC**视频编码函数库,是最好的有损视频编码器。**——百度百科

同样的片源、码率1、编码器默认设置下,用x264编码的视频(一般是mkv或mp4格式)一定会比rmvb画质更好。x264是一种编码方式。

x265是一个用于编码,符合高效率视频编码(HEVC/H.265)标准的视频开源自由软件及函数库。

由上可知,x264和x265库主要是用来给视频编码的,而博主暂时的工作只是接收网络流,然后解码处理,所以就不添加x264和x265库的需要了!

SDL

SDL(Simple DirectMdeia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输入输出的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台的应用软件。

FFmpeg的编译选项

感觉基本像这种跨平台的项目,都会提供./configure --help来查看编译选项。然后在网上搜索,会发现很多博主都讲解的这一部分。ffmpeg编译选项汇总。本人使用的是ffmpeg-3.4.1.tar.xz
这里我记录一下我编译时用到的编译选项:

  1. --prefix=PREFIX // 安装程序到指定目录
  2. --enable-shared // 构建共享库(默认关闭)
  3. --enable-gpl // 允许使用GPL代码 由此产生的库文件和二进制文件将在GPL下
  4. --cross-prefix=PREFIX // 为编译工具指定路径
  5. --enable-cross-compile // 使能交叉编译
  6. --extra-cflags=ECFLAGS // 指定额外的cflags
  7. e.g:-I/xxx/xxx/include
  8. --extra-ldflags=ELDFLAGS // 指定额外的ldflags
  9. e.g:-L/xxx/xxx/lib
  10. --extra-libs=-ldl
  11. --disable-yasm // 禁用yasm汇编程序
  12. --enable-pthreads // 使能多线程,默认关闭

FFmpeg的交叉编译

  • 编译环境
    桌面环境:Ubuntu16.04
    交叉编译工具链:arm-linux-gnueabihf-gcc
  • 编译命令:

    ./configure —prefix=/grapeRain/grape_ffmpeg —disable-static —enable-shared —disable-x86asm —enable-gpl —enable-nonfree —enable-cross-compile —arch=arm —target-os=linux —cross-prefix=arm-linux-gnueabihf- —cc=arm-linux-gnueabihf-gcc —enable-pthreads —enable-ffplay

出现的警告:

  1. WARNING: The --disable-yasm option is only provided for compatibility and will be removed in the future. Use --enable-x86asm / --disable-x86asm instead.

也就是说,–disable-yasm选项在未来会被移除,使用–enable-x86asm/–disable-x86asm代替。

Ubuntu16.04下编译FFmpeg

执行如下配置命令:

  1. ./configure --prefix=/grapeRain/ubu_ffmpeg --enable-shared --disable-static --enable-ffplay

出现如下:

  1. nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
  2. If you think configure made a mistake, make sure you are using the latest
  3. version from Git. If the latest version fails, report the problem to the
  4. ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
  5. Include the log file "ffbuild/config.log" produced by configure as this will help
  6. solve the problem.

看意思是nasm/yasm包不存在或者很旧,可以使用–disable-x86asm来进行一个不完美的编译。为了完美点,下载了yasm-1.3.0.tar.gz,然后执行如下命令:

  1. tar -xvf yasm-1.3.0.tar.gz
  2. cd yasm-1.3.0/
  3. ./configure
  4. make
  5. make install

然后继续执行配置命令:

  1. ./configure --prefix=/grapeRain/ubu_ffmpeg --enable-shared --disable-static --enable-ffplay
  2. make -j4
  3. make install

编译时成功的,但是在编译后的bin文件夹下没有生成ffplay程序,网上查询说是没有安装SDL库的原因,说是不安装SDL2是没有ffplay的,因为后期要移植到开发板上,不知道会不会需要这一部分。不过下载了SDL2-2.0.7.tar.gz编译试试:

  1. ./autogen.sh
  2. ./configure
  3. make
  4. sudo make install

据说这里还要安装一些库如:sudo apt-get install libsdl1.2-dev,不过我已经安装了,之后在生成的bin目录下,也有ffplay。
但是在运行ffmpeg等可执行程序时出现如下错误:

  1. ./ffmpeg: error while loading shared libraries: libavdevice.so.57: cannot open shared object file: No such file or directory

也就是找不到(libavdevice.so.57)这个动态库。
使用find或者locate可以在/xxx/ubu_ffmpeg/lib中找到这个动态库,链接到/etc/ld.so.conf即可,具体过程:

  1. sudo vi /etc/ld.so.conf.d/ffmpeg.conf # ffmpeg.conf是我自己建了的.conf文件
  2. # 在conf文件中加入如下
  3. /xxx/ubu_ffmpeg/lib
  4. # 最后执行
  5. sudo ldconfig

这时候就可以成功使用生成的可执行文件了。不过Ubuntu16.04下自带ffmpeg,所以使用起来还是麻烦一些!

总结

2018/1/26,因为目前FFmpeg只是在Ubuntu下进行了测试而已!没有在开发板上测试,所以对于交叉编译后的库是否可以在开发板上实现和主机相同的效果还未可知,暂时先这样吧!

参考链接

ffmpeg编译选项汇总
Linux下ffmpeg的完整安装
linux下ffmpeg安装


  1. 码率一般指比特率。比特率是指每秒传送的比特(bit)数。单位为bps(Bit Per Second),比特率越高,传送数据速度越快。在数字多媒体领域,比特率是单位时间播放连续的媒体如压缩后的音频或视频的比特数量。在这个意义上讲,它相当于术语数字带宽消耗量或吞吐量。 ↩

发表评论

表情:
评论列表 (有 0 条评论,503人围观)

还没有评论,来说两句吧...

相关阅读