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

- 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
}
}