Migrate all repos into monorepo context folders
Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)
Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
from PIL import Image, ImageSequence
|
||||
import imageio
|
||||
import numpy as np
|
||||
import sys
|
||||
|
||||
def convert_webp_to_mp4(webp_path, mp4_path, fps=30):
|
||||
try:
|
||||
# Load the Animated WebP
|
||||
img = Image.open(webp_path)
|
||||
frames = []
|
||||
for frame in ImageSequence.Iterator(img):
|
||||
# Convert to RGB, as MP4 (H264) does not support RGBA seamlessly without special pixel formats
|
||||
# and imageio handles RGB best
|
||||
frame = frame.convert('RGB')
|
||||
arr = np.array(frame)
|
||||
# Ensure even dimensions for h264 encoder
|
||||
h, w = arr.shape[:2]
|
||||
h = h - (h % 2)
|
||||
w = w - (w % 2)
|
||||
frames.append(arr[:h, :w, :])
|
||||
|
||||
if not frames:
|
||||
print("No frames found in the image.")
|
||||
return
|
||||
|
||||
# Write to MP4 using imageio
|
||||
writer = imageio.get_writer(mp4_path, fps=fps, macro_block_size=None)
|
||||
for frame in frames:
|
||||
writer.append_data(imageio.core.image_as_uint(frame))
|
||||
writer.close()
|
||||
|
||||
print(f"Successfully converted {len(frames)} frames to {mp4_path}")
|
||||
except Exception as e:
|
||||
print(f"Error during conversion: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 3:
|
||||
print("Usage: python convert.py input.webp output.mp4")
|
||||
else:
|
||||
convert_webp_to_mp4(sys.argv[1], sys.argv[2])
|
||||
Reference in New Issue
Block a user