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(成功):
找到其不正确的连接,修正即可