专栏/[FFmpeg探秘]Ep.(2) 从node-fluent-ffmpeg开始

[FFmpeg探秘]Ep.(2) 从node-fluent-ffmpeg开始

2017年08月05日 15:45--浏览 · --喜欢 · --评论
粉丝:1129文章:11

这一节,我们从node-fluent-ffmpeg入手,对FFmpeg的流媒体机制进行探秘。node-fluent-ffmpeg是基于Nodejs下基于FFmpeg的流媒体API,提供了操控FFmpeg的简便方法。

(注:由于哔哩哔哩目前专栏的机制,不支持代码高亮/站外链接/详细文本设置,因此代码部分我会以截图的形式发布,一些关键的可以实际操作的内容就算格式难看一些我也会直接复制上来。)

在这里要提一句,初探是以你有一定编程基础为基准写下的,一般高中信息科技水平就够用了。具体还是看ffmpeg的命令,只是借助node-fluent-ffmpeg简化操作。

要使用node-fluent-ffmpeg,首先我们需要安装Node。这一步这里不详述,需要帮助者可以百度搜索。不过要提一句的是,在非Windows平台下,Node.js和npm是分开发布的(比如ubuntu),因此需要分别下载。以ubuntu为例,就需要通过sudo apt-get install npm安装npm包管理器。

其次,我们需要安装FFmpeg本体。这一步在百度上也有详尽的方法介绍,简略地来说就是下载FFmpeg—复制到某文件夹—将该文件夹添加到系统环境变量PATH中—运行ffmpeg -version查看是否成功安装。有时环境变量的重设需要重启电脑,具体问题具体分析。

最后,就是node-fluent-ffmpeg的安装。如图:

在一个新建立的文件夹下(这个文件夹之后我们需要用来进行测试,建议找一个不容易混淆的、路径中不包含中文的目录),运行:npm install fluent-ffmpeg,在一段时间的等待之后,即可完成安装。目录下新建的node_modules文件夹即为下载的文件。我运行完该命令后的效果如下图所示:

(注:如果遇到无法安装的问题,可以百度搜索cnpm,可能可以解决。)

接下来的一步是创建app.js和package.json。先来看package.json:

暂时需要写的就只有这些内容,其中name和version可以随意更改。

再来看app.js:

引入fluent-ffmpeg,这样之后就可以调用了。

------------------------------------

作为测试,我们复制一个视频文件到这个目录下,并将其重命名为test.mp4。我这里使用的是av12055176的Adobe Premiere导出版以及哔哩哔哩投稿工具压制后的版本。

首先分别看一下小丸工具箱中的视频信息:

可以看到两者都是AVC+AAC封装的视频,格式大体相同,所以演示的时候我就以test.mp4为例。

首先是最简单的例子,直接的视频格式转换,代码如图所示:

其中三行.on()中的内容只是为了提供输出,真正有用的内容是除去这三行的内容。我们来查看一下输出文本:

下面就是类似读条的过程,这里就不全部贴上了了。可以看到,在这段代码被执行时,实际调用的语句是:

ffmpeg -i test.mp4 -y test-transform.flv

其中-i是提供文件输入,-y是默认覆盖生成文件。这也是简单视频格式转换所用到的最基本的命令。然而,这样得到的视频效果……如图所示(GG

上图为处理前的视频效果

上图为处理后的视频效果

可以看到,视频的效果下降了不止一个档次。再通过小丸工具箱查看一下视频的详细参数:

可以看到,参数已经被压得惨不忍睹了。为此,我们需要增加一些参数:

再来看这次的效果:

效果拔群。关键是对比一下文件大小:

之前那次压制的文件被覆盖掉了,大家这里看不见,但其实际大小是和test_bilibili.mp4相仿的。经过仔细的观察,其视频效果也和test.mp4几乎一致(肉眼无法看出的区别),但体积一下就变成了原来的六分之一。

再来看小丸工具箱里的视频参数:

这样的参数,已经完全符合B站投稿的标准,而且其作为flv文件,对直播播放来说占用的资源也相对较少(假设直接推流源文件)。执行的命令如下:


这一篇就到这里,具体的参数详解信息留到之后一P再说。高三党,因此也只有暑假能够更新一些了,大约是2-3天一篇吧。

(接着吐槽:不能上站外链接很绝望啊orz

投诉或建议