1. Write video with transparent alpha layer
[1]:
from cutcutcodec.core.generation.video.noise import GeneratorVideoNoise
from cutcutcodec.core.io import write
1.1. Create a video stream with an alpha layer
[2]:
signal_bgr = GeneratorVideoNoise().apply_video_subclip(0, 10) # 10 seconds of pure noise
signal_bgra = signal_bgr.apply_video_equation("b0", "g0", "r0", "0.5") # alpha layer should be more complex
[3]:
frame = signal_bgra.out_streams[0].snapshot(0, (480, 720))
print(f"the frame contains {frame.channels} channels")
the frame contains 4 channels
1.2. Find the right codec and pixel format
[4]:
from cutcutcodec.core.compilation.export.compatibility import Compatibilities
[5]:
# for rgba
rgba_comp = Compatibilities().codecs_video(pix_fmt="rgba")
print(sorted(rgba_comp))
Testing encoder/muxer: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 17325/17325 [00:00<00:00, 35916.19comb/s]
['apng', 'dpx', 'dxv', 'jpeg2000', 'png', 'qoi', 'rawvideo', 'tiff', 'xwd']
[6]:
# for yuva420p
yuva_comp = Compatibilities().codecs_video(pix_fmt="yuva420p")
print(sorted(yuva_comp))
Testing encoder/muxer: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 17325/17325 [00:00<00:00, 29971.60comb/s]
['ffv1', 'ffvhuff', 'jpeg2000', 'rawvideo']
1.3. Write the video
[7]:
# lossless
streams_settings = [
{"encodec": "jpeg2000", "rate": 30, "shape": (480, 720), "pix_fmt": "rgba"},
]
write(signal_bgra.out_streams, "/tmp/my_video.mp4", streams_settings)
Encoding my_video.mp4: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10.00s/10.00s [01:17<00:00]
[8]:
# lossly
streams_settings = [
{"encodec": "ffv1", "rate": 30, "shape": (480, 720), "pix_fmt": "yuva420p"},
]
write(signal_bgra.out_streams, "/tmp/my_video.mkv", streams_settings)
Encoding my_video.mkv: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10.00s/10.00s [00:06<00:00]