来源:Python的乐趣
作者:一粒米
上一篇文章(python在手,女神视频易有)分享了利用AI人脸识别技术标记人物出现时间截取视频片段的教程。它的局限性是只能通过识别特定物体(比如人脸)来操作。在本文中,我们将分享一个工具,——PySceneDetect,用于按场景进行视频分割。
下面介绍一下PySceneDetect及其安装使用方法。
1. 什么是PySceneDetect
PySceneDetect是一个命令行工具和Python库,用于分析视频和查找场景变化或剪辑。
PySceneDetect集成了外部工具(如mkvmerge、ffmpeg),当使用split-video命令时,这些工具可以自动将视频分割成单独的片段。还可以为视频生成逐帧分析,称为统计文件,帮助确定最佳阈值或检测特定视频的模式/其他分析方法。
PySceneDetect使用两种主要的检测方法:detect-threshold(将每一帧与设定的黑电平进行比较,这对于检测从黑到黑的淡入淡出很有用)和detect-content(将每一帧进行比较,依次找到内容的变化,这对于检测视频场景之间的快速切换很有用,虽然处理速度较慢)。每种模式的参数略有不同,在文档中有详细描述。
一般来说,如果你想使用淡入/淡出/切入黑色来检测场景边界,请使用检测阈值模式。如果视频在内容之间使用了大量快速切换,并且没有明确定义的场景边界,则应使用“检测内容”模式。一旦您知道使用哪种检测模式,您就可以尝试以下建议的参数,或者生成一个统计文件(使用-s/stats参数)来确定正确的参数——特别是正确的阈值。
2. PySceneDetect的安装
PySceneDetect依赖于Python模块numpy、OpenCV(cv2模块)和tqdm(进度条模块,用于显示处理进度)。安装命令如下:
nbspPISTALLSCENEDETECEPYSCEEDECT基于ffmpeg和mkvmerge对视频进行剪切。
Ffmpeg是一个开源软件,可以录制、转换和流式传输各种格式的音频和视频。功能强大,应用广泛,是视频处理最常用的开源软件。
Mkvmerge是MKVToolNix中的一款软件,可以将多媒体文件打包、合并、混合成MKV文件。
安装后,可以通过命令行或代码使用它。
3. 命令行使用
PySceneDetect使用SceneDetect命令在命令行中操作。命令格式如下:
nbspscene detect-input my _ video . MP4-output my _ video _ scenes-stats mey _ video . stats . CSV detect-content list-scene save-images参数描述:
的常用参数描述如下:
input:输入视频文件的路径output:指定输出目录(可选)-stats:生成统计文件(可选)time:用于设置输入视频的时长/长度或开始/结束时间。检测内容:分割视频是基于内容检测算法。检测-阈值:分割视频是基于阈值检测算法。List-scenes:打印场景列表并输出到CSV文件。保存图像:保存视频中每个场景的图像。分割视频:使用ffmpeg或mkvMerge分割视频。可以使用scenedetect help all命令查看的完整参数列表。
示例:
nbsp场景检测-input demo . MP 4 detect-内容列表-场景保存-图像分割-视频运行后会在当前文件夹中生成视频剪辑、剪辑截图和csv文件,如下:
Demo-scene-001-01.jpgdemo-scene-004-03.jpg.demo-scene-001-02.jpgdemo-scene-004.mp4.demo-scenes.csv CSV文件包含帧、时间和片段长度以及内容等信息
time delist :00:7.9000333:7.600033333336.36 cenumberstartframestarttimecodes start time(秒)endframeendtimedeenddte . 3001333.
4. 在Python中使用
以下类主要用于使用PySceneDetect的Python中:
视频经理:用于加载视频并提供搜索;场景管理器:用于协调场景检测器,视频管理器和可选的StatsManager对象的高级管理器;帧时间码:用于存储时间码以及对时间码值进行算术运算(加/减/比较),并具有帧级的精确度;StatsManager:用于存储/缓存帧指标,以加快在同一视频上后续场景检测的运行速度,并可以保存到战斗支援车文件或从战斗支援车中加载缓存;场景探测器:用于实现检测算法的基类,如阈值检测器等。官方的示例代码如下:
从_ _ future _ _ import print _ functionimportsimportscenedetect。video _ managerimportvideomanagerfromscentetect。scene _ managerimportscenemanager。frame _ time delimportframetimedefromscedetect。stats _ managerfromscendetect。detectorsimportcontentdetectorstats _ FILE _ PATH=’测试视频。统计数据。CSV ‘ def main(): # create avideo _ managerpointtovideofiletestvideo。MP4。notnotethappendingmultiplevideos #要求帧速率。video _ manager=视频管理器([‘测试视频。MP4 ‘])stats _ manager=stats manager()scene _ manager=scene manager(stats _ manager)# AddContentDetectoralgorithm(construtortakesdetectroptionslikethreshold).场景_管理器。add _ detector(内容检测器())base _ time code=video _ manager。get _ base _ time code()try : # Ifstatsfileexists,loadit。ifos。路径。exists(STATS _ FILE _ PATH): # readstatsfromsvfileopenedinedreadmode 3360 with open(STATS _ FILE _ PATH,’ r ‘)as STATS _ FILE : STATS _ manager。load _ from _ CSV(STATS _ FILE,base _ time code)start _ time=base _ time get _ time code(),场景[0]。get_frames(),场景[1]。get_timecode(),场景[1]。get_frames(),))# weonlywritetostatsfileifasaveisrequired : if STATS _ manager。is _ save _ required(): with open(STATS _ FILE _ PATH,’ w ‘)as STATS _ FILE : STATS _ manager。save _ to _ CSV(STATS _ FILE,base _ time code)finally :视频_管理器。release()if _ _ name _ _==’ _ _ main _ _ ‘ : main()代码地址