중복된 비디오(.mp4) 파일을 찾고 삭제하는 방법은 무엇입니까? [폐쇄]

중복된 비디오(.mp4) 파일을 찾고 삭제하는 방법은 무엇입니까? [폐쇄]

저는 16,000개 이상의 짧은 비디오 클립을 가지고 있으며 그 중 대부분은 인간의 눈과 동일하게 보이지만 자세히 살펴보면 둘 중 하나의 시작 또는 종료 시간이 1초(또는 그 이하) 더 길어질 수 있음을 알 수 있습니다.

여러 가지 방법을 시도했지만 중복 항목을 찾는데 성공하지 못했습니다. 바이트가 너무 작기 때문에 정확한 바이트 크기를 비교하는 것만으로도 충분하다고 생각할 수도 있습니다. 하지만! 이 작업이 수행되지 않는 이유는 비디오 클립의 시작 또는 끝 부분에 약간의 추가(또는 추가가 아닌) 몇 밀리초가 있을 수 있기 때문입니다. 이로 인해 서로 다르고 동일하지 않게 되어 "바이트별 비교"를 사용하는 중복된 파인더 결과가 중복되지 않게 됩니다.

대부분의 비디오 클립은 다른 여러 비디오 클립과 동일했지만 비교된 .mp4 파일의 시작과 끝 부분에 몇 밀리초의 차이가 있었기 때문에 중복된 비디오 클립을 찾는 방법을 사용하지 않았습니다.

짧은 비디오 클립 .mp4 파일의 복사본을 성공적으로 찾는 방법을 아는 사람이 있습니까? 평균적으로 각 시간은 약 30초이지만 다른 시간과 비교하면 그 차이는 몇 밀리초에 불과합니다. 사람의 눈에는 이것이 완전히 똑같아 보일 것이므로 중복된 콘텐츠가 보이지만 16,000개 이상의 비디오 클립을 직접 보고 비교하고 싶지는 않습니다.

어떤 제안이 있으십니까?


내 질문에 대한 좋은 답변을 찾았습니다. 답변해 주시겠습니까?

... 보류한 후에는 할 수 없는 것 같습니다...

답변1

저도 같은 문제를 겪어서 글을 남깁니다프로그램.

문제는 다양한 형식과 해상도의 동영상이 있기 때문에 각 동영상 프레임을 해시하고 비교해야 한다는 것입니다.

상단의 디렉토리만 변경하면 됩니다.

from os import path, walk, makedirs, rename
from time import clock
from imagehash import average_hash
from PIL import Image
from cv2 import VideoCapture, CAP_PROP_FRAME_COUNT, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT, CAP_PROP_FPS
from json import dump, load
from multiprocessing import Pool, cpu_count

input_vid_dir = r'C:\Users\gokul\Documents\data\\'
json_dir = r'C:\Users\gokul\Documents\db\\'
analyzed_dir = r'C:\Users\gokul\Documents\analyzed\\'
duplicate_dir = r'C:\Users\gokul\Documents\duplicate\\'

if not path.exists(json_dir):
    makedirs(json_dir)

if not path.exists(analyzed_dir):
    makedirs(analyzed_dir)

if not path.exists(duplicate_dir):
    makedirs(duplicate_dir)


def write_to_json(filename, data):
    file_full_path = json_dir + filename + ".json"
    with open(file_full_path, 'w') as file_pointer:
        dump(data, file_pointer)
    return


def video_to_json(filename):
    file_full_path = input_vid_dir + filename
    start = clock()
    size = round(path.getsize(file_full_path) / 1024 / 1024, 2)
    video_pointer = VideoCapture(file_full_path)
    frame_count = int(VideoCapture.get(video_pointer, int(CAP_PROP_FRAME_COUNT)))
    width = int(VideoCapture.get(video_pointer, int(CAP_PROP_FRAME_WIDTH)))
    height = int(VideoCapture.get(video_pointer, int(CAP_PROP_FRAME_HEIGHT)))
    fps = int(VideoCapture.get(video_pointer, int(CAP_PROP_FPS)))
    success, image = video_pointer.read()
    video_hash = {}
    while success:
        frame_hash = average_hash(Image.fromarray(image))
        video_hash[str(frame_hash)] = filename
        success, image = video_pointer.read()
    stop = clock()
    time_taken = stop - start
    print("Time taken for ", file_full_path, " is : ", time_taken)
    data_dict = dict()
    data_dict['size'] = size
    data_dict['time_taken'] = time_taken
    data_dict['fps'] = fps
    data_dict['height'] = height
    data_dict['width'] = width
    data_dict['frame_count'] = frame_count
    data_dict['filename'] = filename
    data_dict['video_hash'] = video_hash
    write_to_json(filename, data_dict)
    return


def multiprocess_video_to_json():
    files = next(walk(input_vid_dir))[2]
    processes = cpu_count()
    print(processes)
    pool = Pool(processes)
    start = clock()
    pool.starmap_async(video_to_json, zip(files))
    pool.close()
    pool.join()
    stop = clock()
    print("Time Taken : ", stop - start)


def key_with_max_val(d):
    max_value = 0
    required_key = ""
    for k in d:
        if d[k] > max_value:
            max_value = d[k]
            required_key = k
    return required_key


def duplicate_analyzer():
    files = next(walk(json_dir))[2]
    data_dict = {}
    for file in files:
        filename = json_dir + file
        with open(filename) as f:
            data = load(f)
        video_hash = data['video_hash']
        count = 0
        duplicate_file_dict = dict()
        for key in video_hash:
            count += 1
            if key in data_dict:
                if data_dict[key] in duplicate_file_dict:
                    duplicate_file_dict[data_dict[key]] = duplicate_file_dict[data_dict[key]] + 1
                else:
                    duplicate_file_dict[data_dict[key]] = 1
            else:
                data_dict[key] = video_hash[key]
        if duplicate_file_dict:
            duplicate_file = key_with_max_val(duplicate_file_dict)
            duplicate_percentage = ((duplicate_file_dict[duplicate_file] / count) * 100)
            if duplicate_percentage > 50:
                file = file[:-5]
                print(file, " is dup of ", duplicate_file)
                src = analyzed_dir + file
                tgt = duplicate_dir + file
                if path.exists(src):
                    rename(src, tgt)
                # else:
                #     print("File already moved")


def mv_analyzed_file():
    files = next(walk(json_dir))[2]
    for filename in files:
        filename = filename[:-5]
        src = input_vid_dir + filename
        tgt = analyzed_dir + filename
        if path.exists(src):
            rename(src, tgt)
        # else:
        #     print("File already moved")


if __name__ == '__main__':
    mv_analyzed_file()
    multiprocess_video_to_json()
    mv_analyzed_file()
    duplicate_analyzer()

관련 정보