Python自制日常办公辅助工具之:批量视频截图,子集固定尺寸截图+序列化命名
Python自制日常辦公輔助工具之:批量視頻截圖
本人大學(xué)時(shí)期有一定的代碼基礎(chǔ),但畢業(yè)這么多年幾乎都快忘完了,從事的也是非技術(shù)行業(yè)。最近因?yàn)楣ぷ餍枰匦聫牧汩_(kāi)始學(xué)習(xí)Python基礎(chǔ)小知識(shí),用于輔助日常辦公。不足頗多,見(jiàn)笑之處還望包涵,個(gè)人博客也只是用于學(xué)習(xí)記錄。
文章目錄
- Python自制日常辦公輔助工具之:批量視頻截圖
- 解決需求
- 一、思路是什么?
- 二、代碼
- 1.引入庫(kù)
- 2.確認(rèn)操作的視頻節(jié)目
- 3.定義好截圖方法def ResizeImage
- 4.for循環(huán)執(zhí)行
- 5.調(diào)用方法改成所需要的尺寸
- 測(cè)試運(yùn)行
- 總結(jié)
解決需求
將一批節(jié)目?jī)?nèi)的各條視頻進(jìn)行批量截圖,設(shè)置固定尺寸和具體時(shí)間點(diǎn),同時(shí)生成在指定路徑中對(duì)應(yīng)的節(jié)目文件夾內(nèi)
一、思路是什么?
for循環(huán)依次執(zhí)行:1、打開(kāi)視頻 2、設(shè)置截圖尺寸 3、完成截圖并存儲(chǔ)至對(duì)應(yīng)文件夾
二、代碼
1.引入庫(kù)
視頻操作涉及的庫(kù)如下:可以從Pycharm軟件內(nèi)嵌入,也可以直接下載對(duì)應(yīng)版本的whl文件直接在根目錄運(yùn)行安裝。個(gè)人感覺(jué)后者更方便點(diǎn),只是要注意下載對(duì)應(yīng)的python版本和放在正確的路徑下安裝
import cv2 import os from natsort import natsorted,ns from PIL import Image2.確認(rèn)操作的視頻節(jié)目
代碼如下(示例):
path = r'E:\1' source_path = r'Y:/out/天津高清/【2022年節(jié)目】/' dirnames = [f for f in os.listdir(path) if os.path.isdir(path + '\\' + f)] print(dirnames)將要操作的節(jié)目文件夾先在E:\1內(nèi)建立空的文件夾,僅用于獲取文件夾名稱數(shù)組(dirnames)
節(jié)目原始存放路徑為source_path,如下圖,節(jié)目庫(kù)內(nèi)數(shù)量很多,每個(gè)節(jié)目?jī)?nèi)約有20+視頻子集,但這邊僅操作3部節(jié)目的視頻截圖作為參考。
因此E:\1內(nèi)僅建三個(gè)空的文件夾:
3.定義好截圖方法def ResizeImage
代碼如下(示例):
def ResizeImage(filein, width, height):img = Image.open(filein)out = img.resize((width, height),Image.ANTIALIAS) #resize image with high-qualityout.save(filein)filein 為視頻路徑,width以及height為要截取的視頻寬高。調(diào)用Image內(nèi)的resize方法進(jìn)行截取。要注意reSize的方法邏輯更多的是改變圖片的尺寸大小,即截取視頻全屏畫面然后進(jìn)行對(duì)應(yīng)尺寸的縮小。和平常使用的微信截圖或者手機(jī)自定義截圖不太一樣,簡(jiǎn)單來(lái)說(shuō)就是截屏改尺寸。
關(guān)于精確到具體位置的視頻截圖后續(xù)可以再深入研究。
4.for循環(huán)執(zhí)行
代碼如下(示例):
for dir_name in dirnames:target_path = os.path.abspath(r'E:\2' + '\\' + dir_name)if not os.path.exists(target_path):# 如果目標(biāo)路徑不存在原文件夾的話就創(chuàng)建os.makedirs(target_path)filepath = source_path+dir_namepathDir = os.listdir(filepath)pathDir1 = natsorted(pathDir,alg=ns.PATH)print(pathDir1)i=0for allDir in pathDir1:i+=1try:vc = cv2.VideoCapture(filepath+'/'+ allDir) # 讀取視頻vc.set(cv2.CAP_PROP_POS_MSEC, 25000) # 設(shè)置讀取位置,1000毫秒rval, frame = vc.read() # 讀取當(dāng)前幀,rval用于判斷讀取是否成功if rval:cv2.imencode('.jpg', frame)[1].tofile(target_path+ '\\'+str(i)+'.jpg') # 將當(dāng)前幀作為圖片保存到 cover_pathelse:print("讀取失敗")except Exception as e:print(f"獲取視頻封面圖失敗: {e}")第一段for循環(huán)是按節(jié)目運(yùn)行,i計(jì)數(shù)用于命名。
同時(shí)定義截圖存儲(chǔ)的目標(biāo)路徑,并在目標(biāo)路徑創(chuàng)建對(duì)應(yīng)的節(jié)目名文件夾。
filepath為節(jié)目?jī)?nèi)單條視頻的路徑名,通過(guò)natsorted()方法將pathDir子集數(shù)組進(jìn)行排序。
第二段就是開(kāi)始循環(huán)嵌套了,按單個(gè)節(jié)目?jī)?nèi)各個(gè)子集運(yùn)行截圖操作。
try except 設(shè)置拋出異常,防止連續(xù)中斷影響效率
用cv包內(nèi)的VideoCapture方法讀取視頻,設(shè)置視頻時(shí)長(zhǎng)位置,25000毫秒及視頻第25秒處,讀取當(dāng)前幀。
imencode方法將幀保存到指定路徑中,由于i計(jì)數(shù)的存在,第一集就會(huì)被命名1.jpg
5.調(diào)用方法改成所需要的尺寸
代碼如下(示例):
filein = target_path + '\\' + str(i) + '.jpg'#fileout = target_path + '\\' + allDir + '.png'width = 408height = 230#type = 'png'ResizeImage(filein, width, height)這邊設(shè)置寬408,高230。執(zhí)行ResizeImage()方法。
要注意的是調(diào)用方法因放在嵌套的循環(huán)內(nèi),否則就容易報(bào)錯(cuò)了。
測(cè)試運(yùn)行
效果如下:
E:\2成功創(chuàng)建拷貝的文件夾
三個(gè)文件夾內(nèi)全部子集的截圖已生成,并將子集以序列命名。
查看圖片屬性,為設(shè)置好的480*230
總結(jié)
測(cè)試運(yùn)行僅是三個(gè)節(jié)目文件,日常工作可能就會(huì)遇到成百上千的截圖需求,當(dāng)然一些軟件也可以做到批量圖片截圖。
但使用python基礎(chǔ)方法進(jìn)行解決還可以加入自己想要的一些要求,例如固定命名為1.2.3.4…的序列化命名。
后期會(huì)嘗試將完成的子集截圖加上文字描述。
總結(jié)
以上是生活随笔為你收集整理的Python自制日常办公辅助工具之:批量视频截图,子集固定尺寸截图+序列化命名的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于睡眠分期中人工判读的一些个人总结
- 下一篇: 阈值分割python实现