NodeJs

nodejs 获取视频信息

ffprobe组件可以获得视频的相关信息(比如时长,声道,size等等),有时候我们希望在代码中调用ffprobe组件,比如在Nodejs中调用组件。可以利用node-ffprobe 和 @ffprobe-installer/ffprobe


  • node-ffprobe
https://www.npmjs.com/package/node-ffprobe
const probe = require('node-ffprobe')
const ffprobeInstaller = require('@ffprobe-installer/ffprobe')
 
console.log(ffprobeInstaller.path, ffprobeInstaller.version)
 
ffprobe.FFPROBE_PATH = ffprobeInstaller.path
 
var track = '/path/to/media/file.mp3' // or video
 
probe(track).then(probeData => {
    console.log(probeData)
})

  • ffprobe-installer/ffprobe
https://www.npmjs.com/package/@ffprobe-installer/ffprobe

  • Nodejs 中调用的例子(Docker)

① Dockerfile

#设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像
FROM node

RUN mkdir -p /video

#创建app目录,保存我们的代码
RUN mkdir -p /var/Sample
#设置工作目录
WORKDIR /var/Sample

#复制所有文件到 工作目录。
COPY . /var/Sample

RUN npm install

#暴露container的端口
EXPOSE 8002

#运行命令
CMD ["npm", "start"]

② package.json

{
  "name": "Sample",
  "version": "1.0.0",
  "description": "Sample",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "@ffprobe-installer/ffprobe": "^1.1.0",
    "express": "^4.16.4",
    "express-handlebars": "^3.1.0",
    "node-ffprobe": "^3.0.0",
    "request": "^2.88.2"
  }
}

③ server.js

"use strict";
Object.defineProperty(exports, "__esModule", {
  value: true
});
var express = require("express");
var bodyParser = require('body-parser');
var path = require("path");
var request = require('request');
const ffprobe = require('node-ffprobe')
const ffprobeInstaller = require('@ffprobe-installer/ffprobe')
console.log(ffprobeInstaller.path, ffprobeInstaller.version)
ffprobe.FFPROBE_PATH = ffprobeInstaller.path

var app = express();
app.use(bodyParser.json());
var filePath = "/video/";

app.post('/getVideoTime', function (req, res) {
  const jsonParm = req.body;
  var videoPath = filePath + jsonParm.videoName;
  
  ffprobe(videoPath).then(probeData => {
    if(probeData.error != undefined) {
      var returnData = {
        status: 'error',
        message: probeData.error.string,
        data: ''
      };
      res.json(returnData)
      return;
    }
    if(probeData != undefined && probeData.format != undefined &&  probeData.format.duration != undefined) {
      var returnData = {
        status: 'ok',
        message: '',
        data: probeData.format.duration
      };
      res.json(returnData)
    } else {
      var returnData = {
        status: 'ok',
        message: '',
        data: '0'
      };
      res.json(returnData)
    }
  })
});

var serverPort = 8002;
var server = app.listen(serverPort, function () {
  console.log("Server Start");
});
server.setTimeout(5000)

④ Docker命令创建镜像和运行容器

// 创建Sample镜像
docker build -t Sample .
// 运行容器 映射主机和镜像端口8002:8002  映射主机目录/video/flv 到镜像目录/video 
docker run -d -p 8002:8002 -v /video/flv:/video Sample

⑤ 运行以后能看到下面的取得到的视频结果

Server Start
{
  programs: [],
  streams: [
    {
      index: 0,
      codec_name: 'h264',
      codec_long_name: 'H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10',
      profile: 'Main',
      codec_type: 'video',
      codec_time_base: '0/2',
      codec_tag_string: '[0][0][0][0]',
      codec_tag: '0x0000',
      width: 1280,
      height: 720,
      coded_width: 1280,
      coded_height: 720,
      has_b_frames: 0,
      pix_fmt: 'yuvj420p',
      level: 31,
      color_range: 'pc',
      chroma_location: 'left',
      field_order: 'progressive',
      refs: 1,
      is_avc: 'true',
      nal_length_size: '4',
      r_frame_rate: '1000/1',
      avg_frame_rate: '0/0',
      time_base: '1/1000',
      start_pts: 0,
      start_time: '0.000000',
      bits_per_raw_sample: '8',
      disposition: [Object]
    },
    {
      index: 1,
      codec_name: 'aac',
      codec_long_name: 'AAC (Advanced Audio Coding)',
      profile: 'LC',
      codec_type: 'audio',
      codec_time_base: '1/44100',
      codec_tag_string: '[0][0][0][0]',
      codec_tag: '0x0000',
      sample_fmt: 'fltp',
      sample_rate: '44100',
      channels: 2,
      channel_layout: 'stereo',
      bits_per_sample: 0,
      r_frame_rate: '0/0',
      avg_frame_rate: '0/0',
      time_base: '1/1000',
      start_pts: 53,
      start_time: '0.053000',
      disposition: [Object]
    }
  ],
  chapters: [],
  format: {
    filename: '/video/20210226_174203098.flv',
    nb_streams: 2,
    nb_programs: 0,
    format_name: 'flv',
    format_long_name: 'FLV (Flash Video)',
    start_time: '0.000000',
    duration: '80.045000',
    size: '8761493',
    bit_rate: '875656',
    probe_score: 100
  }
}