1. Write video with transparent alpha layer

[1]:
from cutcutcodec.core.filter.video.subclip import FilterVideoSubclip
from cutcutcodec.core.filter.video.equation import FilterVideoEquation
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]:
(stream_bgr,) = FilterVideoSubclip(GeneratorVideoNoise(0).out_streams, 0, 10).out_streams
(stream_bgra,) = FilterVideoEquation([stream_bgr], "b0", "g0", "r0", "0.5").out_streams  # alpha layer should be more complex
[3]:
frame = stream_bgra.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))

esting encoder/muxer: 100%|███████████████████████████████████| 21525/21525 [00:00<00:00, 30775.92comb/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%|███████████████████████████████████| 21525/21525 [00:00<00:00, 29016.56comb/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((stream_bgra,), "/tmp/my_video.mp4", streams_settings)

ncoding my_video.mp4: 100%|█████████████████████████████████████████████████| 10.00s/10.00s [01:03<00:00]
[8]:
# lossly
streams_settings = [
    {"encodec": "ffv1", "rate": 30, "shape": (480, 720), "pix_fmt": "yuva420p"},
]
write((stream_bgra,), "/tmp/my_video.mkv", streams_settings)

ncoding my_video.mkv: 100%|█████████████████████████████████████████████████| 10.00s/10.00s [00:05<00:00]