我正在使用此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
所以这看起来不怎么样。
如何获取每个屏幕截图的时间戳?
由于
答案 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没有内置属性,因为在创建屏幕截图时,时间戳很重要。
无论如何,谢谢你的帮助!