GH_J5
/
ADA3
133 строки · 5.0 Кб
1import subprocess
2import json
3import base64
4import numpy as np
5from scipy.spatial.distance import cosine, euclidean, cityblock
6from scipy.stats import pearsonr
7from scipy.interpolate import interp1d
8
9def get_video_resolution(video_file):
10# Команда для получения информации о видео с помощью FFmpeg
11ffprobe_command = [
12'ffprobe',
13'-v', 'error',
14'-select_streams', 'v:0',
15'-show_entries', 'stream=width,height',
16'-of', 'json',
17video_file
18]
19
20# Запускаем процесс FFprobe с указанной командой
21ffprobe_process = subprocess.Popen(ffprobe_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
22
23# Получаем вывод процесса
24output, error = ffprobe_process.communicate()
25
26# Если есть ошибки, выводим их
27if error:
28print("Ошибка при выполнении команды FFprobe:", error.decode())
29return None, None
30
31# Разбираем JSON-ответ, чтобы получить информацию о разрешении
32video_info = json.loads(output.decode())
33width = video_info['streams'][0]['width']
34height = video_info['streams'][0]['height']
35
36return width, height
37
38def estimate_blur(image_array,height, width, threshold=7):
39# Преобразуем байты изображения в массив NumPy
40image_array = image_array.reshape(height, width, 3)
41# Конвертируем изображение в оттенки серого
42gray_image = np.mean(image_array, axis=2)
43
44# Вычисляем горизонтальные и вертикальные градиенты
45gradient_x = np.gradient(gray_image, axis=1)
46gradient_y = np.gradient(gray_image, axis=0)
47
48# Вычисляем общий градиент
49gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)
50
51# Вычисляем среднее значение градиента
52mean_gradient = np.mean(gradient_magnitude)
53
54# Возвращаем True, если среднее значение градиента меньше порогового значения
55#print(mean_gradient)
56return mean_gradient < threshold
57
58def extract_i_frames(input_file,height, width):
59i_frames = []
60frame_timings = []
61ln = []
62# Получаем информацию о видео с помощью FFprobe
63ffprobe_command = [
64'ffprobe',
65'-show_entries', 'frame=pkt_pts_time,pict_type',
66'-select_streams', 'v:0',
67'-of', 'json',
68input_file
69]
70ffprobe_process = subprocess.Popen(ffprobe_command, stdout=subprocess.PIPE)
71ffprobe_output, _ = ffprobe_process.communicate()
72video_info = json.loads(ffprobe_output)
73
74# Извлекаем I-кадры с помощью ffmpeg
75ffmpeg_command = [
76'ffmpeg',
77'-i', input_file,
78#'-vf', 'select=\'eq(pict_type\,I)\'',
79'-vsync', 'vfr',
80'-f', 'image2pipe',
81'-pix_fmt', 'rgb24',
82'-vcodec', 'rawvideo',
83'-'
84]
85ffmpeg_process = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE)
86#frame_bytes = ffmpeg_process.stdout.read()
87#print(len(frame_bytes))
88# Читаем кадры и их тайминг
89
90print(width, height)
91for frame_info in video_info['frames']:
92frame_type = frame_info['pict_type']
93frame_time = float(frame_info['pkt_pts_time'])
94#print(frame_info['pkt_pts_time'])
95frame_bytes = ffmpeg_process.stdout.read(width*height*3)
96#print(len(frame_bytes))
97if frame_bytes and frame_type == 'I':
98# Преобразуем байты в массив numpy
99numpy_array = np.frombuffer(frame_bytes, dtype=np.uint8)
100i_frames.append(numpy_array)
101ln.append(len(numpy_array))
102frame_timings.append(frame_time)
103
104ffmpeg_process.stdout.close()
105
106return i_frames, frame_timings, ln
107
108input_file = '3.mp4'
109width, height = get_video_resolution(input_file)
110i_frames, frame_timings, ln = extract_i_frames(input_file,height,width)
111
112
113# Вывод списка I-кадров и их тайминга
114for i, (frame, timing,ln) in enumerate(zip(i_frames, frame_timings, ln)):
115array1 = i_frames[i]
116#ln1=len(first)
117#print(type(first),len(first))
118array2 = i_frames[i+1]
119#ln2=len(second)
120#print(type(second), len(second))
121#similarity = 1-cosine(array1, array2)
122#if similarity>0.1:
123#distance = euclidean(array1, array2)
124#jacard = jaccard_similarity(array1, array2)
125correlation, _ = pearsonr(array1, array2)
126es1 = estimate_blur(array1,height,width)
127if es1:
128print("++++++++++++++++++++++++")
129print(f"I-кадр {i+1}, Тайминг: {timing} секунд,{len(frame)} {ln}")
130#distance2 = cityblock(array1, array2)
131if correlation<0.75:
132print("----------------",correlation)
133print(f"I-кадр {i+1}, Тайминг: {timing} секунд,{len(frame)} {ln}")