Package Name
Visual and audio engine of Choi Gunhyuk
Installation
Install the package from PyPI:
pip install chgnhyk
ffmpeg
- required to generate video
csound libcsnd6-6.0v5
- required to generate audio
Installation options
pip install chgnhyk[audio]
- requires csound
pip install chgnhyk[window]
- installs moderngl_window
pip install chgnhyk[mediapipe]
- installs mediapipe
- downgrades numpy to 1.26.4
pip install "chgnhyk[opencv]"
- install with opencv
pip install "chgnhyk[audio, window, mediapipe]"
- install with three options
Usage
Basic example:
from chgnhyk import FBO, ClipRenderer
from moderngl import create_context
CTX = create_context(require=(330), standalone=True)
SIZE = (1080, 1080)
shader = '''
#version 330
out vec4 outputColor;
in vec2 UV;
uniform sampler2D bckbuffer;
uniform vec2 resolution;
uniform float timer;
uniform float loop_timer;
uniform float duration;
void main() {
vec2 uv = UV;
vec2 rs = resolution;
outputColor = vec4(uv, 1., 1.);
}
'''
scene = FBO(
ctx = CTX, size = (1080, 1080), shader = shader
)
clip = ClipRenderer(duration=2, fps=30, rest_time=0.)
clip.addFBOPass("", scene)
clip.render_frame_sample(clip.duration * 0.0)
clip.extractImage((f"test_{clip.t}.jpg"))
vid = clip.render()
vid.write_videofile(str("test.mp4"), fps=clip.fps)
clip.release()
CTX.release()
Video example:
- create "sample" folder
- create "shaders" folder and put shader files there
shader file in "shaders" folder
#version 330
out vec4 outputColor;
in vec2 UV;
uniform sampler2D bckbuffer;
uniform vec2 resolution;
uniform sampler2D VID;
uniform vec2 VID_res;
uniform float timer;
uniform float loop_timer;
uniform float duration;
#define PI 3.14159265
float rand(vec3 p){
float sd1 = dot(p, vec3(31.3131,23.2323,17.1717));
float sd2 = dot(p, vec3(13.1313,15.1515,19.1919));
float sv = sin(sd1) + sin(sd2);
return fract(sv * 45678.654321);
}
vec2 rotate(vec2 p, float a){
return vec2(
p.x * cos(a) - p.y * sin(a),
p.x * sin(a) + p.y * cos(a)
);
}
float sd_segment(vec2 p, vec2 a, vec2 b, float w){
vec2 ba = b - a;
vec2 pa = p - a;
vec2 dr = normalize(ba);
float l = length(ba);
float dt = dot(pa, dr);
vec2 h = a + dt * dr;
float dst = length(h-p)-w;
if(dt <= .0){
dst = length(p-a)-w;
}
if(dt >= l){
dst = length(p-b)-w;
}
return dst;
}
void main() {
vec2 uv = UV;
vec2 rs = resolution;
uv = (uv-.5);
uv *= rs/rs.y;
vec2 sc = vec2(40.);
vec2 iuv = floor(uv*sc);
if(mod(iuv.y,2.) == .0){
uv.x -= .5/sc.x;
}
iuv = floor(uv*sc);
vec2 fuv = fract(uv*sc)-.5;
vec2 vtc = (iuv/sc)*rs.y/rs + .5;
vec4 vsamp = texture(VID, vtc);
vec4 ovsamp = texture(VID, UV);
float h = length(vsamp.rgb)/length(vec3(1.));
h = floor(h * 8.)/8.;
fuv = rotate(fuv, h * PI * 2.);
float sh = sd_segment(fuv, vec2(-.4,.0), vec2(.4,.0), .02);
sh = 1.-smoothstep(.0,.001 * sc.x,sh);
vec3 col;
col = mix(vsamp.rgb, vec3(.1,1.,.1), sh);
outputColor = vec4(col, 1.);
}
main python script
from chgnhyk import FBO, load_shader, ClipRenderer
from moderngl import create_context
from pathlib import Path
work_path = Path(__file__).parent
shader_path = work_path.joinpath("shaders/")
sample_path = work_path.joinpath("sample/")
CTX = create_context(require=(330), standalone=True)
ratio = 1
SIZE = (1080, 1080) # change to match video file
scene = FBO(ctx=CTX, size=SIZE, shader=load_shader(shader_path.joinpath("scene.glsl")))
clip = ClipRenderer(duration=5, fps=30, rest_time=0.) #8 #30
scene.set_uniform("duration", clip.duration)
clip.addFBOPass(name = 'scene', render_pass = scene)
clip.addVideo(sample_path.joinpath("video.mp4"), "VID", 8)
clip.render_frame_sample(clip.duration * 0.0)
clip.extractImage(sample_path.joinpath(f"test_{clip.t}.jpg"))
vid = clip.render()
vid.write_videofile(str(sample_path.joinpath("test.mp4")), fps=clip.fps)
clip.release()
CTX.release()
Requirements
- Python 3.9 or later
- moderngl
- moderngl_window
- csound
License
This project is licensed under the MIT License. See the LICENSE file for details.
Author
Choi Gunhyuk
Links
- PyPI:
- GitHub:
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
chgnhyk-0.0.12.tar.gz
(379.2 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
chgnhyk-0.0.12-py3-none-any.whl
(384.7 kB
view details)
File details
Details for the file chgnhyk-0.0.12.tar.gz.
File metadata
- Download URL: chgnhyk-0.0.12.tar.gz
- Upload date:
- Size: 379.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.9.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
093b76435a0ab16a133d1ab398d280cab476cb6907ff61ebf265d21a2e33d60a
|
|
| MD5 |
b74f52bc97052d1a9202093f66b895af
|
|
| BLAKE2b-256 |
8787eb5d1672452d7ced617a49d1a000c0cf0ea395493025a3e5668dab23c646
|
File details
Details for the file chgnhyk-0.0.12-py3-none-any.whl.
File metadata
- Download URL: chgnhyk-0.0.12-py3-none-any.whl
- Upload date:
- Size: 384.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.9.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b643abc301601bf9875ab6b4909844243e9e7846487f7a111473d9437099fd9
|
|
| MD5 |
7e2dd9ca93fee28894ab5ddf93daaef7
|
|
| BLAKE2b-256 |
1cef291ab451ba08c59391b8ceccc09c91fbfd1836d820d1207426c075b434cd
|