NodeJS在filename中生成ffmpeg thumb%t

时间:2017-09-06 16:58:48

标签: javascript node.js terminal ffmpeg

我正在使用此NodeJS代码以15 fps创建屏幕截图:

var spawn   = require('child_process').spawn;
var args    = ['-ss', '00:00:07.86', '-i', 'filename.mp4', '-vf', 'fps=15', '/out%d.png'];
var ffmpeg  = spawn('ffmpeg', args);

这很好用,但我想要文件名中每个屏幕截图的时间戳。

来自FFMPEG docs:

  

%t扩展为时间戳

但是... ,'/out%t.png']失败并打印:

grep stderr: [image2 @ 0x7f828c802c00] Could not get frame filename 
number 2 from pattern '/Users/***/projects/out%t.png' (either set updatefirst or use a pattern like %03d within the filename pattern)
av_interleaved_write_frame(): Invalid argument
...
grep stderr: Conversion failed!

child process exited with code 1

所以这看起来不怎么样。

如何获取每个屏幕截图的时间戳?

由于

2 个答案:

答案 0 :(得分:0)

据我所知import com.sentiment360.pulse.services.HelloService; import org.springframework.context.annotation.Bean; public class SpringJUnitTestConfig { @Bean public HelloService getHelloService(){ return new HelloService(); } } 是你在这种情况下可以使用的唯一参数。 使用%d参数时,您可以使用%t作为报告文件名,但不能用于视频帧。

了解视频长度,开始时间(00:00:07.86)和FPS(15),您可以将文件名中的帧编号与帧时间戳匹配,并在-report完成提取帧后重命名所有文件。这肯定是一个丑陋的解决方法,但这是我唯一可以提出的......

答案 1 :(得分:0)

根据poohitan评论,我最终建立了一个解决方法,将生成的帧编号,开始时间和fps与实际帧时间戳相关联。

Video.frameToSec = function(imageName, start, fps) {
//    imageName => out209.png
    start = start || 0;

    var thenum = imageName.match(/\d/g);
    thenum = thenum.join('');

    var fps_sec = 1 / fps;

    var sec = thenum * fps_sec - fps_sec / 2 + start;

    return {imageName:imageName,sec:sec};
}

太糟糕的ffmpeg没有内置属性,因为在创建屏幕截图时,时间戳很重要。

无论如何,谢谢你的帮助!