网上可以找到将ppt转为视频,没看到到视频转为ppt。想去找一些ppt形式的绘本,甚至pdf的绘本都没有找到,但发现不少绘本以视频的形式存在,就想着能不能将视频转为ppt。基本思路很简单将视频的每一帧,按照固定的间隔转换为图片,然后用图片再生成ppt
利用matlab的VideoReader可以很容易读取视频数据,代码Video2Image2函数参考自
https://blog.csdn.net/lingyunxianhe/article/details/83543282
在我的matlab2018的环境下运行出错,稍微做了一点改动
%auto ppt
Path = "D:\";%视频的路径
VideoPath = Path;%图片的保存路径
VideoName = "szxz";%视频的名称,未加后缀,主要是作为图片保存的前缀
VideoPath = strcat(Path,VideoName);%视频的路径
VideoPath = strcat(VideoPath,".mp4");%视频的完整路径
Video2Image2(VideoPath,Path,VideoName,60,20);
%VideoPath,ImageSaveFolder,ImNamePre,ImSpanNum,StartId
%VideoPath ---视频的路径
%ImageSaveFolder ---图片保存路径
%ImNamePre ---图片保存的前缀
%ImSpanNum ---每间隔ImSpanNum帧保存图像
%StartId ---起始保存帧
function Video2Image2(VideoPath,ImageSaveFolder,ImNamePre,ImSpanNum,StartId)
ImageSaveForm='.jpg';
ObjImSize=[480,640];
%获取视频信息
vidObj= VideoReader(VideoPath);
%把上面保存的信息写入图片中去
if ~exist(ImageSaveFolder,'dir')
mkdir(ImageSaveFolder);
end
IsExtractPointStartId=false;%从指定的帧号开始提取图片
CurFrameId=0;
PreFrameId=0;
MyFrame = 0;
while hasFrame(vidObj)
Image = readFrame(vidObj);
CurFrameId=CurFrameId+1;
if (~IsExtractPointStartId)&&(CurFrameId==StartId)
IsExtractPointStartId=true;
PreFrameId=CurFrameId;
Image=imresize(Image,ObjImSize);
%按指定格式保存到指定的文件夹
ImageName=sprintf('%s%d%s',ImNamePre,MyFrame,ImageSaveForm);
ImagePath=fullfile(ImageSaveFolder,ImageName);
ImagePath = sprintf('%s',ImagePath);
imwrite(Image,ImagePath);
MyFrame = MyFrame + 1;
continue;
end
if ((CurFrameId-PreFrameId)==ImSpanNum)
PreFrameId=CurFrameId;
Image=imresize(Image,ObjImSize);
%按指定格式保存到指定的文件夹
ImageName=sprintf('%s%d%s',ImNamePre,MyFrame,ImageSaveForm);
ImagePath=fullfile(ImageSaveFolder,ImageName);
ImagePath = sprintf('%s',ImagePath);
imwrite(Image,ImagePath);
MyFrame = MyFrame + 1;
end
end
end
得到图像后,用FreePic2Pdf将图片转为pdf,即可在电脑上播放
从上图可以看到,由于是固定帧数间隔的保存图像,里面包含了不少重复的图片。简单的做法可以直接手动删除,虽然low了一些,工作量不大。另外一个思路是用图像减法,相邻的两帧做一个减法,看看图像的差距。如果差距大,说明帧与帧之间存在差异,说明视频的图像变动了,以此为契机,保存当前帧,寻找下一个变化的图像,直到视频结束。代码没什么难度,懒得实现。