我正在尝试从IP cam的短片段中提取图像帧。特别是这个片段。
http://db.tt/GQwu0nZ8
所以,我试图用ffmpeg提取那些帧。
ffmpeg -i M00001.jpg -vcodec mjpeg -f image2 image%03d.jpg
我只是得到剪辑的第一帧。我怎样才能得到剩下的帧?我可以使用其他工具来获取图像吗?
谢谢
答案 0 :(得分:0)
ffmpeg
的命令工作正常,但您需要将mjpeg视频指定为输入文件。如果M00001.jpg
是单个jpg图像,那么您将只获得一个(相同)输出图像。
答案 1 :(得分:0)
这可能太多但是这里是Node.js https://nodejs.org/的一个简短的javascript程序,它将删除所有可读帧并将它们保存为当前目录中单独的顺序编号的jpg文件。请注意,即使是短视频剪辑也可以生成数千个帧,而Node使用的V8 javascript引擎非常快,所以我建议关闭文件浏览器,因为它会占用资源并试图跟上。
如果视频文件太大而无法为其创建缓冲区,则Node会发出错误并退出。
在这种情况下,最简单的方法是使用shell实用程序或像HexEdit这样的程序将文件拆分为块。 http://www.hexedit.com/
重写此代码以异步处理文件将解决该问题,但编写异步代码仍然让我感到焦虑。
var orgFile=process.cwd()+"/"+process.argv[2]; //Grab the video filename from the command line
var fs = require("fs"); //Load the filesystem module
var stats = fs.statSync(orgFile);//Get stats of video file
var fileSizeInBytes = stats["size"];//Get video file size from stats
var fdata=new Buffer(fileSizeInBytes);//Create a new buffer to hold the video data
var i=0;
var fStart=0;
var fStop=0;
var fCount=0;
fdata=fs.readFileSync(orgFile);//Read the video file into the buffer
//This section looks for the markers at the begining and end of each jpg image
//records their positions and then writes them as separate files.
while (i<fileSizeInBytes){
if (fdata[i]==0xFF){
//console.log("Found FF at "+i.toString);
if (fdata[i+1]==0xD8){
//console.log("Found D8 at "+(i+1).toString);
if (fdata[i+2]==0xFF){
//console.log("Found FF at "+(i+2).toString);
fStart=i;
}
}
}
if (fStart>0){
if (fdata[i]==0xFF){
if(fdata[i+1]==0xD9){
fStop=i+1;
}
}
if (fStart>0){
if (fStop>0){
fCount++;
fs.writeFileSync(orgFile+"."+fCount.toString()+".jpg",fdata.slice(fStart,fStop));
console.log (orgFile+"."+fCount.toString()+".jpg");
fStart=0;
fStop=0;
}
}
}
i++;
}
console.log ("Wrote "+fCount.toString()+" frames.");
如果将上述代码保存为mjpeg_parse.js,则调用示例为:
节点mjepeg_parse.js videofile.avi