背景

Ffmpeg 中带有h264的解码,没有编码,需要添加x264。libx264是一个自由的H.264编码库,是x264项目的一部分,使用广泛,ffmpeg的H.264实现就是用的libx264。

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。

librtmp用来接收、发布RTMP协议格式的数据。FFmpeg支持RTMP协议,将librtmp编译进去后支持协议RTMPE、RMTPTE、RTMPS。这里我直接使用FFmpeg自带的RTMP功能。

host平台   :Ubuntu 18.04

arm平台   : S5P6818

x264  :20171212

x265  :v2.6

ffmpeg   :4.0.1

arm-gcc   :4.8.1

使用以下脚本一键编译。

  1. ##
  2. # Copyright By Schips, All Rights Reserved
  3. # https://gitee.com/schips/
  4. # File Name: make.sh
  5. # Created : Mon 02 Sep 2019 08:05:53 PM HKT
  6. ##
  7. #!/bin/sh
  8. BASE=`pwd`
  9. BUILD_HOST=arm-linux
  10. OUTPUT_PATH=${BASE}/install
  11. OTHER_LIB=${OUTPUT_PATH}/__all_without_ffmpeg
  12. make_dirs () {
  13. #为了方便管理,创建有关的目录
  14. cd ${BASE} && mkdir compressed install source -p
  15. }
  16. tget () { #try wget
  17. filename=`basename $1`
  18. echo "Downloading [${filename}]..."
  19. if [ ! -f ${filename} ];then
  20. wget $1
  21. fi
  22. echo "[OK] Downloaded [${filename}] "
  23. }
  24. download_package () {
  25. cd ${BASE}/compressed
  26. tget http://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20171212-2245.tar.bz2
  27. tget http://ffmpeg.org/releases/ffmpeg-4.0.1.tar.bz2
  28. tget http://download.videolan.org/videolan/x265/x265_2.6.tar.gz
  29. }
  30. tar_package () {
  31. cd ${BASE}/compressed
  32. ls * > /tmp/list.txt
  33. for TAR in `cat /tmp/list.txt`
  34. do
  35. tar -xf $TAR -C ../source
  36. done
  37. rm -rf /tmp/list.txt
  38. }
  39. make_x264() {
  40. cd ${BASE}/source/x264*
  41. CC=${BUILD_HOST}-gcc \
  42. ./configure \
  43. --host=${BUILD_HOST} \
  44. --enable-shared \
  45. --enable-static \
  46. --enable-pic \
  47. --prefix=${OUTPUT_PATH}/x264 \
  48. --cross-prefix=${BUILD_HOST}- \
  49. --disable-asm
  50. make -j4 && make install
  51. }
  52. make_x265() {
  53. #sudo apt-get install cmake -y
  54. # 其他编译选项可以 通过 在 cmake ../source 以后 ccmake ../source 可以查看 ( ccmake 可以通过 sudo apt-get install cmake-curses-gui 进行安装 )
  55. cd ${BASE}/source/x265*/source
  56. # 获取 工具链所在位置 下面的操作为的是在 CMakeLists.txt 中插入下面内容
  57. GCC_FULL_PATH=`whereis ${BUILD_HOST}-gcc | awk -F: '{ print $2 }' | awk '{print $1}'` # 防止多个结果
  58. GCC_DIR=`dirname ${GCC_FULL_PATH}/`
  59. sed -i "1i\set( CMAKE_SYSTEM_NAME Linux )" CMakeLists.txt
  60. sed -i "2a\set( CMAKE_SYSTEM_PROCESSOR ARM )" CMakeLists.txt
  61. sed -i "2a\set( CMAKE_C_COMPILER ${GCC_DIR}/${BUILD_HOST}-gcc )" CMakeLists.txt
  62. sed -i "2a\set( CMAKE_CXX_COMPILER ${GCC_DIR}/${BUILD_HOST}-g++ )" CMakeLists.txt
  63. sed -i "2a\set( CMAKE_FIND_ROOT_PATH ${GCC_DIR} )" CMakeLists.txt
  64. cmake ../source
  65. # 指定安装路径
  66. sed -i "1i\set( CMAKE_INSTALL_PREFIX "${BASE}/install/x265" )" cmake_install.cmake
  67. make && make install
  68. }
  69. prepare_other_lib () {
  70. # 这一个是针对 ffmpeg 方便管理外部库使用的
  71. # 核心思想是把 所有的库都放到一起,再让 ffmpeg ld的时候在这里找(而不是添加多行) --extra-cflags="-I${X264_DIR}/include -I${xxx}/include" \
  72. cd ${BASE}/install/
  73. rm ${OTHER_LIB} -rf
  74. ls > /tmp/list.txt
  75. mkdir ${OTHER_LIB} -p
  76. for sub_dir in `cat /tmp/list.txt`
  77. do
  78. cp ${sub_dir}/* ${OTHER_LIB} -r -v
  79. done
  80. rm -rf /tmp/list.txt
  81. }
  82. make_ffmpeg() {
  83. cd ${BASE}/source/ffmpeg*
  84. ./configure \
  85. --cross-prefix=${BUILD_HOST}- \
  86. --enable-cross-compile \
  87. --target-os=linux \
  88. --cc=${BUILD_HOST}-gcc \
  89. --arch=arm \
  90. --prefix=${OUTPUT_PATH}/ffmpeg \
  91. --enable-shared \
  92. --enable-static \
  93. --enable-gpl \
  94. --enable-nonfree \
  95. --enable-ffmpeg \
  96. --disable-ffplay \
  97. --enable-ffserver \
  98. --enable-swscale \
  99. --enable-pthreads \
  100. --disable-armv5te \
  101. --disable-armv6 \
  102. --disable-armv6t2 \
  103. --disable-yasm \
  104. --disable-stripping \
  105. --enable-libx264 \
  106. --extra-cflags=-I${OTHER_LIB}/include \
  107. --extra-ldflags=-L${OTHER_LIB}/lib
  108. make clean && make -j4 && make install
  109. }
  110. echo "Using ${BUILD_HOST}-gcc"
  111. make_dirs
  112. download_package
  113. tar_package
  114. make_x264
  115. make_x265
  116. prepare_other_lib
  117. make_ffmpeg

配置完成以后可能会有这个警告,但是不影响后续的结果

  1. License: nonfree and unredistributable
  2. Creating configuration files ...
  3. WARNING: The --disable-yasm option is only provided for compatibility and will be
  4. removed in the future. Use --enable-x86asm / --disable-x86asm instead.
  5. WARNING: unknown architecture linux
  6. WARNING: using libx264 without pkg-config

开发板准备:

拷贝 __all_without_ffmpeg 中的 lib下的所有文件到板子上的/usr/lib 中,同样地,拷贝ffmpeg中的lib到板子上。

测试:

  1. ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 /mnt/tmp/test.avi
  2. # video4linux2 代表Linux下
  3. # /dev/video0 代表摄像头设备
  4. # /mnt/tmp/test.avi代表输出路径

附录:

ffmpeg带上 x265 库遇到的问题,加了--extra-ldflags="-L${OTHER_LIB}/lib -lm -lstdc++"都不管用。

  1. arm-hisiv500-linux-gcc -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -I/home/schips/ffmpeg_x265_try/install/__all_without_ffmpeg/include -march=armv5te -std=c11 -fomit-frame-pointer -marm -pthread -c -o /tmp/ffconf.qfzvUKnH/test.o /tmp/ffconf.qfzvUKnH/test.c
  2. arm-hisiv500-linux-gcc -L/home/schips/ffmpeg_x265_try/install/__all_without_ffmpeg/lib -march=armv5te -Wl,--as-needed -Wl,-z,noexecstack -o /tmp/ffconf.qfzvUKnH/test /tmp/ffconf.qfzvUKnH/test.o
  3. /tmp/ffconf.qfzvUKnH/test.o: In function `foo':
  4. test.c:(.text+0xa0): undefined reference to `cabs'
  5. collect2: error: ld returned 1 exit status
  6. check_complexfunc cexp 1
  7. test_ld cc
  8. test_cc
  9. BEGIN /tmp/ffconf.qfzvUKnH/test.c
  10. 1 #include <complex.h>
  11. 2 #include <math.h>
  12. 3 float foo(complex float f, complex float g) { return cexp(f * I); }
  13. 4 int main(void){ return (int) foo; }
  14. END /tmp/ffconf.qfzvUKnH/test.c
  15. arm-hisiv500-linux-gcc -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -I/home/schips/ffmpeg_x265_try/install/__all_without_ffmpeg/include -march=armv5te -std=c11 -fomit-frame-pointer -marm -pthread -c -o /tmp/ffconf.qfzvUKnH/test.o /tmp/ffconf.qfzvUKnH/test.c
  16. arm-hisiv500-linux-gcc -L/home/schips/ffmpeg_x265_try/install/__all_without_ffmpeg/lib -march=armv5te -Wl,--as-needed -Wl,-z,noexecstack -o /tmp/ffconf.qfzvUKnH/test /tmp/ffconf.qfzvUKnH/test.o
  17. /tmp/ffconf.qfzvUKnH/test.o: In function `foo':
  18. test.c:(.text+0xa8): undefined reference to `cexp'
  19. collect2: error: ld returned 1 exit status
  20. require_pkg_config libx265 x265 x265.h x265_api_get
  21. check_pkg_config libx265 x265 x265.h x265_api_get
  22. test_pkg_config libx265 x265 x265.h x265_api_get
  23. false --exists --print-errors x265
  24. ERROR: x265 not found using pkg-config

arm linux 移植 ffmpeg 库 + x264的更多相关文章

  1. Arm-Linux 移植 FFMPEG库 + x264

      背景: ffmpeg 中带有264的解码,没有编码,需要添加x264.libx264是一个自由的H.264编码库,是x264项目的一部分,使用广泛,ffmpeg的H.264实现就是用的libx26 ...

  2. arm linux 移植 x265

    背景 本来想着把 x265编译到ffmpeg里面,搞定了x265的编译:但是一直报ERROR: x265 not found using pkg-config这个错误,我按照网上的资料,查看了ffbu ...

  3. linux 编译ffmpeg 支持x264, x265

    1. 前言 本教程涉及的ffmpeg, x264, x265 2. 环境依赖 2.1 删除系统中安装的ffmpeg等库 sudo apt-get --purge remove ffmpeg mplay ...

  4. Linux 安装 go 以及 arm linux 移植 go

    背景 Go是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性. 从Go1.4之后Go语言的编译器完全由Go语言编写,所以为了从源代码 ...

  5. arm linux 移植 MQTT (paho、mosquitto)

    前言 我们在这里做2件事情: 1)编译 paho.mqtt.mosquitto 2个开源项目的c版本库(mosquitto库没有用上) 2)编译好 依赖 paho.mqtt的库编写例程 + mosqu ...

  6. arm linux 移植 PHP

    背景: PHP 是世界上最好的语言. host平台 :Ubuntu 16.04 arm平台 : 3531d arm-gcc :4.9.4 php :7.1.30 zlib :1.2.11 libxml ...

  7. arm linux下编译库System.Net.Primitives.dll和System.Xml.XmlSerializer.dll

    1.环境: /home/jello # uname -aLinux  3.10.0 #2 SMP Mon Mar 6 17:52:09 CST 2017 armv7l GNU/Linux 2.获取mo ...

  8. arm linux 移植支持 HP打印机

    背景 由于业务需要,需要hi3531d主板上加入对于HP打印机的支持. 通过与产品经理,技术主管的沟通:通用支持是不现实的,只要求彩色打印,先不考虑打印机的价格,只要支持一款打印机即可. 注意: Li ...

  9. arm linux 移植 gdb/gdbserver

    背景 调试工具gdb的使用对于嵌入式Linux开发人员来说是一项不可少的技能. 目前,嵌入式 Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机 ...

随机推荐

  1. Notepad++查看文本文件的总的字符数、GBK字节数、UTF8字节数

    如果其编码是 小结:UTF-8编码下,一个汉字占3字节,GBK编码下,一个汉字占2字节:

  2. HtmlUnit-API的使用就介绍

    转自:https://www.cnblogs.com/luotinghao/p/3800054.html 网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源Htm ...

  3. 利用 Jenkins 持续集成 iOS 项目,搭建自动化打包环境

    ---恢复内容开始--- jenkins是一个广泛用于持续构建的可视化web工具,持续构建即各种项目的”自动化”编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:Java, c#, P ...

  4. 洛谷 P5019 铺设道路(差分)

    嗯... 题目链接:https://www.luogu.org/problem/P5019 首先简化一下题意: 给定一个长为N的数组,每次操作可以选择一个区间减去1,问最少多少次操作可以将数组中的数全 ...

  5. JMS消息传递的类型

    对于消息的传递有两种类型: 一种是点对点的,即一个生产者和一个消费者一一对应: 另一种是发布/ 订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进 行接收.

  6. 代理模式之静态代理,JDK动态代理和cglib动态代理

    代理模式,顾名思义,就是通过代理去完成某些功能.比如,你需要购买火车票,不想跑那么远到火车站售票窗口买,可以去附近的火车票代售点买,或者到携程等第三方网站买.这个时候,我们就把火车站叫做目标对象或者委 ...

  7. selenium webdriver 执行Javascript

    @Test public void testElementByID() { //通过JS获取页面元素 driver.get(url); driver.manage().window().maximiz ...

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 网格系统实例:偏移列

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. iframe结构的网站按F5刷新子页面的实现方式

    有的网站或者后台系统由于页面有公共的部分,比如菜单,会把公共的部分放在一个页面,这里称之为父页面,而把具体的内容放入一个iframe中,之后的请求改变iframe的内容.但是这样会有一个问题,因为浏览 ...

  10. 爬虫实战_爬取豆瓣图书利用csv库存储

    读取csv文件 通过csv.reader()和DictReader()两个函数 reader()函数返回一个迭代器 会包含表头 通过next函数可以跳过,但是它只能通过下标访问数据: DictRead ...