You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ffmpeg.js实现视频底部黑帧检测功能失败,寻求技术解决方法

问题描述

我有一段能从视频底部采样检测黑帧的FFmpeg脚本,现在想用JavaScript(Node.js)实现相同功能,但写的代码跑不起来。

原FFmpeg脚本:

ffmpeg -i LKE-BLACK.mp4 -vf "blackdetect=d=0.5:pix_th=0.10" -an -f null - 2>&1 | findstr blackdetect > output.txt

我的Node.js代码:

var fs = require('fs');
const ffmpeg = require("ffmpeg.js");

var createStream = fs.createWriteStream("data.txt");
createStream.end();

const transcode = async ({ target: { files }  }) => {
    message.innerHTML = 'Loading ffmpeg-core.js';
    await ffmpeg.load();
    message.innerHTML = 'Start transcoding';
    
    await ffmpeg.transcode('-i', 'LKE-BLACK.mp4', "-vf", "blackdetect=d=0.5:pix_th=0.10", '-an', '-f', 'null - 2>&1', );
    message.innerHTML = 'Complete transcoding';

    fs.writeFile("data.txt", function (err) {
        if (err) throw err;
        console.log('File is created successfully.');
      });
}

问题分析与修复

你的Node.js代码存在几个核心问题,以下是针对性的修复方案:

1. FFmpeg参数格式错误

ffmpeg.js的transcode/run方法不支持Shell风格的重定向(2>&1)和管道语法,且参数必须拆分传递——不能把null -合并成一个参数,要拆成'null'和'-'两个独立项。

2. 未捕获与处理检测输出

原FFmpeg脚本是从stderr中提取blackdetect相关日志,但你的代码既没捕获ffmpeg.js的输出,也没做过滤逻辑,最后还写入了空文件。

3. 环境与逻辑不匹配

  • message变量是浏览器DOM元素,Node.js环境下不存在,需替换为控制台输出;
  • transcode函数的参数结构是浏览器文件上传场景的格式,Node.js环境不需要,直接传入视频路径即可;
  • fs.writeFile缺少要写入的内容,只会生成空文件。

修复后的完整代码

const fs = require('fs');
const ffmpeg = require("ffmpeg.js");

const detectBlackFrames = async (inputPath) => {
    console.log('Loading ffmpeg-core.js');
    await ffmpeg.load();
    console.log('Start black frame detection');

    // 拆分正确的FFmpeg参数
    const args = [
        '-i', inputPath,
        '-vf', 'blackdetect=d=0.5:pix_th=0.10',
        '-an',
        '-f', 'null',
        '-' // 将输出定向到stdout
    ];

    // 执行FFmpeg命令,捕获stderr输出(blackdetect日志默认输出到stderr)
    const result = await ffmpeg.run(args);
    // 过滤出包含blackdetect的行
    const blackDetectLogs = result.stderr.split('\n').filter(line => line.includes('blackdetect'));
    const outputContent = blackDetectLogs.join('\n');

    // 将结果写入文件
    fs.writeFileSync('data.txt', outputContent);
    console.log('Detection completed, result saved to data.txt');
};

// 调用检测函数,传入目标视频路径
detectBlackFrames('LKE-BLACK.mp4');

针对“底部采样”的补充说明

如果原FFmpeg脚本是仅检测视频底部区域的黑帧(而非全画面),需要在blackdetect前添加裁剪滤镜。例如只检测视频底部10%的区域:
对应的FFmpeg命令修改为:

ffmpeg -i LKE-BLACK.mp4 -vf "crop=iw:ih*0.10:0:ih*0.90,blackdetect=d=0.5:pix_th=0.10" -an -f null - 2>&1 | findstr blackdetect > output.txt

Node.js代码中的-vf参数同步修改为:

'-vf', 'crop=iw:ih*0.10:0:ih*0.90,blackdetect=d=0.5:pix_th=0.10',

内容的提问来源于stack exchange,提问作者sol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:13:36