Weave는 moviepy를 사용해 비디오를 자동으로 로깅합니다. 이를 통해 트레이싱된 함수에 비디오 입력과 출력을 전달할 수 있으며, Weave가 비디오 데이터의 업로드와 저장을 자동으로 처리합니다.
비디오 지원은 현재 Python에서만 사용할 수 있습니다.
weave 및 moviepy==1.0.3를 설치합니다.
- W&B 계정을 생성합니다.
Weave는 다음과 같은 moviepy 비디오 클립 객체를 인식합니다:
- 비디오 파일에서 불러온
VideoFileClip
ImageClip, ColorClip, TextClip과 같은 메모리 내 클립
클립이 VideoFileClip이고 지원되는 확장자의 유효한 파일명을 가지고 있으면 Weave가 해당 파일을 직접 upload합니다.
지원되는 파일 확장자:
비디오 객체가 메모리에만 있고(디스크에 파일이 없는 경우), Weave가 이를 .mp4 파일로 인코딩한 뒤 업로드를 자동으로 처리합니다. 이는 다음 유형의 클립에 적용됩니다.
ImageClip
ColorClip
TextClip
다음 코드 예제는 Weave에서 비디오 처리 함수를 트레이스하는 방법을 보여줍니다. 이 코드 예제는 다음을 수행합니다.
- Weave 프로젝트
video-test를 초기화합니다.
- 로드된
VideoFileClip에서 1초 길이의 하위 클립을 VideoClip으로 추출하는 get_video 함수를 weave.op으로 추적되도록 정의합니다.
- 클립을 Weave에 업로드하고 추적합니다.
- 비디오를 찾지 못하면 더미 MP4 비디오를 자동으로 생성합니다.
스레드 안전성 문제를 방지하려면 Weave op 외부에서 VideoFileClip 객체를 생성하지 말고, 항상 경로를 전달하세요.
다음 코드 스니펫을 사용하기 전에 사용을 위한 사전 요구 사항을 완료하세요.
import os
import weave
from moviepy.editor import VideoFileClip, ColorClip, VideoClip
# 프로젝트 이름으로 업데이트하거나, 'video-test'라는 새 프로젝트를 생성하세요
weave.init('video-test')
@weave.op
def get_video(clip: VideoFileClip) -> VideoClip:
"""클립을 직접 전달하는 대신 경로를 통해 비디오를 처리합니다.
이렇게 하면 VideoFileClip이 Weave op의 스레드 컨텍스트 내에서
생성 및 관리되어 스레드 안전성 문제를 방지할 수 있습니다.
"""
new_clip = clip.subclip(0, 1)
return new_clip
if __name__ == "__main__":
os.makedirs("videos", exist_ok=True)
# MP4 파일 경로로 업데이트하세요
video_path = './videos/example.mp4'
# 파일이 없으면 더미 비디오를 생성합니다
# 더미 비디오 내용: 5초 동안 표시되는 빨간색 사각형
if not os.path.isfile(video_path):
print("비디오를 찾을 수 없습니다. 더미 비디오를 생성합니다...")
dummy_clip = ColorClip(size=(640, 480), color=(255, 0, 0), duration=5)
dummy_clip.write_videofile(video_path, fps=24)
clip = VideoFileClip(video_path, has_mask=False, audio=True)
get_video(clip)
코드 예제가 정상적으로 실행되면 프로젝트의 Traces 테이블에서 링크를 클릭해 비디오를 볼 수 있습니다.