使用 Node JS 和 FFMPEG 编写视频编码器

最近需要了解视频编码器是如何工作的,所以首先想到了 FFMPEG。毫无疑问,这是最好的编写编码器,拥有众多功能。在本文中,我将向大家展示如何创建一个简单的视频编码器并分发编码后的视频。

使用 Node JS 和 FFMPEG 编写视频编码器

观看原始视频文件与流式观看有什么不同?观看原始文件的主要缺点是我们需要下载整个视频才能在电脑上观看。在观看视频时,这种体验并不好。因此,流媒体的作用就是通过互联网向我们发送视频片段,这样我们就能即时观看视频了。

现在你应该明白我们要做什么了吧,我们要把视频分割成不同的片段并进行传输。那么,我们能在不编码的情况下做到这一点吗?是的,您可以将原始视频文件分割成片段,然后在不编码的情况下进行传输。这种方法通常被称为 “分块 “或 “分段 “流。它将视频文件分解成更小的片段或块,然后通过互联网传输这些片段,供观众回放。

唯一的问题是,我们需要确保遵循合适的协议来传输。主要有两种协议:

  1. HTTP 直播 (HLS)
  2. HTTP 动态自适应流式传输 (DASH)

HLS 用于 Apple 生态系统,DASH 是其他系统的协议。

虽然严格意义上讲,这种类型的流媒体并不需要编码,但值得注意的是,许多流媒体平台仍将原始视频片段编码为不同的比特率和分辨率,以适应不同的设备和屏幕尺寸。这对于自适应流媒体尤为重要,在自适应流媒体中,播放器可以根据观众的连接速度和设备能力在不同质量的片段之间无缝切换。

因此,在本文中,我将向你展示如何创建一个简单的编码器服务,将一个简单的视频编码成不同的比特率和分辨率,以支持自适应流媒体。为此,我将使用 fluent-ffmpeg 库。使用以下命令安装 fluent-ffmpeg。

npm i fluent-ffmpeg

创建名为encoder.js 的文件并添加以下代码。

const ffmpegStatic = require('ffmpeg-static');
const ffmpeg = require('fluent-ffmpeg');

ffmpeg.setFfmpegPath(ffmpegStatic);

const inputPath = 'input.mp4';
const outputPath = 'output_dash/output.mpd';
const scaleOptions = ['scale=1280:720', 'scale=640:320'];
const videoCodec = 'libx264';
const x264Options = 'keyint=24:min-keyint=24:no-scenecut';
const videoBitrates = ['1000k', '2000k', '4000k'];

ffmpeg()
  .input(inputPath)
  .videoFilters(scaleOptions)
  .videoCodec(videoCodec)
  .addOption('-x264opts', x264Options)
  .outputOptions('-b:v', videoBitrates[0])
  .format('dash')
  .output(outputPath)
  .on('end', () => {
    console.log('DASH encoding complete.');
  })
  .on('error', (err) => {
    console.error('Error:', err.message);
  })
  .run();

现在让我们了解一下我们添加了什么,

ffmpeg-static是一个 Node.js 包,提供 FFmpeg 多媒体框架的静态二进制文件。它用于简化在 Node.js 应用程序中分发和运行 FFmpeg 命令的过程,而无需用户在其系统上单独安装 FFmpeg。

使用该ffmpeg()函数启动 FFmpeg 命令链。调用链式方法来构建编码过程。

  • .input(inputPath):指定输入视频文件。
  • .videoFilters(scaleOptions):将指定的比例选项应用于视频。这会将视频缩放到定义的分辨率。
  • .videoCodec(videoCodec):设置要使用的视频编解码器。我们使用 libx264,它是 H.264 视频编解码器。(H.264/MPEG-4 AVC(高级视频编码)视频压缩格式)。
  • .addOption('-x264opts', x264Options):将 x264 选项添加到命令中。(H.264编解码器的附加设置,与关键帧间隔和场景剪切相关的设置选项)
  • .outputOptions('-b:v', videoBitrates[0]):设置视频第一个版本的比特率选项。对于本教程,我们只制作一个版本
  • .format('dash'):指定输出格式为DASH。
  • .output(outputPath):指定 DASH 清单的输出路径。

现在,在运行编码器文件之前,请确保创建一个名为“output_dash”的文件夹,并在根目录中保留一个名为“input.mp4”的视频文件。并运行:

node encoder.js

现在,如果一切顺利,您将收到一条 DASH 编码完成的消息。

现在让我们使用 data-dashjs-player 播放器来播放这个视频。创建一个index.html 文件并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>DASH Video Player</title>
  <script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>
</head>
<body>
  <h1>DASH Video Player</h1>
  <div>
    <video data-dashjs-player autoplay controls>
      <source src="output_dash/output.mpd" type="application/dash+xml">
      Your browser does not support the video tag.
    </video>
  </div>
</body>
</html>

现在来创建一个简单的express js服务器,创建文件名为server.js:

const express = require('express');
const path = require('path');
const app = express();
const port = 3000;

app.use(express.static('output_dash'));

app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'index.html')); // Replace with your HTML file
  });

app.listen(port, () => {
  console.log(`Server is running at http://localhost:${port}`);
});

运行:

node server.js

转到http://localhost:3000/,您应该可以看到视频了,它会在缓冲的情况下逐段加载。

作者:Dimuthu Wickramanayake

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论