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