Конвертация из файла в видео используя OpenCV
Всем привет, csoftware на свзяи
В этом посте будем разбиратся, как конвертировать файл в видео
У многих сразу появится вопрос - зачем а главное нафига? Сразу отвечу на вас вопрос: Через конвертацию мы сможем использовать YouTube в качестве файлообменнмика
Возьмём кусок кода из этого проекта и проанализируем его
fd = open(infile_path, 'rb')
raw_data_bytes = fd.read()
data_bytes = np.frombuffer(raw_data_bytes, dtype=np.uint8)
len_of_data = len(data_bytes)
num_bytes_per_row = int(num_cols_per_frame * 3 / 8)
num_bytes_per_frame = num_bytes_per_row * num_rows_per_frame
len_bytes = np.array(bytearray(len_of_data.to_bytes(4, byteorder='big')), dtype=np.uint8)
(num_frames, num_leftover_bytes) = quotient_remainder(4 + len_of_data, num_bytes_per_frame)
if num_leftover_bytes > 0:
num_bytes_last_frame_padding = num_bytes_per_frame - num_leftover_bytes
padding_bytes = np.full((num_bytes_last_frame_padding), 0, dtype=np.uint8)
data_bytes = np.concatenate((len_bytes, data_bytes, padding_bytes))
num_frames += 1
else:
data_bytes = np.concatenate((len_bytes, data_bytes))
size = (num_cols_per_frame * 20, num_rows_per_frame * 20)
video = cv2.VideoWriter(outvideo_path, cv2.VideoWriter_fourcc(
*'mp4v'), fps, size)
for i in range(num_frames):
frame_bytes = data_bytes[i * num_bytes_per_frame: (i + 1) * num_bytes_per_frame]
frame_bits = np.unpackbits(frame_bytes)
# Reshape array to array(36, 72, 3)
frame = color_value(frame_bits).reshape(num_rows_per_frame, num_cols_per_frame, 3)
img = Image.fromarray(frame, mode="RGB")
# Scale image to (1280, 720)
newimg = img.resize(size, Image.Resampling.BOX)
video.write(np.asarray(newimg))
fd.close()
Первым делом мы читаем файл в бинарном виде и сохраняем в переменной raw_data_bytes Дальше идет конвертация в буффер uint8 средствами NumPY Дальше по параметрам идет просчет байтов в ряд и в кадр Дальше проходимся по байтам и рассчитываем колличество кадров
Дальше в цикле мы гененрируем под каждое n-ное колличество байтов мы гененрируем кадры и на выходу получаем наше видео
В тестовом примере разрешение видео 1280 на 720 и 20 кадров в секунду
На выходе мы получаем неплохой компрессор из файла в видео, через который мы сможем перезаливать файлы на YouTube
За ваши действия ответстсвенны вы сами и никто другой ответственность за вас не несет
Всем спасибо за прочтение. Это моя первая статья - не судите строго
