ffmpeg基础Linux环境下ffmpeg的配置(Ubuntu 18.04)

Posted 谢老板不用蟹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg基础Linux环境下ffmpeg的配置(Ubuntu 18.04)相关的知识,希望对你有一定的参考价值。

目录

一、下载ffmpeg源码

二、准备ffmpeg依赖环境

三、编译ffmpeg

四、编译成果

补充

运行c/c++程序出现找不到头文件问题


一、下载ffmpeg源码

        直接使用git命令下载即可。

git clone https://git.ffmpeg.org/ffmpeg.git

二、准备ffmpeg依赖环境

        另外这里附上官方的在linux环境下编译ffmpeg的过程,有需要的可以直接去官网查看:CompilationGuide/Ubuntu – FFmpeg

sudo apt-get update

sudo apt-get -y install autoconf automake build-essential \\
libass-dev libfreetype6-dev libsdl2-dev libtheora-dev \\
libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev \\
libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev

/* 如果不行的话还可以加上这个,本人编译的时候是先试了下面这个,然后才是上面那个 */
sudo apt-get update -qq && sudo apt-get -y install \\
  autoconf \\
  automake \\
  build-essential \\
  cmake \\
  git-core \\
  libass-dev \\
  libfreetype6-dev \\
  libgnutls28-dev \\
  libmp3lame-dev \\
  libsdl2-dev \\
  libtool \\
  libva-dev \\
  libvdpau-dev \\
  libvorbis-dev \\
  libxcb1-dev \\
  libxcb-shm0-dev \\
  libxcb-xfixes0-dev \\
  meson \\
  ninja-build \\
  pkg-config \\
  texinfo \\
  wget \\
  yasm \\
  zlib1g-dev

三、编译ffmpeg

cd ffmpeg

/* 先编译出最基本的ffmpeg,后续学习如有需要还可以继续添加 */
// --enable-shared:指的是编译出动态库
// --prefix=/usr/local/ffmpeg:指定ffmpeg在执行make install所安装的路径
./configure --enable-shared --prefix=/usr/local/ffmpeg

/* 好像linux是多核的话在make的时候可以使用多线程,比如:make -j16就是使用16个线程进行make。
使用多线程速度会比单单使用make要快 */
make

make install

四、编译成果

/* 进行环境变量配置 */
sudo vim /etc/ld.so.conf

=============以下是往 /etc/ld.so.conf 文件的最后一行添加的=============
/usr/local/ffmpeg/lib/
=====================================================================
不加的话在执行最后一条命令的时候就会报错:
./ffmpeg: error while loading shared libraries: libavdevice.so.59: cannot open shared object file: No such file or directory

sudo ldconfig

sudo vim /etc/profile
=============以下是往 /etc/ld.so.conf 文件的最后一行添加的=============
export PATH=/usr/local/ffmpeg/bin:$PATH
=====================================================================

source /etc/profile

ffmpeg -version
=============以下是 ffmpeg -version 命令执行成果所显示的=============
ffmpeg version N-106653-ga64e250680 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --enable-shared --prefix=/usr/local/ffmpeg
libavutil      57. 24.101 / 57. 24.101
libavcodec     59. 26.100 / 59. 26.100
libavformat    59. 22.100 / 59. 22.100
libavdevice    59.  6.100 / 59.  6.100
libavfilter     8. 35.100 /  8. 35.100
libswscale      6.  6.100 /  6.  6.100
libswresample   4.  6.100 /  4.  6.100
===================================================================

        如果遇到了执行source /etc/profile命令之后终端字体颜色变成白色或者设置的环境变量只对当前终端有效(当关闭该终端打开另一终端时,设置的环境变量失效了),可以重启一下虚拟机试试。

=========================================================================

补充

运行c/c++程序出现找不到头文件问题

比如:

 解决方法:

使用pkg-config。参考:pkg-config的作用和用法_牧羊女说的博客-CSDN博客_pkg-config

关于pkg-config的介绍可以查看上面那一篇文章。

如果直接执行 pkg-config --cflags --libs libavutil 的话会出现如下内容:

原因是找不到.pc文件。默认情况下,会去/usr/lib/pkgconfig/路径下查找若找不到,则会去PKG_CONFIG_PATH环境变量指定的路径下查找。

 ①添加如下内容到环境变量中:

# 去 ~/.bashrc配置也行
vim /etc/profile

# export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/xxx/xxx/lib/pkgconfig
# 例如:我的ffmpeg在/usr/local/ffmpeg/下
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig 

# source ~/.bashrc
source /etc/profile

 ②把在 /usr/local/ffmpeg/lib/pkgconfig 里的所有.pc文件复制到 /usr/lib/pkgconfig 路径下。

sudo cp /usr/local/ffmpeg/lib/pkgconfig/* /usr/lib/pkgconfig

 配置好后检查成果:

gcc log.c -o log `pkg-config --libs --cflags libavutil`

大功告成!! 

在Linux环境下使用NDK编译FFmpeg


在Linux环境下使用NDK编译FFmpeg

  • 本教程讲解如何在Linux系统中使用NDK编辑FFmpeg动态链接库
  • NDK:Native Development Kit,是 Android 的一个工具开发包
    • NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库
    • NDK 能自动将 so(动态链接库)和 java 应用一起打包成 apk(应用程序包)
  • JNI:Java Native Interface,它提供若干的 API 实现 Java 与其他语言之间的通信
    • JNI:可以在 Android 中使用 JNI 来调用 FFmpeg 的 so(动态链接库)
  • 该动态链接库可以运行在 ARM(armv8-a、armv7-a、x86、x86-64)架构中。
1)编译前的准备工作
  • Ubuntu 18.04 X64(系统)
    • apt-get install yasm
    • apt-get install pkg-config
  • Android NDK(下载)
    • android-ndk-r20b-linux-x86_64.zip
    • https://developer.android.google.cn/ndk/downloads/
  • FFmpeg(下载)
    • http://ffmpeg.org/download.html#releases
    • 在 FFmpeg 中使用 h264_mediacodec 建议版本 3.4.7
2)开始使用NDK编译FFmpeg
  • 解码 android-ndk-r20b-linux-x86_64.zip 到 /home/nljb/
  • 解压 ffmpeg-4.2.4.tar.gz 到 /home/nljb/
  • 修改 /home/nljb/ffmpeg-4.2.4/configure 文件 …
// 原始内容
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
// 修改为
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
  • 创建 /home/nljb/ffmpeg-4.2.4/build.sh 文件
  • 执行 sh -x build.sh 即可开始编译 ……
  • 如出现 asm 异常则增加(–disable-asm)即可
  • 编译完成后可以在 $(pwd)/android/$CPU 查看结果
#!/bin/bash
make clean

export NDK=/home/nljb/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21

function build_android
{
    echo "Compiling FFmpeg for $CPU"
    ./configure \\
    --prefix=$PREFIX \\
    --enable-neon \\
    --enable-hwaccels \\
    --enable-gpl \\
    --enable-shared \\
    --enable-jni \\
    --enable-mediacodec \\
    --disable-decoders \\
        --enable-decoder=h264_mediacodec \\
        --enable-decoder=vp9 \\
        --enable-decoder=h264 \\
        --enable-decoder=mpeg4 \\
        --enable-decoder=aac \\
        --enable-decoder=aac_latm \\
        --enable-decoder=mjpeg \\
        --enable-decoder=png \\
        --enable-decoder=mpeg4_mediacodec \\
    --disable-encoders \\  // 按需开启
        --enable-encoder=vp9_vaapi --enable-encoder=h264_nvenc --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc \\
    --disable-demuxers \\ // 按需开启
        --enable-demuxer=rtsp --enable-demuxer=rtp --enable-demuxer=flv --enable-demuxer=h264 \\
    --disable-muxers \\ // 按需开启
        --enable-muxer=rtsp --enable-muxer=rtp --enable-muxer=flv --enable-muxer=h264 \\
    --disable-parsers \\ // 按需开启
        --enable-parser=mpeg4video --enable-parser=aac --enable-parser=h264 --enable-parser=vp9 \\
    --disable-protocols \\ // 按需开启
        --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=tcp --enable-protocol=udp \\
    --disable-bsfs \\
    --disable-indevs --enable-indev=v4l2 \\
    --disable-outdevs \\
    --disable-filters \\
    --disable-postproc \\
    --disable-static \\
    --disable-doc \\
    --disable-ffmpeg \\
    --disable-ffplay \\
    --disable-ffprobe \\
    --enable-avdevice \\
    --disable-doc \\
    --disable-symver \\
    --cross-prefix=$CROSS_PREFIX \\
    --target-os=android \\
    --arch=$ARCH \\
    --cpu=$CPU \\
    --cc=$CC \\
    --cxx=$CXX \\
    --enable-cross-compile \\
    --sysroot=$SYSROOT \\
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \\
    --extra-ldflags="$ADDI_LDFLAGS" \\
    $ADDITIONAL_CONFIGURE_FLAG

    make clean
    make -j6
    make install
    echo "The Compilation of FFmpeg for $CPU is completed"

}

#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android

#x86
ARCH=x86
CPU=x86
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
build_android

#x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
build_android
#!/bin/bash

export NDK=/root/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21

#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD"

    echo "Compiling FFmpeg for $CPU"
    ./configure \\
    --prefix=$PREFIX \\
    --disable-asm \\
    --enable-neon \\
    --enable-hwaccels \\
    --enable-shared \\
    --enable-jni \\
    --enable-mediacodec \\
    --enable-decoders \\
    --disable-encoders \\
    --enable-demuxers \\
    --enable-muxers \\
    --enable-parsers \\
    --enable-protocols \\
    --disable-bsfs \\
    --disable-indevs \\
    --disable-outdevs \\
    --disable-filters \\
    --disable-postproc \\
    --disable-static \\
    --disable-doc \\
    --disable-ffmpeg \\
    --disable-ffplay \\
    --disable-ffprobe \\
    --enable-avdevice \\
    --disable-doc \\
    --disable-symver \\
    --cross-prefix=$CROSS_PREFIX \\
    --target-os=android \\
    --arch=$ARCH \\
    --cpu=$CPU \\
    --cc=$CC \\
    --cxx=$CXX \\
    --enable-cross-compile \\
    --sysroot=$SYSROOT \\
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \\
    --extra-ldflags="$ADDI_LDFLAGS" \\
    $ADDITIONAL_CONFIGURE_FLAG

以上是关于ffmpeg基础Linux环境下ffmpeg的配置(Ubuntu 18.04)的主要内容,如果未能解决你的问题,请参考以下文章

在Linux环境下使用NDK编译FFmpeg

linux下使用ffmpeg将amr转成mp3

Ubuntu 下配置 Qt 的 FFmpeg 的开发环境

Linux之源码安装FFmpeg

FFMPEG之Linux下编译

音视频开发FFmpeg适合新手入门,Linux OS 环境下 FFmpeg 操作指南