Как пакетно переименовать видеофайлы с информацией о качестве, используя python? - PullRequest
0 голосов
/ 29 марта 2020

Я пытался написать программу для переименования всех видеофайлов в папке. Я просто хотел добавить качество видео или размер, например (720p) или (1080p) или что-то подобное, в конец текущего имени файла. Но я получаю следующую ошибку:

Traceback (most recent call last):
  File "f:\Python Projects\Practice\mm.py", line 17, in <module>
    os.rename(file_name, f'{file_title} ({height}p){file_extension}')
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'Video 1.mp4' -> 'Video 1 (1080p).mp4'

Вот мой код:

import os
from cv2 import cv2

os.chdir(r'F:\Python Projects\Practice\Temp Files')

for file_name in os.listdir():
    # Getting Video Resolution
    with open(file_name, 'r') as f:
        f_string = str(f).split('\'')[1]
        video_path = f'F:\\Python Projects\\Practice\\Temp Files\\{f_string}'
        video = cv2.VideoCapture(video_path)
        height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))

    # Getting the title
    file_title, file_extension = os.path.splitext(file_name)
    os.rename(file_name, f'{file_title} ({height}p){file_extension}')

Может кто-нибудь сказать мне, как я могу решить эту проблему? Заранее спасибо ...:)

Ответы [ 3 ]

1 голос
/ 29 марта 2020

Проблема в том, что cv2.VideoCapture(video_path) открывает и ваш файл. Поскольку этот объект продолжает существовать, файл все еще открыт (даже если он больше не находится на вашем open(...) as f: после выхода из блока with.)

Итак, вы должны сделать это явно с помощью:

video.release()
1 голос
/ 29 марта 2020

Как то так. Проверено. Используйте

video.release() 

, чтобы закрыть файл, открытый с помощью cv2.

import os
from cv2 import cv2

os.chdir(r'F:\Python Projects\Practice\Temp Files')

for file_name in os.listdir():
    # Getting Video Resolution

    f = open(file_name, 'r')
    f_string = str(f).split('\'')[1]
    f.close()

    video_path = f'F:\\Python Projects\\Practice\\Temp Files\\{f_string}'
    video = cv2.VideoCapture(video_path)
    height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    video.release()

    # Getting the title
    file_title, file_extension = os.path.splitext(file_name)
    os.rename(file_name, f'{file_title} ({height}p){file_extension}')
0 голосов
/ 29 марта 2020

Я упростил код, и он работает довольно хорошо. Я делюсь своим кодом здесь. Если кто-то получит пользу от моего кода, это будет предметом гордости для меня ...:)

import os
from cv2 import cv2

video_folder = r'F:\Python Projects\Practice\Temp Files'
os.chdir(video_folder)

for file_name in os.listdir():
    # Getting video quality
    video_path = f'{video_folder}\\{file_name}'
    video = cv2.VideoCapture(video_path)
    width = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    video.release()

    # Getting title
    file_title, file_extension = os.path.splitext(file_name)
    new_file_name = f'{file_title} ({width}p){file_extension}'

    # Renaming the file
    os.rename(file_name, new_file_name)

print('Rename Successful!')
...