python3遞歸方法批量處理avi文件成jpg圖片

生活中或工作中都有遇到需要將某個視頻轉成圖片。一兩個視頻文件或十幾個視頻文件還好,但是當上百個視頻文件且還不在一個文件夾下存放,還需要轉好的圖可以按照原來的路徑存放,這就是一個麻煩又費時間的事情了。試着在網上找了代碼,但都運行不起來,因此寫了這麼個程序來批量處理這些視頻文件。

編碼語言:python python3
文件類型:avi
目錄結構:D:/a/b/c/xxxxx.avi,a層目錄下有多個不同的b文件夾,b層目錄下又有多個不同的c文件夾,c文件夾下又有多個不同的avi文件

需求:avi視頻按幀轉圖,轉出來的圖片需要放在與avi文件同名的文件夾下,並且目錄結構必須保證不變。

import cv2
import os

# 遞歸方法訪問文件並按照文件夾及文件名稱新建對應的新文件夾
# 轉換avi文件爲jpg圖,當前程序缺點:視頻切割的圖片有重複圖片存在。

def close_VideoCapture(cap):
    cap.release()

def load_avi_file_sid_cid_time(video_filename):
    try:

        cap = cv2.VideoCapture(video_filename)
        if cap.isOpened():
            return cap
        else:
            print("load avi file failed!\n")
            return None
    except:
        return None
def search_avi_and_get_frame(path1,savepath):

    for filename in os.listdir(path1):
        if os.path.isdir(os.path.join(path1,filename)):
            path1_ = os.path.join(path1,filename)
            savepath_ = os.path.join(savepath,filename)
            search_avi_and_get_frame(path1_,savepath_)
            print('is dir',filename)
        elif filename[0] == '.':
            print('is . continue')
            continue
        else:
            print(filename)
            firstname,lastname =filename.split('.')[0],filename.split('.')[1]
            # print(firstname,lastname)
            if lastname == 'avi':
                # try:
                    # new_dir = savepath+'\\' + newmakedirname
                    newmakedir = os.path.join(savepath,firstname)
                    # newmakedir = os.path.join(new_dir, firstname)
                    if not os.path.exists(newmakedir):
                        os.makedirs(newmakedir)
                    cap = load_avi_file_sid_cid_time(os.path.join(path1,filename))
                    startframe = 1
                    skipframe = 1
                    while cap:
                        # 以幀率的形式進行抽幀
                        cap.set(cv2.CAP_PROP_POS_FRAMES, startframe)
                        ret, frame = cap.read()
                        if ret:
                            cv2.imwrite(os.path.join(newmakedir,'{}.jpg'.format(startframe)), frame)
                            startframe += skipframe
                        else:
                            close_VideoCapture(cap)
                            break
                # except:
                #     print('errorfile',filename)

if __name__ == '__main__':
    # avi文件存放的根目錄
    path_ = r'D:\test\a'
    #需要存放jpg圖的根目錄
    savepath_ = r'D:\test\jpg'
    search_avi_and_get_frame(path_,savepath_)

只要你的環境等沒問題可以直接複製來用,不過需要注意的是這裏的路徑不要出現中文否則圖片保存不下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章