求助 Nodejs 关于 fluent-ffmpeg 输出文件的问题

求助 Nodejs 关于 fluent-ffmpeg 输出文件的问题

想把 rtsp 的直播流转成 一帧一帧的图片

通过命令行可以实现

ffmpeg -i "rtsp://admin:[email protected]/main/Channels/" -y -f image2  img%03d.jpg

在 nodejs 中使用 fluent-ffmpeg 实现了

const ffmpeg = require('fluent-ffmpeg')
const fs = require('fs')

let ffmpegPath = ‘ffmpeg/ffmpeg.exe’ ffmpeg.setFfmpegPath(ffmpegPath)

let url = ‘rtsp://admin:[email protected]/main/Channels/’ // ffmpeg -i “rtsp://admin:[email protected]/main/Channels/” -y -f image2 img%03d.jpg

ffmpeg(url) .addInputOption(’-rtsp_transport’, ‘tcp’, ‘-buffer_size’, ‘102400’) // 这里可以添加一些 RTSP 优化的参数 // .outputOptions([’-vframes 1’, ‘-fflags nobuffer’, ‘-tune zerolatency’]) // 每帧一张图 .videoCodec(‘png’) // 输出 PNG 格式图片 .on(‘error’, function (err, stdout, stderr) { console.log(‘错误信息’, err.message); }) .on(‘end’, function () { console.log(‘结束’ ,‘Screenshots taken’); }) .on(‘codecData’, function () { console.log(‘codecData 事件’, ‘Stream codecData.’) }) .output(‘img%03d.jpg’).format(“image2”).noAudio().run()

但是上面两种方式都会直接生成图片 有没有办法把图片的 buffer 获取到 不写入文件中


2 回复

我在用 pipe 方式可以获取到图片流 但是只有第一张图片 然后就报错了
<br>const ffmpeg = require('fluent-ffmpeg')<br>const fs = require('fs')<br><br>let ffmpegPath = 'ffmpeg/ffmpeg.exe'<br>ffmpeg.setFfmpegPath(ffmpegPath)<br><br>let url = 'rtsp://admin:<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="83e0eaf5eae0eaedf7b2b2b2b3c3b2bab1adb2b5bbadb3adb2bbb6">[email&nbsp;protected]</a>/main/Channels/'<br>// ffmpeg -i "rtsp://admin:<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="701319061913191e0441414140304149425e4146485e405e414845">[email&nbsp;protected]</a>/main/Channels/" -y -f image2 img%03d.jpg<br>let img = fs.createWriteStream('img.png')<br><br>ffmpeg(url)<br> .addInputOption('-rtsp_transport', 'tcp', '-buffer_size', '102400') // 这里可以添加一些 RTSP 优化的参数<br> // .outputOptions(['-vframes 1', '-fflags nobuffer', '-tune zerolatency']) // 每帧一张图<br> .videoCodec('png') // 输出 PNG 格式图片<br> .on('error', function (err, stdout, stderr) {<br> console.log('错误信息', err.message);<br> })<br> .on('end', function () {<br> console.log('结束' ,'Screenshots taken');<br> })<br> .on('codecData', function () {<br> console.log('codecData 事件', 'Stream codecData.')<br> })<br> .format("image2").noAudio().pipe().on('data', function(chunk) {<br> img.write(chunk)<br> console.log('ffmpeg just wrote ' + chunk.length + ' bytes');<br> });<br>

控制台信息
<br>$ node index.js<br>codecData 事件 Stream codecData.<br>ffmpeg just wrote 98304 bytes<br>ffmpeg just wrote 98304 bytes<br>ffmpeg just wrote 98304 bytes<br>ffmpeg just wrote 98304 bytes<br>ffmpeg just wrote 98304 bytes<br>ffmpeg just wrote 16017 bytes<br>错误信息 ffmpeg exited with code 1: av_interleaved_write_frame(): Invalid argument<br>frame= 10 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.08 bitrate=N/A speed=0.368x<br>video:1003kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown<br>Conversion failed!<br>


在Node.js中使用fluent-ffmpeg库处理视频并输出文件时,通常你需要确保ffmpeg已正确安装,并且fluent-ffmpeg的配置正确无误。以下是一个简单的示例,展示如何使用fluent-ffmpeg将输入视频文件转码并输出到新的文件。

首先,确保你已经安装了fluent-ffmpeg和ffmpeg:

npm install fluent-ffmpeg
# 安装ffmpeg,具体步骤根据你的操作系统而定

然后,你可以使用以下代码进行视频转码:

const ffmpeg = require('fluent-ffmpeg');
const ffmpegPath = require('ffmpeg-static'); // 如果ffmpeg不在系统PATH中,可以使用此模块获取ffmpeg路径
const inputFile = 'input.mp4';
const outputFile = 'output.avi';

ffmpeg(inputFile)
  .setFfmpegPath(ffmpegPath) // 如果需要指定ffmpeg路径
  .toFormat('avi')
  .on('start', commandLine => console.log(`Started: ${commandLine}`))
  .on('progress', progress => console.log(`Processing: ${progress.percent}% done`))
  .on('end', () => console.log('Processing finished !'))
  .on('error', err => console.error(`Error: ${err.message}`))
  .save(outputFile);

在这个例子中,input.mp4将被转码为output.avi。你可以通过.setFfmpegPath()方法指定ffmpeg的路径(如果ffmpeg不在系统的PATH环境变量中)。事件监听器.on('start'), .on('progress'), .on('end'), 和 .on('error') 用于处理不同阶段的回调。

确保你的输入文件路径和输出文件路径正确,并且你的Node.js环境有适当的权限访问这些路径。

回到顶部