Bootstrap

ubuntu ffmpeg 安装部署

ffmpeg 安装部署

ffmpeg是进行拉流和推流的主体库;这个部署时间为 20220101,后面看的时候主要版本和功能的变化

PC(x86)环境

Ubuntu 18.04;

cuda 10.0/10.2;,测试过10和20系列

ffmpeg使用的是官方的4.3.1(4.xx版本其实都差不多,变化不大)和kscv的3.4分支

官方ffmpeg的下载,(官方源码编译出来的版本无法推流h265格式的flv):
http://www.ffmpeg.org/download.html

kscv版下载,kscv是金山云(kscv)修改的可以推流h265格式flv的ffmpeg,
当时使用的版本最后一次修改时间是2021年10月18日:
git clone  https://github.com/ksvc/FFmpeg

手动修改,使其可以推流h265的格式的flv,修改FFmpeg官方源码后,
编译出的ffmpeg可以推流h265格式的flv(需要编译时添加加--enable-libx265),
(测试在ffmpeg版本 4.0 - 5.1期间可以使用,之前和之后暂未测试):
https://github.com/VCDP/CDN/blob/master/FFmpeg_patches/0001-Add-SVT-HEVC-FLV-support-on-FFmpeg.patch

h265推流可以看这个:https://github.com/ossrs/srs/issues/2562, 里面有多个解决方案

CPU编译安装(无cuda,无独显) - PC/Xavier

– 依赖

sudo apt install libx264-152 (Ubuntu20是155, ubuntu22是163,按照适用版本安装即可)
sudo apt install libx264-dev
sudo apt install libx265-dev
sudo apt install libsdl2-2.0-0
sudo apt install libsdl2-dev
sudo apt install libmp3lame-dev

sudo apt-get install yasm

– 编译参数

./configure --enable-shared --enable-static --enable-pic --enable-encoder=aac --enable-encoder=libx264 --enable-gpl --enable-libx264 --enable-encoder=libx265 --enable-libx265 --enable-decoder=aac --enable-decoder=h264 --enable-decoder=hevc --enable-demuxer=aac --enable-demuxer=mov --enable-demuxer=mpegts --enable-demuxer=flv --enable-demuxer=h264 --enable-demuxer=hevc --enable-demuxer=hls --enable-muxer=h264 --enable-muxer=flv --enable-muxer=f4v --enable-muxer=mp4 --enable-ffplay --enable-sdl --enable-gpl --prefix=/home/fwq/ffmpeg

make -j12

sudo make install

CUDA编译安装(没有独显) - PC

需要事先安装好nvidia-driver,cuda,cudnn等

– 依赖

sudo apt install libx264-155 (Ubuntu18是152,按照适用版本安装即可)
sudo apt install libx264-dev
sudo apt install libx265-dev
sudo apt install libsdl2-2.0-0
sudo apt install libsdl2-dev
sudo apt install libmp3lame-dev

sudo apt-get install yasm

– 安装ffnvcodec git clone

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
sudo make && sudo make install (这两个必须连起,不然有问题)

ps1: 需要注意版本,cuda11需要使用11版本的,cuda12使用12版本的,否则configure 会却报错 ERROR: nvenc requested but not found

– 编译参数

./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.7/targets/x86_64-linux/include --extra-cflags=-fPIC --extra-cxxflags=-fPIC --extra-ldflags=“-L/usr/local/cuda-11.7/lib64 -L/usr/local/cuda-11.7/targets/x86_64-linux/lib/” --enable-shared --enable-static --enable-pic --enable-encoder=aac --enable-encoder=libx264 --enable-gpl --enable-libx264 --enable-encoder=libx265 --enable-libx265 --enable-decoder=aac --enable-decoder=h264 --enable-decoder=hevc --enable-demuxer=aac --enable-demuxer=mov --enable-demuxer=mpegts --enable-demuxer=flv --enable-demuxer=h264 --enable-demuxer=hevc --enable-demuxer=hls --enable-muxer=h264 --enable-muxer=flv --enable-muxer=f4v --enable-muxer=mp4 --enable-libmp3lame --enable-ffplay --enable-sdl --enable-gpl --prefix=/home/fwq/ffmpeg_cuda

make -j12

sudo make install

参数解析

1. 其中 --prefix=/home/fwq/h265 时指定安装路径;

2. 其中cuda编译参数为

–enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda-10.2/targets/x86_64-linux/include --extra-cflags=-fPIC --extra-cxxflags=-fPIC --extra-ldflags=“-L/usr/local/cuda10.2/lib64 -L/usr/local/cuda-10.2/targets/x86_64-linux/lib/”

其余的就是普通编译参数。。

– 测试1

验证1:
    退出当前终端,重新进入一个,输入命令:
    ffmpeg -decoders | grep h264
    输出的第一行,应该是:ffmpeg version 4.0.2

    VFS..D h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
    V..... h264_v4l2m2m     V4L2 mem2mem H.264 decoder wrapper (codec h264)
    V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)

    ffmpeg -encoders | grep nv
    V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
    V..... h264_v4l2m2m      V4L2 mem2mem H.264 encoder wrapper (codec h264)
    V..... nvenc                     NVIDIA NVENC H.264 encoder (codec h264)
    V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)

验证2:
   ffplay -rtsp_transport tcp -x 640 -y 480 -vcodec h264_cuvid -i rtsp://admin:[email protected]/mpeg4/ch1/main/av_stream

报错:

测试报错①:
   ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory
解决(成功):将ffmpeg的lib路径加到/etc/ld.so.conf里面去:
     sudo vi /etc/ld.so.conf
     添加: /usr/local/lib
     保存退出后:sudo ldconfig 

注意: 这个是在上面不指定安装目录时的情况,ffmpeg 会直接安装到/usr/local/lib中,
若指定了安装目录(/home/fwq/h265),则 
export LD_LIBRARY_PATH=/home/fwq/h265/lib:$LD_LIBRARY_PATH
然后执行。。

– 测试2

ffmpeg -hwaccel cuvid -c:v hevc_cuvid -i 1.mp4 -vcodec h264_nvenc -acodec acc -o 2.mp4

-hwaccel 是指定硬件加速, cuvid表示知道cuda加速
-c:v 指定视频解码器格式, hevc_cuvid是h265的cuda解码器(1.mp4必须为hevc编码的)
-vcodec 指定视频编码器格式, h264_nvenc是h264的cuda编码器(2.mp4输出时h264的格式)


cuda编码器:
    h264_cuvid   h264的cuda解码器
    hevc_cuvid   h265的cuda解码器
cuda编码器:
    h264_nvenc
    nvenc_h264
    hevc_nvenc
    nvenc_hevc

独显(intel显卡)编译安装(没有cuda) - PC

– 安装 Intel Media Driver for VAAPI

在 Ubuntu 19.04 之后可以使用apt 安装

sudo apt-get install libmfx1 libmfx-tools
sudo apt-get install libva-dev libmfx-dev intel-media-va-driver-non-free
sudo apt-get install vainfo
sudo vi ~/.bashrc

export LIBVA_DRIVER_NAME=iHD

测试 : sudo vainfo

– Intel Media SDK 编译

sudo apt-get install git cmake pkg-config
sudo apt-get install meson libdrm-dev automake libtool
git https://github.com/Intel-Media-SDK/MediaSDK msdk
cd msdk

# 使用 Media SDK 20.1.1 的版本
git checkout abb56fa
mkdir build && cd build
cmake ..
make
sudo make install 


写到环境变量里
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/
export LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri/
export LD_LIBRARY_PATH=/opt/intel/mediasdk/lib/

– 其它依赖

sudo apt-get install aptitude
sudo apt-get install libv4l-dev
sudo apt-get install libgmp3-dev
sudo apt install pkg-config
sudo apt install gnutls-bin
sudo aptitude install libaom-dev
sudo aptitude install libass-dev
sudo aptitude install libbluray-dev
sudo aptitude install libfdk-aac-dev
sudo aptitude install libmp3lame-dev
sudo aptitude install libopencore-amrnb-dev
sudo aptitude install libopencore-amrwb-dev
sudo aptitude install libopenmpt-dev
sudo aptitude install libopus-dev
sudo aptitude install libshine-dev
sudo aptitude install libsnappy-dev
sudo aptitude install libsoxr-dev
sudo aptitude install libspeex-dev
sudo aptitude install libtheora-dev
sudo aptitude install libtwolame-dev
sudo aptitude install libvo-amrwbenc-dev
sudo aptitude install libwavpack-dev
sudo aptitude install libwebp-dev
sudo aptitude install libx264-dev
sudo aptitude install libx265-dev
sudo aptitude install libxvidcore-dev
sudo aptitude install liblzma-dev
sudo apt install libsdl2-dev

– 编译参数

./configure --enable-libmfx --enable-encoder=h264_qsv --enable-decoder=h264_qsv --disable-lzma --enable-libv4l2 --enable-shared --enable-static --enable-pic --enable-encoder=aac --enable-encoder=libx264 --enable-gpl --enable-libx264 --enable-encoder=libx265 --enable-libx265 --enable-decoder=aac --enable-decoder=h264 --enable-decoder=hevc --enable-demuxer=aac --enable-demuxer=mov --enable-demuxer=mpegts --enable-demuxer=flv --enable-demuxer=h264 --enable-demuxer=hevc --enable-demuxer=hls --enable-muxer=h264 --enable-muxer=flv --enable-muxer=f4v --enable-muxer=mp4 --enable-libmp3lame --enable-ffplay --enable-sdl --enable-gpl --prefix=/home/fwq/intel

其中的独显编译参数

–enable-libmfx --enable-encoder=h264_qsv --enable-decoder=h264_qsv --disable-lzma --enable-libv4l2

– 测试

ffmpeg -hwaccel qsv -i 1.mp4 -vcodec h264_qsv -acodec aac 2.mp4

-hwaccel 是指定硬件加速,qsv表示使用intel显卡加速

h265 – kscv

这里的h265指的是可以推流h265格式的flv流,而不是普通h265格式视频的编解码。

h265 是使用的kscv的版本进行编译的

– 下载

git链接: https://github.com/ksvc/FFmpeg   (金山云的ffmpeg)

下载:
git clone  https://github.com/ksvc/FFmpeg
cd FFmpeg
git checkout origin/release/3.4  或 git reset --hard origin/release/3.4

– 编译安装

使用上述的编译安装方式即可

– 编译报错(仅在编译kscv时报的错)

1. 编译kscv的版本时config的参数编译出来的库使用某些命令会有问题,如 ffmpeg -i 1.mp4 -v 1 1.jpg (获取视频首帧画面),使用失败,这个无法获取到首帧画面 ;将上面的 --disable-encoders, --disable-decoders, --disable-demuxers, --disable-muxers,–disable-doc 去掉后,使用ffmpeg -i 1.mp4 -v 1 1.jpg成功(不晓得具体是哪一个造成的,下面的就是现在的CPU编译参数,原来出问题的就是在这基础上多了上述的disable参数)

./configure --enable-shared --enable-static --enable-pic --enable-encoder=aac --enable-encoder=libx264 --enable-gpl --enable-libx264 --enable-encoder=libx265 --enable-libx265 --enable-decoder=aac --enable-decoder=h264 --enable-decoder=hevc --enable-demuxer=aac --enable-demuxer=mov --enable-demuxer=mpegts --enable-demuxer=flv --enable-demuxer=h264 --enable-demuxer=hevc --enable-demuxer=hls --enable-muxer=h264 --enable-muxer=flv --enable-muxer=f4v --enable-muxer=mp4 --enable-ffplay --enable-sdl --enable-gpl --prefix=/home/fwq/ffmpeg

2. 在Ubuntu20上编译kscv的版本时报错: error: ‘x264_bit_depth’ undeclared (first use in this function); did you mean ‘x264_picture_t’

原因:ffmpeg与x264版本不对应引起的(x264版本高了,这里apt直接安装的是libx264-155,以前的152版本是正常的) 解决:

wget ftp://ftp.videolan.org/pub/x264/snapshots/x264-snapshot-20180730-2245-stable.tar.bz2
tar -xvf x264-snapshot-20180730-2245-stable.tar.bz2
cd x264-snapshot-20180730-2245-stable
make clean && make distclean
./configure --prefix=/usr --enable-shared
make -j12
sudo make install
sudo ldconfig
注: 
1.上面make clean && make distclean时报错,没有nasm,
    解决: sudo apt install nasm 即可
2.ffmpeg make时报错 'undefined x264_bit_depth'等,
原因是上面install时安装在/usr/lib中,而/etc/ld.so.conf没有添加此目录,
解决:sudo vi /etc/ld.so.conf ,在里面添加 /usr/lib;然后重新编译ffmpeg即可

h265 – 手动修改官方源码

这个改出来进行推流有问题,需要后续继续测试才行。。。。

这里的h265指的是可以推流h265格式的flv流,而不是普通h265格式视频的编解码。

手动修改的patch,由于这里复制出来没有颜色,修改的就是+和-的位置,更明显的请看:

https://github.com/VCDP/CDN/blob/master/FFmpeg_patches/0001-Add-SVT-HEVC-FLV-support-on-FFmpeg.patch

编译安装及测试:

这里仅简单编译下测试是否可以

简单的编译安装:
./configure --prefix=/home/fwq/h265 --enable-libx265 --enable-gpl --enable-ffplay
make -j12
make install

#由于我的环境中有多个ffmpeg,因此这里export一下,指定使用的ffmpeg库
export LD_LIBRARY_PATH=/home/fwq/h265/lib:$LD_LIBRARY_PATH


#测试
cd /home/fwq/h265/bin

##这里的xx.mp4是h265格式的
ffmpeg -i xx.mp4 -c copy -f flv -y rtmp://192.168.1.3:1936/live/test


观看(h265格式的推流需要特定的播放器,普通vlc行):
http://www.easydarwin.org/easywasmplayer/

播放时输入: http://192.168.1.3:8079/live/test.flv

– 注意

不同版本的ffmpeg源码修改的行数和一点细节时不同的,如5.0版本的ffmpeg源码在flvdec.c中的flv_set_video_codec函数中修改的一段是:“vstreami->need_parsing”,而在4.4.1版本中则是:“vstream->need_parsing”,其余主要就是修改行数不同,大体都是一样的

– 编译安装

使用上述的编译安装方式即可(cpu/cuda/intel等)

编译报错(通用)

1. 若要编译ffplay,需要加上:–enable-ffplay --enable-sdl --enable-gpl, 不然编译不出ffplay

2. 若报错:ERROR: sdl2 requested but not found — 安装sdl2: sudo apt install libsdl2-dev

ps : 安装时依赖报错, E: Unable to correct problems, you have held broken packages.

解决如下(失败):sudo apt update && sudo apt dist-upgrade

3. 报错: nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.         分析:yasm是汇编编译器,ffmpeg为了提高效率使用了汇编指令,如MMX和SSE等。所 以系统中未安装yasm时,就会报上面错误。

解决1: sudo apt-get install yasm

解决2: ./configure后面加–disable-x86asm

4. 报错: libnpp is nonfree and --enable-nonfree is not specified.

解决1:去掉 --enable-libnpp

解决2:–enable-nonfree --enable-libnpp

使用报错

1. 报错:ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory
解决(成功):将ffmpeg的lib路径加到/etc/ld.so.conf里面去:
sudo vi /etc/ld.so.conf
添加: /usr/local/lib
保存退出后:sudo ldconfig

注意: 这个是在上面不指定安装目录时的情况,ffmpeg 会直接安装到/usr/local/lib中,若指定了安装目录(/home/fwq/h265),则
     export LD_LIBRARY_PATH=/home/fwq/h265/lib:$LD_LIBRARY_PATH

2. 报错:ffmpeg: symbol lookup error: ffmpeg: undefined symbol: avio_print_string_array, version LIBAVFORMAT_58

原因:通常是ffmpeg依赖的库被动了,链接的不正确

解决1(成功):

找到其不正确的连接,修正即可

;