视频媒体批量重命名工具
1.Abstract
编程语言:Matlab、python
思路:利用python获取视频创建时间,通过Matlab实现对视频关键帧的读取与显示,以及对于用户打标信息与视频创建时间的结合来实现重命名。
用到的工具:VideoReader(MatLab)、pymediainfo(python)
2. Intro
在实际的工作中,遇到视频素材批量从机器导出的情况。由于素材太多,逐一打开检查内容不现实。有些电脑生成缩略图又不清晰,并且还需要自己手动对所有文件进行重命名。为了解决上述问题,实现对于大量视频文件的批量打标,故做了如下工作。文章根据不同的部分及在这个部分实现的过程中遇到的问题进行讲解。遇到需要补充的资源将后附。
3. 需求分析
在平常的工作生活中会有大量的视频素材需要收集与整理。我需要的信息是类似于照片管理一样的,含有文件拍摄时间、地点等信息。由于不是所有的文件系统都能生成可看的缩略图,这就使得不能快速的了解视频的内容。所以,我希望能在文件名中就能直接看到上述的信息。为了获取视频文件的拍摄时间,我选择使用python中的pymediainfo来对文件信息进行读取并且选择自己需要的信息。对于地点信息,由于拍摄设备并没有记录的功能,所以我选择使用Matlab的VideoReader来对视频中的某一帧进行读取、显示;由用户来标注地点以及简要内容。这也能够很简单的读取含有场记信息的关键帧,便于后期人员的处理。在确定了需求与方法后,就是实现过程。
4. python部分
def infoget(FilePath):
from pymediainfo import MediaInfo
media_info = MediaInfo.parse(FilePath)
data = media_info.to_data()
info=data["tracks"][0]["file_last_modification_date__local"]
return info
这里通过封装函数的方法来实现对于视频信息的获取。在L4中得到的data数据含有很多视频的信息,可以根据自己的需求进行获取。如果需要自行DIY,可以先解析这里面的所有信息,再选取你需要的信息。而我这里直接选取的是“file_last_modification_date__local”来作为视频文件的创建时间。注意这里选取的是你的机内时间,也就是说你需要把你的相机时间在一开始就设置正确。这里获取出来的时间文本为(示例):2022-04-14 17:40:24.000
为了方便看字符处理效果,我选择将这个字符串直接回传到Matlab中进行规范化处理。pymedia的安装可以直接使用pip,这里不做赘述。
5. Matlab部分
在Matlab中我选择使用三个.m文件来实现功能。getpic来实现对于对于时间、关键帧的获取;而dealvideo_2负责显示关键帧、收集用户打标信息,在vidmainop中完成对前两个函数的调用以及对文件的重命名。
5.1 时间、关键帧的获取
function [time,piclocation,vidlocation,totalnum]=getpic(FilePath)
%%初始化
finloca = [FilePath,'\*.mp4'];
%检索并列表
File= dir (finloca);
viddata = {File.name};totalnum = length(viddata);
%三个cell的初始化
piclocation =cell(1,totalnum);vidlocation=cell(1,totalnum);
time=cell(1,totalnum);
%对每个文件进行处理
for i = 1:totalnum
vidlocation{i} = [FilePath,'\',viddata{i}];
piclocation{i} = [FilePath,'\',viddata{i}(1:end-4),'_1.jpg'];
vidobj = VideoReader(vidlocation{i});
pic1 = read(vidobj,[1]);imwrite(pic1,piclocation{i});
%获取、处理时间信息
str = py.info.infoget(vidlocation{i});
str = char(str(1:end-4));
k = strfind(str,' ');str(k) = '_';
k = strfind(str,'-');str(k) = '';
k = strfind(str,':');str(k) = '_';
time{i} = str;
end
disp('缩略图处理完成')
end
这里对于FilePath下的所有MP4文件进行检索,并获取文件名、数量。
在使用VideoReader获取视频流,然后使用read来读取指定帧。如果需要读取指定时间点的帧,则需要使用时间与帧率进行换算。然后使用imwrite将帧以“文件名+_1.jpg”的格式储存到文件夹内。
然后***py.info.infoget(vidlocation{i})***实现了对于info.py的调用。这里的格式是“py.文件名.函数名(参数)”。然后就会得到前面的时间信息字符串。这里的字符串会被Matlab识别为pystr,所以我们需要转换格式,以防后期处理出错。对于时间信息:2022-04-14 17:40:24.000,我们需要注意的是,这里的空格以及“-“在文件名中都是非法的,所以我在后面对于这些字符进行了替换。对事件的截取是为了保证文件名的长度合理,并且对于秒之后的信息忽略也不会导致两个文件重名。处理后的形式为:“20220414_17_40_24”。在这里,如果视频文件是高分辨率,并且你选取的关键帧位于较后的时序,这会明显增加这个环节的处理时间。所以我建议只取第一帧。如果有特殊需求,我也设置了一个提示信息。1
函数回传的参数有:time,piclocation,vidlocation:时间,所有图片、视频路径;totalnum总的文件数量。
5.2 信息收集
function [vidloca,videvent]=dealvideo_2(piclocation,totalnum)
%完成对图片以及视频的检索
%初始化
vidloca =cell(1,totalnum);videvent=cell(1,totalnum);
%打标工作
for i = 1:totalnum
pic = imshow(piclocation{i});
showtext = strcat("请输入地点(精确)/事件",num2str(i),":\n");
k=[];
while isempty(k)
sort = input(showtext,'s');
k = strfind(sort,'/');
end
if isempty(k)
disp('NONE')
else
info = strsplit(sort,'/');
vidloca{i} = info{1};videvent{i}= info{2};
end
close all;
end
简单的信息处理与储存。主要是通过显示关键帧,然后请求用户的输入。在这里增加了数据的验证。
5.3重命名
%%初始化
clc;clear;
FilePath = 'D:\xx';
[time,piclocation,vidlocation,totalnum] = getpic(FilePath);
[vidloca,videvent]=dealvideo_2(piclocation,totalnum);
%finalname = cell(1:totalnum);
for i = 1:totalnum
finalname = strcat(time{i},'_',vidloca{i},'_',videvent{i},'.MP4');
newname = strcat(FilePath,'\',finalname);
movefile(vidlocation{i},newname);
end
这里需要输入你的视频储存文件夹”FilePath = ‘D:\xx’;“
6.环境的配置
在这个过程中可能会存在问题的是1、Matlab对于python的调用;2、Matlab中Videoreader的配置
6.1 Matlab对于python的调用
1、手动添加python路径
pyversion \python解释器路径
这里需要注意的是Matlab与python的位数必须一样。再使用pyversion来检查是否正确初始化,正确的话会有如下输出
version: '3.9'
executable: 'C:\Users\Administrator\AppData\Local\Programs\Python\Python39\pythonw.exe'
library: 'C:\Users\Administrator\AppData\Local\Programs\Python\Python39\python39.dll'
home: 'C:\Users\Administrator\AppData\Local\Programs\Python\Python39'
isloaded: 1
正确的话就能使用python函数。这里建议把py文件和m文件放在同一文件夹下。如果在调试的过程中对python文件修改了,则需要对文件进行重载,但是在正常的运行中不需要。
6.2 Matlab中Videoreader的配置
在使用videoreader函数读取MP4视频文件时会有提示无法初始化内部资源;需要安装ffmpeg与对应操作系统的codecs。
这里具体的步骤有已经给出的解决方案,详见这篇文章:
https://blog.csdn.net/fzq_yu/article/details/110731098
对于原文中第四步中安装codecs,我在这里给出win10对应的安装包,各位自行取用。
链接:https://pan.baidu.com/s/1tinOnR8EjK9xUTERr1ywWQ
提取码:1949
--来自百度网盘超级会员V4的分享
7.Conclusion
通过这个Matlab能实现对大数量的视频文件进行半自动化处理,能将文件信息直观地展示在文件名中。
这里可以通过文件转换来实现降低清晰的方案来满足特殊关键帧读取的需求; ↩︎