轶哥

妄图改变世界的全栈程序员。

Node.js调用FFmpeg

在Node.js中调用FFmpeg的绝佳方法是使用node-fluent-ffmpeg库。

fluent-ffmpeg开源地址:https://github.com/fluent-ffmpeg/node-fluent-ffmpeg

关于FFmpeg的编译和安装

使用fluent-ffmpeg前需确保ffmpeg已经安装。fluent-ffmpeg需要ffmpeg >= 0.9才能正常工作。

FFmepg官方网站中提供了已经编译好的可执行文件。因为FFmpeg是开源的,所以用户可以根据自己的需要进行编译。在绝大部分商业场景中,都需要根据实际使用的组件进行定制。

FFmepg官方建议用户自行编译使用FFmpeg的最新版本,因为对于一些操作系统来说,使用系统默认的软件库安装ffmpeg时会发现其版本相对比较老旧,比如使用apt install ffmpeg或者yum install ffmepg安装ffmpeg,那么默认安装的版本都很老,有些新功能并不支持,如一些新的封装格式或者通信协议。对于DebianUbuntu用户而言,官方存储库在libav-tools软件包中包含ffmpeg/ffprobe可执行文件,但是它们实际上是重新命名为avconv/avprobe的可执行文件(avconvffmpeg的分支)。它们基本兼容,但是如果您遇到问题,则可能要使用真正的ffmpeg。您可以从源代码编译它,也可以在https://ffmpeg.org/download.html找到一个预构建的.deb软件包(对于Ubuntu,ppa:mc3man/trusty-mediaPPA提供了最新的构建)。

编译安装后,您可以使用以下API命令手动设置ffmpegffprobeflvtool2 / flvmeta二进制路径:

  • Ffmpeg.setFfmpegPath(path) 参数path是一个字符串,其中包含ffmpeg二进制文件的完整路径。
  • Ffmpeg.setFfprobePath(path) 参数path是一个字符串,其中包含ffprobe二进制文件的完整路径。
  • Ffmpeg.setFlvtoolPath(path) 参数path是一个字符串,其中包含flvtool2或flvmeta二进制文件的完整路径。

FFmpeg编码支持与定制

FFmpeg本身支持一些音视频编码格式、文件封装格式和流媒体传输协议,但是支持的数量依然有限,FFmpeg只提供一套基础的框架,所有的编码格式、文件封装格式和流媒体传输协议均可作为FFmpeg的模块挂载于FFmpeg框架中。

在编译ffmpeg时,可以通过configure查看ffmpeg支持的音视频编码格式、文件封装格式和流媒体传输协议。对于不支持的格式,可以通过configure --help查看所需要的第三方外部库,然后增加相应的编译参数进行支持。

使用ffmpeg -version可以查看ffmpeg的版本和编译时定制的外部库。

FFmpeg的硬编解码

当使用FFmpeg进行软解时,常见的基于CPU进行H.264、H.265编码,其成本会较高,CPU编码的性能相对较低。因此处于效率和成本的考虑,很多时候会使用硬编码/硬解码,常见的硬编码包含Nvidia GPUIntel QSV,还有一些特定的平台,例如树莓派(Raspberry PI)、瑞星微等有专门的硬编码/硬解码方案。

使用FFmpeg的硬编解码,需要安装好相应的GPU驱动程序,然后在node-fluent-ffmpeg的API中调用专门平台的配置命令(例如在inputOptions方法中传入-hwaccel cuvid来启用N卡编解码,并传入-vcodec h264_cuvid来实现Nvidia GPUH.264硬解或传入-vcodec h264_nvenc来实现Nvidia GPUH.264硬编码)。

使用硬编解码时需添加的编译参数

在使用Intel QSVRaspberry PI硬编解码时,需要在编译时开启对硬件编解码的支持。

例如Intel CPU开启核显硬编解码,则编译FFmpeg时通过--enable-libmfx开启对Intel QSV的支持。

例如Raspberry PI在编译FFmpeg时通过--enable-omx-rpi开启硬编码、硬解码的支持。

FLV视频编码

如果要对FLV视频进行编码,则必须安装flvtool2flvmeta,并且在您PATH中添加路径,否则fluent-ffmpeg中将无法生成输出文件。如果您设置FLVTOOL2_PATHFLVMETA_PATHfluent-ffmpeg将尝试优先使用它。

需要注意的细节

由于fluent-ffmpeg官方说明文档已经非常详细,对于使用方法不再赘述。fluent-ffmpeg只是ffmpegNode.jsAPI封装,理论上支持所有ffmpeg可以实现的功能。

需要特别注意的是,正因为fluent-ffmpeg仅仅是ffmpegNode.jsAPI封装,因此借助fluent-ffmpeg执行ffmpeg程序会占用所有的硬件资源,例如软解时可能占满CPU,100%的CPU使用率将导致服务器中其它服务无法正常运行。

可以考虑将ffmpeg相关程序运行在Docker容器中,并使用--cpuset-cpus限制其可以使用的CPU资源。

打赏
交流区(2)
A普佳

👍

2020年10月1日 09:47回复
轶哥

谢谢普总!!

2020年10月1日 09:52回复
尚未登陆
发布
  上一篇 (CryptoJS PBKDF2 AES对称加密)
下一篇 (昆明社保卡使用攻略)  

评论回复提醒