惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
T
Tenable Blog
V
Vulnerabilities – Threatpost
T
Troy Hunt's Blog
SecWiki News
SecWiki News
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Secure Thoughts
Cyberwarzone
Cyberwarzone
A
Arctic Wolf
H
Heimdal Security Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
N
News and Events Feed by Topic
The Hacker News
The Hacker News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cisco Talos Blog
Cisco Talos Blog
Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
Forbes - Security
Forbes - Security
Security Archives - TechRepublic
Security Archives - TechRepublic
Project Zero
Project Zero
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
T
Tor Project blog
WordPress大学
WordPress大学
AWS News Blog
AWS News Blog
Jina AI
Jina AI
阮一峰的网络日志
阮一峰的网络日志
Cloudbric
Cloudbric
O
OpenAI News
U
Unit 42
Google DeepMind News
Google DeepMind News
Simon Willison's Weblog
Simon Willison's Weblog
Recorded Future
Recorded Future
N
News | PayPal Newsroom
S
Schneier on Security
F
Full Disclosure
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
P
Privacy International News Feed
L
LINUX DO - 最新话题
F
Fortinet All Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Announcements
Recent Announcements

轶哥博客

blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog
blog
2020-09-26 · via 轶哥博客

在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资源。