写在前面
FFmpeg社区曾经有过一次针对RTMP扩展HEVC的讨论,最终达成的结论是如果Adobe扩展了RTMP,那么FFmpeg才可以接受HEVC扩展。现状是Adobe更新RTMP协议遥遥无期。
为推进HEVC视频编码格式在直播方案中的落地,经过CDN联盟讨论,并和主流云服务厂商达成一致,规范了HEVC在RTMP/FLV中的扩展…
以上内容摘自金山视频云的文章《FFmpeg代码导读系列(一,下半部)—-HEVC在RTMP中的扩展》
金山云在ffmpeg的源码基础上增加了rtmp h265的支持,并且在github上开源。
所谓工欲善其事,必先利其器。第一步,我们先编译代码,得到可以推拉rtmp h265流的ffmpeg,以及可以播放rtmp h265的ffplay。以便后续学习rtmp h265的协议知识。
本来,金山云ffmpeg的git wiki页《H.265 RTMP推流使用指南》上已经有编译的说明,但是我实际操作时遇到了一些问题,所以写了这篇文章。
另外,我之前还写了几篇和ffmpeg编译相关的文章(如果你在编译时遇到问题,也可以看看):
正文
我的实验环境是macOS Catalina 10.15.1
下载ksvc版本的ffmpeg,并切换到对应的3.4版本release分支:
1 | git clone https://github.com/ksvc/FFmpeg.git |
编译:
1 | ./configure --enable-static --enable-pic \ |
报错:
1 | ERROR: x265 not found using pkg-config |
原因是缺少libx265库,我们先下载并编译libx265:
x265的所有版本下载列表: https://bitbucket.org/multicoreware/x265/downloads/
我们选当前的次新版本x265_3.2.1
,开始编译安装:
1 | wget https://bitbucket.org/multicoreware/x265/downloads/x265_3.2.1.tar.gz |
回到ffmpeg目录,按上面的参数继续执行./configure
。
然后编译:
1 | make -j8 |
报错:
1 | libavcodec/libx264.c:282:9: error: use of undeclared identifier 'x264_bit_depth' |
意思是找不到x264_bit_depth
的定义,看名字明显是和x264相关的,打开本地的/usr/local/include/x264_config.h
文件,可以看到:
1 | #define X264_BIT_DEPTH 0 |
说明x264的头文件中是大写的X264_BIT_DEPTH
,所以我就把libavcodec/libx264.c
中的x264_bit_depth
全部替换成了大写的X264_BIT_DEPTH
。
继续make -j8
编译,成功得到ffmpeg和ffplay等可执行文件。
之后,我们就可以尝试推拉h265的流了。
1 | 推流 |
这里需要注意的是,推拉流成功的前提是,你的rtmp服务器支持h265。
我的开源Go流媒体服务器lal已支持rtmp h265,并提供了源码和可执行文件两种形式供大家使用,感兴趣的可以看看,谢谢。
github地址: https://github.com/q191201771/lal
本文完,作者yoko,尊重劳动人民成果,转载请注明原文出处: https://pengrl.com/p/20044/