python opencv输出mp4_Python玩转视频处理(四):视频按场景进行分割
在上一篇文章(python在手,女神視頻輕松有)分享了用AI人臉識(shí)別技術(shù)標(biāo)記人物出現(xiàn)時(shí)間點(diǎn)來(lái)截取視頻片段的教程,它的局限性在于只能通過(guò)識(shí)別特定的對(duì)象(比如人臉)來(lái)操作。在本文中將分享一個(gè)按場(chǎng)景進(jìn)行分割視頻的工具——PySceneDetect。
下面開(kāi)始介紹下PySceneDetect及其安裝使用方法。
1. 什么是PySceneDetect
PySceneDetect是一個(gè)命令行工具和Python庫(kù),用于分析視頻,查找場(chǎng)景更改或剪輯。
PySceneDetect集成了外部工具(例如mkvmerge , ffmpeg ),可在使用split-video命令時(shí)自動(dòng)將視頻分割為單個(gè)片段。還可以為視頻生成逐幀分析,稱為統(tǒng)計(jì)文件,以幫助確定最佳閾值或檢測(cè)特定視頻的模式/其他分析方法。
PySceneDetect使用兩種主要的檢測(cè)方法: detect-threshold (將每個(gè)幀與設(shè)置的黑電平進(jìn)行比較,對(duì)于檢測(cè)從黑色到黑色的淡入和淡出有用)和detect-content (比較每個(gè)幀,依次查找內(nèi)容的變化,有用)用于檢測(cè)視頻場(chǎng)景之間的快速切換,盡管處理速度較慢)。每種模式的參數(shù)略有不同,并在文檔中進(jìn)行了詳細(xì)說(shuō)明.。
通常,如果要使用淡入/淡出/切成黑色來(lái)檢測(cè)場(chǎng)景邊界,請(qǐng)使用檢測(cè)閾值模式。如果視頻在內(nèi)容之間使用大量快速剪切,并且沒(méi)有明確定義的場(chǎng)景邊界,則應(yīng)使用" 檢測(cè)內(nèi)容"模式。一旦知道要使用哪種檢測(cè)模式,就可以嘗試以下建議的參數(shù),或生成統(tǒng)計(jì)文件(使用-s / –stats參數(shù)),以確定正確的參數(shù)-具體來(lái)說(shuō),是正確的閾值.
2. PySceneDetect的安裝
PySceneDetect依賴于Python模塊numpy,OpenCV(cv2模塊)和tqdm(進(jìn)度條模塊,用來(lái)顯示處理進(jìn)度),安裝命令如下:
$ pip install scenedetectPySceneDetect基于ffmpeg和mkvmerge對(duì)視頻進(jìn)行裁剪。
ffmpeg 是一個(gè)開(kāi)源軟件,可以運(yùn)行音頻和視頻多種格式的錄影、轉(zhuǎn)換、流功能,它功能強(qiáng)大,用途廣泛,是視頻處理最常用的開(kāi)源軟件。mkvmerge是MKV工具集MKVToolNix中的一個(gè)軟件,可以將多媒體文件封裝、合并、混流為 MKV 文件。
安裝完成后可以通過(guò)命令行或代碼兩種方式進(jìn)行使用。
3. 命令行使用
PySceneDetect在命令行中使用scenedetect命令進(jìn)行操作,命令格式如下:
$ scenedetect --input my_video.mp4 --output my_video_scenes --stats my_video.stats.csv detect-content list-scenes save-images參數(shù)說(shuō)明:
常用的參數(shù)說(shuō)明如下:
- –input :輸入視頻文件的路徑
- –output :指定輸出目錄(可選)
- –stats:生成統(tǒng)計(jì)文件(可選)
- time:用于設(shè)置輸入視頻持續(xù)時(shí)間/長(zhǎng)度或開(kāi)始/結(jié)束時(shí)間。
- detect-content:切分視頻基于內(nèi)容檢測(cè)算法。
- detect-threshold:切分視頻基于閾值檢測(cè)算法。
- list-scenes:打印場(chǎng)景列表并輸出到CSV文件。
- save-images:為每個(gè)場(chǎng)景保存視頻中的圖像。
- split-video:使用ffmpeg或mkvMerge對(duì)視頻進(jìn)行分割。
完整的參數(shù)列表可使用scenedetect help all命令進(jìn)行查看。
示例:
$ scenedetect --input demo.mp4 detect-content list-scenes save-images split-video運(yùn)行完成后會(huì)在當(dāng)前文件夾生成視頻片段,片段截圖以及csv文件,如下:
demo-Scene-001-01.jpg demo-Scene-004-03.jpg ... demo-Scene-001-02.jpg demo-Scene-004.mp4 ... demo-Scenes.csvcsv文件中包含片段的幀、時(shí)間、長(zhǎng)度等信息,內(nèi)容如下:
Timecode List: 00:07.9 00:14.6 00:38.7 00:45.3 00:48.9 01:00.0 01:12.3 01:21.5 01:36.3 Scene Number Start Frame Start Timecode Start Time (seconds) End Frame End Timecode End Time (seconds) Length (frames) Length (timecode) Length (seconds) 1 0 00:00.0 0 190 00:07.9 7.917 190 00:07.9 7.917 2 190 00:07.9 7.917 350 00:14.6 14.583 160 00:06.7 6.667 3 350 00:14.6 14.583 928 00:38.7 38.667 578 00:24.1 24.083 ...4. 在Python中使用
在Python中使用PySceneDetect主要用到下面幾個(gè)類:
- VideoManager:用于加載視頻并提供搜索;
- SceneManager:用于協(xié)調(diào)SceneDetector,VideoManager和可選的StatsManager對(duì)象的高級(jí)管理器;
- FrameTimecode:用于存儲(chǔ)時(shí)間碼以及對(duì)時(shí)間碼值進(jìn)行算術(shù)運(yùn)算(加/減/比較),并具有幀級(jí)的精確度;
- StatsManager:用于存儲(chǔ)/緩存幀指標(biāo),以加快在同一視頻上后續(xù)場(chǎng)景檢測(cè)的運(yùn)行速度,并可以保存到CSV文件或從CSV中加載緩存;
- SceneDetector:用于實(shí)現(xiàn)檢測(cè)算法的基類,如ContentDetector,ThresholdDetector等。
官方的示例代碼如下:
from __future__ import print_function import osimport scenedetect from scenedetect.video_manager import VideoManager from scenedetect.scene_manager import SceneManager from scenedetect.frame_timecode import FrameTimecode from scenedetect.stats_manager import StatsManager from scenedetect.detectors import ContentDetectorSTATS_FILE_PATH = 'testvideo.stats.csv'def main():# Create a video_manager point to video file testvideo.mp4. Note that multiple# videos can be appended by simply specifying more file paths in the list# passed to the VideoManager constructor. Note that appending multiple videos# requires that they all have the same frame size, and optionally, framerate.video_manager = VideoManager(['testvideo.mp4'])stats_manager = StatsManager()scene_manager = SceneManager(stats_manager)# Add ContentDetector algorithm (constructor takes detector options like threshold).scene_manager.add_detector(ContentDetector())base_timecode = video_manager.get_base_timecode()try:# If stats file exists, load it.if os.path.exists(STATS_FILE_PATH):# Read stats from CSV file opened in read mode:with open(STATS_FILE_PATH, 'r') as stats_file:stats_manager.load_from_csv(stats_file, base_timecode)start_time = base_timecode + 20 # 00:00:00.667end_time = base_timecode + 20.0 # 00:00:20.000# Set video_manager duration to read frames from 00:00:00 to 00:00:20.video_manager.set_duration(start_time=start_time, end_time=end_time)# Set downscale factor to improve processing speed.video_manager.set_downscale_factor()# Start video_manager.video_manager.start()# Perform scene detection on video_manager.scene_manager.detect_scenes(frame_source=video_manager)# Obtain list of detected scenes.scene_list = scene_manager.get_scene_list(base_timecode)# Like FrameTimecodes, each scene in the scene_list can be sorted if the# list of scenes becomes unsorted.print('List of scenes obtained:')for i, scene in enumerate(scene_list):print(' Scene %2d: Start %s / Frame %d, End %s / Frame %d' % (i+1,scene[0].get_timecode(), scene[0].get_frames(),scene[1].get_timecode(), scene[1].get_frames(),))# We only write to the stats file if a save is required:if stats_manager.is_save_required():with open(STATS_FILE_PATH, 'w') as stats_file:stats_manager.save_to_csv(stats_file, base_timecode)finally:video_manager.release()if __name__ == "__main__":main() Python Interface & Integration With Other Applications?pyscenedetect.readthedocs.io總結(jié)
以上是生活随笔為你收集整理的python opencv输出mp4_Python玩转视频处理(四):视频按场景进行分割的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vue项目(webpack+mintui
- 下一篇: Java微信公众号开发-外网映射工具配置