- 更新:2020-09-26 22:53:09
- 首发:2020-09-26 22:51:26
- 教程
- 10042
在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
,那么默认安装的版本都很老,有些新功能并不支持,如一些新的封装格式或者通信协议。对于Debian
和Ubuntu
用户而言,官方存储库在libav-tools
软件包中包含ffmpeg
/ffprobe
可执行文件,但是它们实际上是重新命名为avconv
/avprobe
的可执行文件(avconv
是ffmpeg
的分支)。它们基本兼容,但是如果您遇到问题,则可能要使用真正的ffmpeg
。您可以从源代码编译它,也可以在https://ffmpeg.org/download.html找到一个预构建的.deb软件包(对于Ubuntu,ppa:mc3man/trusty-media
PPA提供了最新的构建)。
编译安装后,您可以使用以下API命令手动设置ffmpeg
,ffprobe
和flvtool2
/ 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 GPU
与Intel QSV
,还有一些特定的平台,例如树莓派(Raspberry PI)、瑞星微等有专门的硬编码/硬解码方案。
使用FFmpeg
的硬编解码,需要安装好相应的GPU驱动程序,然后在node-fluent-ffmpeg
的API中调用专门平台的配置命令(例如在inputOptions
方法中传入-hwaccel cuvid
来启用N卡编解码,并传入-vcodec h264_cuvid
来实现Nvidia GPU
的H.264
硬解或传入-vcodec h264_nvenc
来实现Nvidia GPU
的H.264
硬编码)。
使用硬编解码时需添加的编译参数
在使用Intel QSV
和Raspberry PI
硬编解码时,需要在编译时开启对硬件编解码的支持。
例如Intel CPU
开启核显硬编解码,则编译FFmpeg
时通过--enable-libmfx
开启对Intel QSV
的支持。
例如Raspberry PI
在编译FFmpeg
时通过--enable-omx-rpi
开启硬编码、硬解码的支持。
FLV视频编码
如果要对FLV视频进行编码,则必须安装flvtool2
或flvmeta
,并且在您PATH
中添加路径,否则fluent-ffmpeg
中将无法生成输出文件。如果您设置FLVTOOL2_PATH
或FLVMETA_PATH
,fluent-ffmpeg
将尝试优先使用它。
需要注意的细节
由于fluent-ffmpeg
官方说明文档已经非常详细,对于使用方法不再赘述。fluent-ffmpeg
只是ffmpeg
的Node.js
API封装,理论上支持所有ffmpeg
可以实现的功能。
需要特别注意的是,正因为fluent-ffmpeg
仅仅是ffmpeg
的Node.js
API封装,因此借助fluent-ffmpeg
执行ffmpeg
程序会占用所有的硬件资源,例如软解时可能占满CPU,100%
的CPU使用率将导致服务器中其它服务无法正常运行。
可以考虑将ffmpeg
相关程序运行在Docker
容器中,并使用--cpuset-cpus
限制其可以使用的CPU资源。
👍
谢谢普总!!
老师你好,我希望能用一个openwrt路由器实现IPv4和IPv6的桥接,请问我该如何实现?我尝试了直接新增dhcpv6的接口,但是效果不甚理想(无法成功获取公网的ipv6,但是直连上级路由的其他设备是可以获取公网的ipv6地)
![%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE20241205230845.png](https://cdn.wyr.me/visitor-files/2024-12-05/1733411344287屏幕截图 2024-12-05 230845.png)你好
,为什么我这里是0039 813C 0600 0075 16xx xx xx,只有前6组是相同的,博客中要前8位相同,这个不同能不能照着修改呢?我系统版本是Win1124H2
大神你好,win11专业版24h2最新版26100.2033,文件如何修改?谢谢
win11专业版24h2最新版26100.2033,Windows Feature Experience Pack 1000.26100.23.0。C:\Windows\System32\termsrv.dll系统自带的这个文件,39 81 3C 06 00 00 0F 85 XX XX XX XX 替换为 B8 00 01 00 00 89 81 38 06 00 00 90。仍然无法远程连接。原来是win11 21h2系统,是可以远程链接的。共享1个主机,2个显示器,2套键鼠,各自独立操作 各自不同的账号,不同的桌面环境。
博主,win11专业版24h2最新版,C:\Windows\System32\termsrv.dll系统自带的这个文件,找不到应该修改哪个字段。我的微信:一三五73二五九五00,谢谢