1. Write video with transparent alpha layer¶
[1]:
import cutcutcodec
1.1. Create a video stream with an alpha layer¶
[2]:
signal_rgb = cutcutcodec.generation.GeneratorVideoNoise().apply_video_subclip(0, 10) # 10 seconds of pure noise
signal_rgba = signal_rgb.apply_video_equation("r0", "g0", "b0", "0.5") # alpha layer should be more complex
[3]:
frame = signal_rgba.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:15<00:00, 1132.37comb/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:13<00:00, 1303.77comb/s]
['ffv1', 'ffvhuff', 'jpeg2000', 'rawvideo']
1.3. Write the video¶
[7]:
# lossless
streams_settings = [
{"encodec": "jpeg2000", "rate": 30, "shape": (480, 720), "pix_fmt": "rgba"},
]
cutcutcodec.write(signal_rgba.out_streams, "/tmp/my_video.mp4", streams_settings=streams_settings)
Encoding my_video.mp4: 100%|████████████████████████████████████████| 10.00s/10.00s [03:03<00:00]
[8]:
# lossly
streams_settings = [
{"encodec": "ffv1", "rate": 30, "shape": (480, 720), "pix_fmt": "yuva420p"},
]
cutcutcodec.write(signal_rgba.out_streams, "/tmp/my_video.mkv", streams_settings=streams_settings)
Encoding my_video.mkv: 100%|████████████████████████████████████████| 10.00s/10.00s [00:17<00:00]