• arm linux 移植 ffmpeg 库 + x264 + x265


    背景

    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

    编译

    使用以下脚本一键编译。

    ##
    #    Copyright By Schips, All Rights Reserved
    #    https://gitee.com/schips/
    
    #    File Name:  make.sh
    #    Created  :  Mon 02 Sep 2019 08:05:53 PM HKT
    ##
    #!/bin/sh
    BASE=`pwd`
    BUILD_HOST=arm-linux
    OUTPUT_PATH=${BASE}/install
    
    OTHER_LIB=${OUTPUT_PATH}/__all_without_ffmpeg
    
    make_dirs () {
        #为了方便管理,创建有关的目录
        cd ${BASE} && mkdir compressed install source -p
    }
    
    tget () { #try wget
        filename=`basename $1`
        echo "Downloading [${filename}]..."
        if [ ! -f ${filename} ];then
            wget $1
        fi
    
        echo "[OK] Downloaded [${filename}] "
    }
    
    download_package () {
        cd ${BASE}/compressed
        tget http://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20171212-2245.tar.bz2
        tget http://ffmpeg.org/releases/ffmpeg-4.0.1.tar.bz2
        tget http://download.videolan.org/videolan/x265/x265_2.6.tar.gz
    }
    
    tar_package () {
        cd ${BASE}/compressed
        ls * > /tmp/list.txt
        for TAR in `cat /tmp/list.txt`
        do
            tar -xf $TAR -C  ../source
        done
        rm -rf /tmp/list.txt
    }
    
    make_x264() {
        cd ${BASE}/source/x264*
    
        CC=${BUILD_HOST}-gcc 
        ./configure 
        --host=${BUILD_HOST} 
        --enable-shared 
        --enable-static 
        --enable-pic 
        --prefix=${OUTPUT_PATH}/x264 
        --cross-prefix=${BUILD_HOST}- 
        --disable-asm
    
        make -j4 && make install
    }
    
    make_x265() {
        #sudo apt-get install cmake -y
        # 其他编译选项可以 通过 在 cmake ../source 以后 ccmake ../source 可以查看 ( ccmake 可以通过 sudo apt-get install cmake-curses-gui  进行安装 )
            cd ${BASE}/source/x265*/source
        # 获取 工具链所在位置 下面的操作为的是在 CMakeLists.txt 中插入下面内容
        GCC_FULL_PATH=`whereis ${BUILD_HOST}-gcc | awk -F: '{ print $2 }' | awk '{print $1}'` # 防止多个结果
        GCC_DIR=`dirname ${GCC_FULL_PATH}/`
        sed -i "1iset( CMAKE_SYSTEM_NAME Linux  )"                         CMakeLists.txt
        sed -i "2aset( CMAKE_SYSTEM_PROCESSOR ARM  )"                      CMakeLists.txt
        sed -i "2aset( CMAKE_C_COMPILER ${GCC_DIR}/${BUILD_HOST}-gcc  )"   CMakeLists.txt
        sed -i "2aset( CMAKE_CXX_COMPILER ${GCC_DIR}/${BUILD_HOST}-g++  )" CMakeLists.txt
        sed -i "2aset( CMAKE_FIND_ROOT_PATH ${GCC_DIR} )"                  CMakeLists.txt
        cmake ../source
        # 指定安装路径
        sed -i "1iset( CMAKE_INSTALL_PREFIX "${BASE}/install/x265"  )"     cmake_install.cmake
        make && make install
    }
    prepare_other_lib () {
        # 这一个是针对 ffmpeg 方便管理外部库使用的
        # 核心思想是把 所有的库都放到一起,再让 ffmpeg ld的时候在这里找(而不是添加多行) --extra-cflags="-I${X264_DIR}/include -I${xxx}/include" 
        cd ${BASE}/install/
        rm ${OTHER_LIB} -rf
        ls > /tmp/list.txt
        mkdir ${OTHER_LIB} -p
        for sub_dir in `cat /tmp/list.txt`
        do
            cp ${sub_dir}/* ${OTHER_LIB} -r -v
        done
        rm -rf /tmp/list.txt
    }
    
    make_ffmpeg() {
        MYPKGCONFIG=${BASE}/install/x265/lib/pkgconfig/
        export PKG_CONFIG_PATH=${MYPKGCONFIG}:$PKG_CONFIG_PATH
        cd ${BASE}/source/ffmpeg*
        ./configure 
        --cross-prefix=${BUILD_HOST}- 
        --enable-cross-compile 
        --target-os=linux 
        --cc=${BUILD_HOST}-gcc 
        --arch=arm 
        --prefix=${OUTPUT_PATH}/ffmpeg 
        --enable-shared 
        --enable-static 
        --enable-gpl 
        --enable-nonfree 
        --enable-ffmpeg 
        --disable-ffplay 
        --enable-swscale 
        --pkg-config="pkg-config --static" 
        --enable-pthreads 
        --disable-armv5te 
        --disable-armv6 
        --disable-armv6t2 
        --disable-yasm 
        --disable-stripping 
        --enable-libx264 
        --enable-libx265 
        --extra-cflags=-I${OTHER_LIB}/include 
        --extra-ldflags=-L${OTHER_LIB}/lib &&
        make clean && make -j4 && make install
    }
    
    echo "Using ${BUILD_HOST}-gcc"
    make_dirs
    download_package
    tar_package
    make_x264
    make_x265
    prepare_other_lib
    make_ffmpeg
    

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

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

    开发板准备

    生成完的结果都在 install 目录中。

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

    拷贝 install/ffmpeg中的 ffmpeg 文件到板子上。

    测试

     ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 /mnt/tmp/test.avi 
     # video4linux2 代表Linux下  
     # /dev/video0 代表摄像头设备 
     # /mnt/tmp/test.avi代表输出路径
    
    如果说我的文章对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。
    若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
    博客地址:https://www.cnblogs.com/schips/
  • 相关阅读:
    数据类型之间的转换
    博客园页面美化全系列
    drf——django的缓存和信号
    PEP8规范
    drf——drf局部使用,全局使用顺序
    drf—— xadmin的使用
    drf—— Book系列连表接口
    drf—— base64加码与解码
    drf——小知识
    drf—— 响聊聊cookie session token的演变
  • 原文地址:https://www.cnblogs.com/schips/p/cross_compile_ffmpeg_with_h264_h265_for_arm_linux.html
Copyright © 2020-2023  润新知