Деление видео на более мелкие сегменты — распространенная задача при обработке и редактировании видео. Если вы хотите извлечь определенные сцены, создать более короткие клипы или выполнить анализ видео на небольших участках, важно иметь методы эффективного разделения видео. В этой статье мы рассмотрим десять умных методов разделения видео на примерах кода на Python, FFmpeg, OpenCV и Moviepy.
Метод 1: поровну разделить видео
Первый способ — разделить видео на равные части по продолжительности. Вот пример использования Python и Moviepy:
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
def split_video_equally(video_path, num_segments):
video = VideoFileClip(video_path)
duration = video.duration
segment_duration = duration / num_segments
for i in range(num_segments):
start_time = segment_duration * i
end_time = start_time + segment_duration
ffmpeg_extract_subclip(video_path, start_time, end_time, targetname=f"segment_{i}.mp4")
Метод 2: разделение видео по временным интервалам
Другой метод — разделить видео на сегменты по определенным временным интервалам. Вот пример использования Python и Moviepy:
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
def split_video_by_intervals(video_path, interval):
video = VideoFileClip(video_path)
duration = video.duration
start_time = 0
end_time = interval
segment_counter = 1
while end_time <= duration:
ffmpeg_extract_subclip(video_path, start_time, end_time, targetname=f"segment_{segment_counter}.mp4")
start_time = end_time
end_time += interval
segment_counter += 1
# Handle the remaining duration
if start_time < duration:
ffmpeg_extract_subclip(video_path, start_time, duration, targetname=f"segment_{segment_counter}.mp4")
Метод 3: разделение видео по смене сцен
Разделение видео на основе смены сцен можно выполнить с помощью OpenCV. Вот пример:
import cv2
def split_video_by_scene_changes(video_path):
cap = cv2.VideoCapture(video_path)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
scene_detector = cv2.createBackgroundSubtractorMOG2()
frame_counter = 0
segment_counter = 1
scene_change_threshold = 100
while True:
ret, frame = cap.read()
if not ret:
break
fg_mask = scene_detector.apply(frame)
if cv2.countNonZero(fg_mask) > scene_change_threshold:
segment_name = f"segment_{segment_counter}.mp4"
out = cv2.VideoWriter(segment_name, cv2.VideoWriter_fourcc(*'mp4v'), fps, (frame_width, frame_height))
segment_counter += 1
out.write(frame)
frame_counter += 1
cap.release()
out.release()
Метод 4. Разделение видео по ключевым кадрам
Ключевые кадры представляют собой важные моменты в видео и могут использоваться для разделения видео. Вот пример использования FFmpeg:
ffmpeg -i input.mp4 -vf "select='eq(pict_type, I)'" -vsync 0 -an -f image2 output_%03d.jpg
Метод 5: разделение видео на основе аудио
Разделение видео на основе аудиоанализа может быть полезно для таких задач, как разделение речевых сегментов. Вот пример использования Python и Moviepy:
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
def split_video_by_audio(video_path, audio_threshold):
video = VideoFileClip(video_path)
audio = video.audio
audio_segments = audio.subclip(0).iter_chunks(chunksize=1024, quantize=True, fps=audio.fps)
segment_start = 0
segment_counter = 1
for i, chunk in enumerate(audio_segments):
if abs(chunk.max()) < audio_threshold:
segment_end = i / audio.fps
ffmpeg_extract_subclip(video_path, segment_start, segment_end, targetname=f"segment_{segment_counter}.mp4")
segment_start = segment_end
segment_counter += 1
# Handle the remaining duration
if segment_start < video.duration:
ffmpeg_extract_subclip(video_path, segment_start, video.duration, targetname=f"segment_{segment_counter}.mp4")
``Method 6: Splitting Videos by Motion Detection
Splitting videos based on motion detection can be done using OpenCV. Here's an example:
```python
import cv2
def split_video_by_motion_detection(video_path):
cap = cv2.VideoCapture(video_path)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
frame_counter = 0
segment_counter = 1
motion_area_threshold = 1000
prev_frame = None
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
if prev_frame is not None:
frame_diff = cv2.absdiff(prev_frame, gray)
_, motion_mask = cv2.threshold(frame_diff, 30, 255, cv2.THRESH_BINARY)
if cv2.countNonZero(motion_mask) > motion_area_threshold:
segment_name = f"segment_{segment_counter}.mp4"
out = cv2.VideoWriter(segment_name, cv2.VideoWriter_fourcc(*'mp4v'), fps, (frame_width, frame_height))
segment_counter += 1
prev_frame = gray
out.write(frame)
frame_counter += 1
cap.release()
out.release()
Метод 7. Разделение видео с помощью функции обнаружения кадров
Алгоритмы обнаружения кадров анализируют изменения визуального контента для определения границ кадров. Вот пример использования библиотеки PySceneDetect:
from scenedetect import VideoManager, SceneManager, video_splitter
def split_video_by_shot_detection(video_path):
video_manager = VideoManager([video_path])
scene_manager = SceneManager()
scene_manager.add_detector('content', scene_manager.content_detector(3))
base_timecode = video_manager.get_base_timecode()
video_manager.set_downscale_factor()
video_manager.start()
scene_manager.detect_scenes(frame_source=video_manager)
scene_list = scene_manager.get_scene_list(base_timecode)
segment_list = video_splitter.split_video_ffmpeg(video_path, scene_list)
for i, segment in enumerate(segment_list):
segment_name = f"segment_{i + 1}.mp4"
segment.export(segment_name, codec='libx264', ffmpeg_params=['-crf', '23'])
video_manager.release()
Метод 8: разделение видео по размеру или продолжительности
Вы можете разделить видео на сегменты в зависимости от конкретных требований к размеру или продолжительности. Вот пример использования FFmpeg:
Разделить по размеру:
ffmpeg -i input.mp4 -c copy -map 0 -segment_time 00:10:00 -f segment output_%03d.mp4
Разбивка по продолжительности:
ffmpeg -i input.mp4 -c copy -map 0 -segment_size 50M -f segment output_%03d.mp4
Метод 9: разделение видео с использованием моделей машинного обучения
Продвинутые методы включают использование моделей машинного обучения для обнаружения конкретных объектов или событий и соответствующего разделения видео. Эти методы требуют обучения пользовательских моделей и выходят за рамки этой статьи. Однако популярные платформы, такие как TensorFlow и PyTorch, предоставляют ресурсы для анализа и сегментации видео.
Метод 10: разделение видео с помощью пользовательских маркеров
Наконец, вы можете разделить видео на основе определяемых пользователем маркеров или аннотаций. Например, вы можете указать временные метки или описания сцен и соответствующим образом разделить видео, используя выбранную платформу или библиотеку.
В этой статье мы рассмотрели десять умных способов разделения видео с примерами кода. Эти методы охватывают различные методы, такие как равное разделение, временные интервалы, смена сцен, ключевые кадры, анализ звука, обнаружение движения, обнаружение кадров, разделение на основе размера или продолжительности, машинное обучение и определяемые пользователем маркеры. Комбинируя эти методы или адаптируя их к конкретным требованиям, вы можете эффективно разделять видео для обработки, анализа или редактирования.