美文网首页FFmpegiOS Tips
FFmpeg 编译, 转码

FFmpeg 编译, 转码

作者: yww | 来源:发表于2017-11-16 09:21 被阅读201次

    ffmpeg

    本文的运行环境为全新安装的 centos 7.4

    安装/编译依赖

    编译和下载源码包, 需要一些依赖工具, 执行以下命令安装

    yum install autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel
    

    除此之外, 还需要一些其他工具, 需要手动编译
    在此之前, 可以在家目录下新建一个文件夹用于存放所有源代码

    mkdir ~/ffmpeg_sources
    

    NASM

    一个汇编编译器, 安装方法

    cd ~/ffmpeg_sources
    curl -O -L http://www.nasm.us/pub/nasm/releasebuilds/2.13.01/nasm-2.13.01.tar.bz2
    tar xjvf nasm-2.13.01.tar.bz2
    cd nasm-2.13.01
    ./autogen.sh
    ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
    make
    make install
    

    Yasm

    另一个汇编编译器, 安装方法

    cd ~/ffmpeg_sources
    curl -O -L http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
    tar xzvf yasm-1.3.0.tar.gz
    cd yasm-1.3.0
    ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
    make
    make install
    

    libx264

    H.264 的视频编码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-gpl --enable-libx264
    安装方法

    cd ~/ffmpeg_sources
    git clone --depth 1 http://git.videolan.org/git/x264
    cd x264
    PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static
    make
    make install
    

    注意, 如果出现类似Found no assembler. Minimum version is nasm-2.13 的错误, 可能是由于系统内置了nasm, 需要卸载, 卸载方法yum remove nasm && hash -r

    libx265

    H.265/HEVC 的视频编码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-gpl --enable-libx265
    安装方法

    cd ~/ffmpeg_sources
    hg clone https://bitbucket.org/multicoreware/x265
    cd ~/ffmpeg_sources/x265/build/linux
    cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
    make
    make install
    

    libfdk_aac

    AAC 音频解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libfdk_aac, 如果添加了 --enable-gpl参数, 还需要同时使用 --enable-nonfree 参数
    安装方法

    cd ~/ffmpeg_sources
    git clone --depth 1 https://github.com/mstorsjo/fdk-aac
    cd fdk-aac
    autoreconf -fiv
    ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
    make
    make install
    

    libmp3lame

    MP3 音频解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libmp3lame
    安装方法

    cd ~/ffmpeg_sources
    curl -O -L http://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
    tar xzvf lame-3.100.tar.gz
    cd lame-3.100
    ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm
    make
    make install
    

    libopus

    Opus 音频编解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libopus
    安装方法

    cd ~/ffmpeg_sources
    curl -O -L https://archive.mozilla.org/pub/opus/opus-1.2.tar.gz
    tar xzvf opus-1.2.tar.gz
    cd opus-1.2
    ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
    make
    make install
    

    libogg

    Oog 数据流库, 是libtheoralibvorbis 的依赖
    安装方法

    cd ~/ffmpeg_sources
    curl -O -L http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
    tar xzvf libogg-1.3.2.tar.gz
    cd libogg-1.3.2
    ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
    make
    make install
    

    libvorbis

    Vorbis 音频解码器, 依赖 libogg, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libvorbis

    cd ~/ffmpeg_sources
    curl -O -L http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
    tar xzvf libvorbis-1.3.5.tar.gz
    cd libvorbis-1.3.5
    ./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-shared
    make
    make install
    

    libvpx

    VP8/VP9 视频编解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libvpx

    cd ~/ffmpeg_sources
    git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
    cd libvpx
    ./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
    make
    make install
    

    编译 FFMpeg

    cd ~/ffmpeg_sources
    curl -O -L https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
    tar xjvf ffmpeg-snapshot.tar.bz2
    cd ffmpeg
    

    这里需要编辑 configure 文件
    找到 enabled libmp3lame .... 这一行, 在后面添加 -lm

    enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame -lm
    

    否则会出现ERROR: libmp3lame >= 3.98.3 not found 错误
    参考资料Stack overflow: ERROR: libmp3lame >= 3.98.3 not found
    之后继续编译

    PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
      --prefix="$HOME/ffmpeg_build" \
      --pkg-config-flags="--static" \
      --extra-cflags="-I$HOME/ffmpeg_build/include" \
      --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
      --extra-libs=-lpthread \
      --bindir="$HOME/bin" \
      --enable-gpl \
      --enable-libfdk_aac \
      --enable-libfreetype \
      --enable-libmp3lame \
      --enable-libopus \
      --enable-libvorbis \
      --enable-libvpx \
      --enable-libx264 \
      --enable-libx265 \
      --enable-nonfree
    make
    make install
    hash -r
    

    编译完成后, 会生成ffmpeg, ffprobe, ffserver三个程序, ffmpeg 是转码程序, ffprobe可以用来分析视频文件, ffserver可以实现流媒体服务器。
    如果不需要 ffserver, 可以添加 --disable-ffserver

    常用命令

    查看支持的格式

    ffmpeg -formats

    视频获取封面/截图/关键帧

    ffmpeg -y -i "/root/test/haier.mp4" -f image2 -vframes 1 "/root/test/output/haier_cover.jpg"

    指定尺寸

    默认情况生成的封面为原视频尺寸, 如果需要修改生成的图片大小, 可以指定 scale 滤镜

    拉伸缩放

    如果要生成指定尺寸的, 如320*480 像素的图片, 可以用这个命令, 图片会被拉伸
    ffmpeg -y -i "/root/test/haier.mp4" -vf "scale=w=320:h=480" -f image2 -frames:v 1 "/root/test/output/haier_cover.jpg"

    比例缩放, 适应

    如果需要不拉伸, 缩放方式为最大化保留图片, 如最终生成的图片为: 320 * 256, 则可以用这个命令
    ffmpeg -y -i "/root/test/haier.mp4" -vf "scale=w=320:h=480:force_original_aspect_ratio=decrease" -f image2 -frames:v 1 "/root/test/output/haier_cover.jpg"
    如果需要在空白地方加上黑边, 可以使用命令
    ffmpeg -y -i "/root/test/haier.mp4" -vf "scale=w=320:h=480:force_original_aspect_ratio=decrease,pad=x=(ow-iw)/2:y=(oh-ih)/2:w=320:h=480" -f image2 -frames:v 1 "/root/test/output/haier_cover.jpg"

    比例缩放, 裁剪

    如果不需要拉伸, 缩放方式为最大化填充尺寸, 超出部分自动裁掉, 可以使用命令:
    ffmpeg -y -i "/root/test/haier.mp4" -vf "scale=w=320:h=480:force_original_aspect_ratio=increase,crop=320:480" -f image2 -frames:v 1 "/root/test/output/haier_cover.jpg"

    指定时间截图

    ffmpeg -y -ss 50 -i "/root/test/haier.mp4" -f image2 -vframes 1 "/root/test/output/haier_cover.jpg"
    命令中 -ss 50 表示在50秒位置截图, 时间格式为 hh:mm:ss[.xxx].
    注意: -ss 参数要放在 -i 参数之前

    截多张图(关键帧)

    注意: 关键帧任务非常费时

    按固定间隔时间

    如隔35秒一次, 使用 fps 滤镜
    ffmpeg -y -i "/root/test/haier.mp4" -vf "fps=1/35" "/root/test/output/haier_keyframe%04d.jpg"

    关键帧

    ffmpeg -i "/root/test/haier.mp4" -vf "select=eq(pict_type\,I)" -vsync vfr "/root/test/output/haier_keyframe%04d.jpg"

    视频转码

    x264

    使用 libx264 编码视频轨道, 使用 aac 编码音频轨道
    ffmpeg -i "/root/test/haier.mp4" -c:v libx264 -preset veryfast -crf 23.5 -c:a libfdk_aac -b:a 128k "/root/test/output/haier_veryfast_x264.mp4"
    -preset 参数可选的有ultrafast, superfast, veryfast, faster, fast, medium(默认值), slow, slower, veryslow" 最后生成的文件依次变小, 但是耗时依次变大
    -crf 值越小则输出画面越接近输入画面, 压缩率越低, 值越大则输出画面压缩越厉害, 压缩率越高, 不要超过28. 建议值23.5

    x265

    libx265 与libx264 参数类似, 压缩后, 视频体积更小, 相对的, 压缩时间也较x264 长很多. 此外 crf 参数建议为 28.
    ffmpeg -i "/root/test/haier.mp4" -c:v libx265 -preset ultrafast -crf 28 -c:a libfdk_aac -b:a 128k "/root/test/output/haier_ultrafast_x265.mp4"

    音频转码

    AAC
    固定码率

    参数为 -b:a, 建议每个声道取值64kBit/s, 即单声道音频编码率取64k, 立体声取值128k....

    ffmpeg -y -i "/root/test/sunshine.mp3" -c:a libfdk_aac -b:a 128k "/root/test/output/sunshine_libfdkacc_128k.m4a"
    
    可变码率
    VBR kbps/channel
    1 20-32
    2 32-40
    3 48-56
    4 64-72
    5 96-112

    参数为 -vbr, 取值范围为 1 - 5, 值越小, 效果越差, 每个声道的码率对应如下所示

    VBR kbps/channel
    1 20-32
    2 32-40
    3 48-56
    4 64-72
    5 96-112
    ffmpeg -y -i "/root/test/sunshine.mp3" -c:a libfdk_aac -vbr 3 "/root/test/output/sunshine_libfdkacc_2.m4a"
    
    MP3
    可编码率

    参数 -qscale:a 控制了转码后的音频质量, 取值范围 0 - 9, 值越低, 质量越好, 建议值为4, 此时文件尺寸和音质较为平衡, 最大值建议不超过6

    ffmpeg -i "/root/test/sunshine.mp3" -codec:a libmp3lame -qscale:a 2 "/root/test/output/sunshine_libmp3lame_2.mp3"
    
    固定码率

    参数为 -b:a
    mp3 也支持固定码率, 可使用的码率为 8, 16, 24, 32, 40, 48, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
    建议码率设置低于320k, 过高的值对音质提升不明显

    ffmpeg -i "/root/test/sunshine.mp3" -codec:a libmp3lame -b:a 128k "/root/test/output/sunshine_libmp3lame_2.mp3"
    

    媒体信息

    以 json 方式输出文件信息
    ffprobe -v quiet -print_format json -show_streams haier.mp4

    参考资料

    在Ubuntu Server上编译FFmpeg
    官方编译指南
    linux 源码编译指南
    I‑frame & P‑frame & B‑frame
    How to extract all key frames from a video clip?
    Create a thumbnail image every X seconds of the video
    【教程】x264常用参数科普+详解【教你压出高清画质】
    FFMpeg H.264 编码
    FFMpeg H.265 编码
    FFMpeg AAC 编码
    FFMpeg MP3 编码
    ffprobe命令参数学习总结

    相关文章

      网友评论

      本文标题:FFmpeg 编译, 转码

      本文链接:https://www.haomeiwen.com/subject/dfnkvxtx.html