MST

星途 面试题库

面试题:Node.js Stream在复杂视频流媒体架构中的设计与实践

假设要构建一个支持多格式视频上传、转码并实时推流的复杂视频流媒体系统,使用Node.js Stream设计一个整体的架构方案,包括各模块间如何通过Stream进行数据交互,以及如何应对不同视频格式带来的兼容性问题。
32.1万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

整体架构方案

  1. 上传模块
    • 使用http模块的IncomingMessage作为上传视频流的入口。当客户端发起视频上传请求时,IncomingMessage会接收视频数据。
    • 可以通过formidable等库来解析包含视频文件的表单数据,将视频数据以可读流(Readable Stream)的形式获取。例如:
const http = require('http');
const formidable = require('formidable');

const server = http.createServer((req, res) => {
    const form = new formidable.IncomingForm();
    form.parse(req, (err, fields, files) => {
        const videoReadableStream = fs.createReadStream(files.video.path);
        // 后续处理视频可读流
    });
});
server.listen(3000);
  1. 转码模块
    • 接收来自上传模块的可读流,使用fluent - ffprobe获取视频格式信息。例如:
const ffmpeg = require('fluent - ffmpeg');
const probe = require('fluent - ffprobe');

const inputStream = videoReadableStream;
probe(inputStream, (err, metadata) => {
    const format = metadata.format.format_name;
    // 根据格式设置转码参数
});
- 根据获取的视频格式,设置合适的转码参数,使用`fluent - ffmpeg`进行转码。转码过程中,输入是来自上传模块的可读流,输出是可写流(`Writable Stream`)。例如:
const outputStream = fs.createWriteStream('transcoded_video.mp4');
ffmpeg(inputStream)
  .output(outputStream)
  .on('end', () => {
        console.log('Transcoding completed');
    })
  .run();
  1. 推流模块
    • 接收转码后的可写流,使用rtmp - server等库将转码后的视频实时推流。例如,使用node - rtmp - server
const RtmpServer = require('node - rtmp - server');
const rtmpServer = new RtmpServer();
const transcodedStream = outputStream;
rtmpServer.on('connection', (connection) => {
    connection.publish('streamName', transcodedStream);
});
rtmpServer.listen(1935);

各模块间通过Stream的数据交互

  1. 上传模块 -> 转码模块:上传模块通过fs.createReadStream等方式创建一个可读流,将视频数据源源不断地提供给转码模块。转码模块将这个可读流作为fluent - ffmpeg的输入流。
  2. 转码模块 -> 推流模块:转码模块在转码完成后,将转码后的视频数据以可写流的形式提供给推流模块。推流模块使用这个可写流进行实时推流。

应对不同视频格式带来的兼容性问题

  1. 格式探测:在转码模块中,使用fluent - ffprobe等工具探测上传视频的格式。通过分析格式信息,确定转码所需的参数,如编解码器、分辨率、帧率等。
  2. 通用转码设置:为常见的视频格式设置通用的转码参数,以确保转码后的视频能够在主流的播放器和平台上播放。例如,将不同格式转码为H.264编码、MP4容器格式,这是一种兼容性较高的组合。
  3. 错误处理与日志记录:在转码过程中,捕获因格式不兼容导致的错误,如编解码器不支持等。记录详细的日志信息,以便快速定位和解决问题。同时,可以向客户端返回友好的错误提示,告知用户视频格式不被支持。