最近有人问我hls 是否支持h265,经过一番查找资料应该是不支持的。但是有人却不依不饶的问是否vlc 支持hls 支持h265,于是我想测试一番,翻出原来的推流代码,
把 pCodecOut = avcodec_find_encoder(AV_CODEC_ID_H264);这句代码改成 pCodecOut = avcodec_find_encoder(AV_CODEC_ID_H265);,经过debug 发现返回的null
想起来当初没有把h265 加入到ffmpeg中,撸起袖子开干吧。
1、 首先从官方下载http://hg.videolan.org/x265代码,使用cmake 生成vs工程,build 完成 ,生成目标文件,将头文件,和libx264.lib 复制到指定的目录(可以让编译器找的到相应的库)。
2、下载安装msys2 ,借助msys2 来运行ffmpeg 的shell 脚本。在bash里,在ffmpeg 目录下,执行./configure --toolchain=msvc --enable-gpl --enable-nonfree ... --enable-libx265。经过一段时间的执行,bash 报错,using libx265 without pkg-con53fig.fig。经过百度,发现要配置pkg-config 也比较麻烦,还有pkg-config 可能和mingw 配合比较好,msvc 压根没有没啥用啊。这种用法,于是我只能去修改configure,中找到了如下代码:
enabled libx265 && use_pkg_config x265 "x265.h" x265_encoder_encode -lx265 ||
{ check_cpp_condition x265.h "X265_BUILD >= 57" ||
die "ERROR: libx265 version must be >= 57."; }
改成了
enabled libx265 && use_pkg_config x265 "x265.h" x265_encoder_encode -lx265 ||
{ check_cpp_condition x265.h "X265_BUILD >= 57" ||
die "ERROR: libx265 version must be >= 57."; }
继续configure 完成后看到encoder列表中有h265 ,表示配置完成。
然后使用make 命令进行编译。 链接到一半的时候报错,x265_api_get_68 无法引用的符号错误。此时,我马上收索,x265_api_get_68 发现代码里面并没有这个函数,
最后我翻了x265的头文件里面,发现有一段宏,,x265_api_get_68 被宏定义搞成了,x265_api_get ,因此ffmpeg无论哪个版本都可以 ,x265_api_get_68调用。改了还是出错。因此库没有正确的引用,最后在libx265.c 代码开头加上,#pragma comment(lib,"x265.lib"),最后make 一下生成了dll,
将dll 替换以后原先的代码可以工作了,推流到EasyDarwin 上,本地用vlc 播放,发现流量基本上是h264 的一半。效果还不错。