Skip to content

A cut built from one document ​

Runs in any browser

Nothing to install.

A 10-second cut — two shots, one line of voice and its subtitle — whose timeline is one GEML document (geml-media/v1). The player below and the encoded video read the same timeline, so what you watch here is what ffmpeg writes. The footage is synthetic (ffmpeg's test patterns), so the repository ships no media it does not own.

The result ​

Open it on its own page

How it is made ​

ep01-cut.geml is the timeline: four clips on three tracks. ep01-script.geml holds the shots' prompts and the line — who says it, to whom; ep01-library.geml every asset with its hash and the generation that made it. One command encodes the video:

sh
geml media build ep01/ep01-cut.geml --out ep01.mp4 --root . --burn-subs

The player above reads the same timeline without encoding anything; geml's media-page.mjs wrote it, and geml media export ep01/ep01-cut.geml --to player writes a plainer one.

geml
=== meta
title = "EP01 粗剪"
profile = "geml-media/v1"
===

# 第一场 {#sc01}

==== media {#ep01 tracks="video:video dialogue:audio subtitle:prose" primary=video fps=24}

=== media-clip {#c01 track=video src=ep01-library.geml#s01-take3 in=0 out=4}
===

=== media-clip {#c03 track=video src=ep01-library.geml#s03-take2-lips in=0 out=6 transition-in=cut}
===

=== media-clip {#vo-s03-l1 track=dialogue src=ep01-library.geml#s03-l1-vo over=#c03 offset=0.4 gain=0dB}
===

=== media-clip {#sub-s03-l1 track=subtitle src=ep01-script.geml#s03-l1 over=#c03 offset=0.4 duration=2.1}
===

====
geml
=== meta
title = "EP01"
profile = "geml-media/v1"
episode = 1
aspect = "9:16"
===

# 分镜表 {#board}

=== table {#shots}
| 镜号 | 时长 | 角色 |
|---|---|---|
| s01 | 4 | #hero |
| s03 | 6 | #sister #hero |
===

# 镜头 {#shot-blocks}

=== media-text {#s01-prompt .prompt shot=s01}
![[../characters.geml#look]] ![[../characters.geml#hero-look]] 特写,从闭眼开始,猛然睁开。
===

=== media-text {#s03-prompt .prompt shot=s03}
![[../characters.geml#look]] 中景双人。左:![[../characters.geml#sister-look]] 右:![[../characters.geml#hero-look]]
===

=== media-text {#s03-l1 .line speaker=../characters.geml#sister to=../characters.geml#hero emotion=假哭}
姐……你怎么会……
===
geml
=== meta
title = "EP01 素材库"
profile = "geml-media/v1"
===

# 共享素材 {#shared}

=== media-asset {#hero-sheet src=assets/hero-sheet.png sha256=2de7016656451ffdc6e646f7f5868a85d62d7179dfc630ece5f1f303062d1f68 kind=image origin=generated of=../characters.geml#hero role=sheet}
===

# 本集产出 {#local}

=== media-asset {#s01-key src=assets/s01-key.png sha256=f706203dced9dd9b04e7bd718b2ae4703042d1a0c9440c65fcdce159e0a57ca6 kind=image origin=generated}
===

=== media-asset {#s01-take3 src=assets/s01-take3.mp4 sha256=f76ce142fc2a06b7b013add379cf1e2b0ecb932f79d338f0397840d875c42f58 kind=video duration=5.083 origin=generated}
===

=== media-asset {#s03-take2 src=assets/s03-take2.mp4 sha256=ef2bcb5d0f5c0dd7f591d8a69d71d204c1e058d3aa13cb0ffd59a5c5c201365a kind=video duration=6.083 origin=generated}
===

=== media-asset {#s03-l1-vo src=assets/s03-l1-vo.wav sha256=3916948e5c28c4831fd0d9937731f7e00d60ae84178a7cc8a6611fff9ac49db7 kind=audio duration=2.1 origin=generated}
===

=== media-asset {#s03-take2-lips src=assets/s03-take2-lips.mp4 sha256=ee6ab0e19bf1b0ba028c54e7c5b140adacf89319453edef3e7b607f5bad14fdd kind=video duration=6.083 origin=generated}
===

# 生成日志 {#gen}

=== data {#gen-log .gen-log format=jsonl}
{"output":"#s01-key","output-sha256":"f706203dced9dd9b04e7bd718b2ae4703042d1a0c9440c65fcdce159e0a57ca6","model":"jimeng-4.5","mode":"t2i","seed":20481,"prompt":"ep01-script.geml#s01-prompt","prompt-sha256":"42c2a78fe92677fe8471c991f997a6ed3b3a34d3ef398c5a7b95c3b48a9d7be7","prompt-refs":[{"ref":"../characters.geml#look","sha256":"be684a505c29a4113e6ed51c73dbb7dd3baf6023ad03f28f1a100ddc053b3e02"},{"ref":"../characters.geml#hero-look","sha256":"5f9bb75d849c6db8e57ed780efd0b3f0d7a0f51836f78bbfca386fe1c2776bd9"}],"inputs":[{"ref":"#hero-sheet","sha256":"2de7016656451ffdc6e646f7f5868a85d62d7179dfc630ece5f1f303062d1f68","role":"sheet"}],"at":"2026-09-15T09:12:03Z"}
{"output":"#s01-take3","output-sha256":"f76ce142fc2a06b7b013add379cf1e2b0ecb932f79d338f0397840d875c42f58","model":"seedance-2.0","mode":"i2v","seed":88213,"prompt":"ep01-script.geml#s01-prompt","prompt-sha256":"42c2a78fe92677fe8471c991f997a6ed3b3a34d3ef398c5a7b95c3b48a9d7be7","prompt-refs":[{"ref":"../characters.geml#look","sha256":"be684a505c29a4113e6ed51c73dbb7dd3baf6023ad03f28f1a100ddc053b3e02"},{"ref":"../characters.geml#hero-look","sha256":"5f9bb75d849c6db8e57ed780efd0b3f0d7a0f51836f78bbfca386fe1c2776bd9"}],"inputs":[{"ref":"#s01-key","sha256":"f706203dced9dd9b04e7bd718b2ae4703042d1a0c9440c65fcdce159e0a57ca6","role":"first-frame"}],"at":"2026-09-15T09:20:41Z"}
{"output":"#s03-take2","output-sha256":"ef2bcb5d0f5c0dd7f591d8a69d71d204c1e058d3aa13cb0ffd59a5c5c201365a","model":"seedance-2.0","mode":"t2v","seed":41007,"prompt":"ep01-script.geml#s03-prompt","prompt-sha256":"ccca72ebeadadb02e968ad4f7dad587784da03cd86a9a83e3fdd7abe0fb85559","prompt-refs":[{"ref":"../characters.geml#look","sha256":"be684a505c29a4113e6ed51c73dbb7dd3baf6023ad03f28f1a100ddc053b3e02"},{"ref":"../characters.geml#sister-look","sha256":"3d8db9ccdc2e6cbf58ccaa419b1f8a4c82ee12aa633318dd3262a1e8f5ebfc50"},{"ref":"../characters.geml#hero-look","sha256":"5f9bb75d849c6db8e57ed780efd0b3f0d7a0f51836f78bbfca386fe1c2776bd9"}],"inputs":[{"ref":"#hero-sheet","sha256":"2de7016656451ffdc6e646f7f5868a85d62d7179dfc630ece5f1f303062d1f68","role":"sheet"}],"at":"2026-09-15T10:02:55Z"}
{"output":"#s03-l1-vo","output-sha256":"3916948e5c28c4831fd0d9937731f7e00d60ae84178a7cc8a6611fff9ac49db7","model":"cosyvoice-3","mode":"tts","prompt":"ep01-script.geml#s03-l1","prompt-sha256":"3fc4466c1687c6a9333ff31f19ea695bd78e397e0fa68509c4ddc692b14fb092","prompt-refs":[],"inputs":[],"params":{"emotion":"假哭"},"at":"2026-09-15T10:11:40Z"}
{"output":"#s03-take2-lips","output-sha256":"ee6ab0e19bf1b0ba028c54e7c5b140adacf89319453edef3e7b607f5bad14fdd","model":"sekotalk-2.0","mode":"lipsync","inputs":[{"ref":"#s03-take2","sha256":"ef2bcb5d0f5c0dd7f591d8a69d71d204c1e058d3aa13cb0ffd59a5c5c201365a"},{"ref":"#s03-l1-vo","sha256":"3916948e5c28c4831fd0d9937731f7e00d60ae84178a7cc8a6611fff9ac49db7"}],"params":{"speakers":1},"at":"2026-09-15T10:20:31Z"}
===

The folder, with the assets: public/examples/geml-media-demo/.

Last updated:

Code MIT · Specification CC BY 4.0