Ubuntu 12.04下FFmpeg转码H264为H265提示libx265编码器未知怎么办
仅完成x265静态依赖库的编译安装,无法让当前系统调用的FFmpeg获得libx265编码能力:当前运行的FFmpeg是预装的系统版本,该版本编译时就未集成libx265编码模块,且未基于已安装的x265依赖重新编译FFmpeg,因此会触发Unknown encoder 'libx265'报错。
执行ffmpeg -codecs看到的输出字段中,D代表支持解码、E代表支持编码,当前输出仅带D标识,直接证明运行的FFmpeg二进制本身没有内置HEVC编码能力,和x265库是否安装完成没有关联。
1. 配置x265库的系统检索路径
之前编译x265时,库文件被安装到了$HOME/ffmpeg_build目录,需要先将该路径加入pkg-config和动态库的默认检索路径,否则后续编译FFmpeg时无法定位到x265:
echo "export PKG_CONFIG_PATH=$HOME/ffmpeg_build/lib/pkgconfig:$PKG_CONFIG_PATH" >> ~/.bashrc echo "export LD_LIBRARY_PATH=$HOME/ffmpeg_build/lib:$LD_LIBRARY_PATH" >> ~/.bashrc source ~/.bashrc
执行完成后验证x265是否可被系统检索:
pkg-config --modversion x265
能正常输出x265的版本号,说明路径配置正确。
2. 基于x265依赖重新编译FFmpeg
回到之前预留的源码存放目录,拉取稳定版FFmpeg源码包并解压:
cd ~/ffmpeg_sources tar xjf ffmpeg-<稳定版本号>.tar.bz2 cd ffmpeg-<稳定版本号>
执行编译配置,显式开启libx265支持,关联之前安装的静态库路径:
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 -lm" \ --bindir="$HOME/bin" \ --enable-gpl \ --enable-libx265 \ --enable-libx264 \ --enable-nonfree
配置执行完成后,在控制台输出的「Enabled encoders」列表中检索是否存在libx265条目,存在则代表配置正确,否则需要回溯检查x265的路径配置是否生效。
确认配置无误后执行编译安装:
make -j$(nproc) make install hash -r
3. 功能验证
安装完成后重新检查HEVC编码支持:
ffmpeg -codecs | grep hevc
正常输出应同时带D(解码)和E(编码)标识:DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding)
此时执行最初的转码命令,将不会再出现Unknown encoder 'libx265'报错。
- 系统apt源提供的FFmpeg为了规避版权协议,默认会移除libx265这类带专利授权的编码器,即使手动安装x265库,也无法为已经编译完成的FFmpeg二进制新增功能,必须自行编译带对应编码器的版本
- 编译x265时使用了
-DENABLE_SHARED:bool=off的纯静态配置,编译FFmpeg时必须加上--pkg-config-flags="--static"参数,否则链接阶段会因为找不到静态库路径报错 - 安装完成后用
which ffmpeg确认当前调用的FFmpeg路径为~/bin/ffmpeg,而非系统自带的/usr/bin/ffmpeg,避免新旧版本混淆导致配置不生效
内容的提问来源于stack exchange,提问作者ching

