Organize MP4 screen recordings or .screenstudio source projects, presentation assets, original audio, and BGM into a two-stage video delivery: first provide an interactive Remotion Studio and subtitle review version, then generate an archived master and platform files from the user-approved SRT; also deliver an edit list, horizontal and vertical packaging, a formal cover image, and a readback-verifiable QC report. Keep the narrative focus on real workflows and actual problems, with tools appearing only as one part of the process.
Triggers
Activate when
- The user says “select all standalone clips with distribution value from the entire recording, cut them smoothly, and package them well,” including talks and multi-person exchanges that were not fully recorded.
- The user says “cut this screen recording into a WeChat Channels finished video, keeping the final segment that has sound.”
- The user says “compress it to fix upload lag, add BGM, make a 16:9 cover, and give me a QC report,” or complains that the vlog’s “BGM is too monotonous, mix multiple tracks according to the narrative,” or says “cut the travel footage shot with the panoramic camera and phone into a vlog, publish the vertical version on WeChat Channels first, then the horizontal version on Bilibili.”
- The user wants to organize a long screen recording into a short video with an opening, problem, operational evidence, and final result.
- The user provides a
.screenstudiosource project and wants to regain control over camera position, mouse/keyboard shortcuts, background, music, and visual packaging. - The user requests animations, transitions, visual explanations, professional subtitles, horizontal and vertical versions, and a cover combined with Remotion.
- The user wants to make a first-person explainer video about their own product or Skill, citing already published finished videos as evidence.
- The user says “organize the footage, work, and finished videos recorded over several episodes by period; this column will continue to be produced later.”
- The user says “first give me an MKV with embedded SRT; I’ll revise it in Subtitle Edit and then produce the final finished video.”
- Only enable the optional opening still frame when the user explicitly says “treat the cover as the first frame” or “pause at the beginning before entering the main video”; otherwise skip it directly and do not ask again.
- User asks to create a publish-ready video from a screen recording while preserving the original result audio.
- User asks for an opening still frame before the video body starts.
Do not activate when
- The user only wants titles, body copy, or social platform copy generated; hand off to copywriting or content strategy capabilities.
- The user only wants learning subtitles, vocabulary annotations, or ASS character cards; hand off to
lov-subtitle-freedom-skill。 - The user only wants chapter progress bars, transparent chapter layers, or CapCut chapter packages; hand off to
lov-video-chapter。 - The user already has an approved subtitled platform finished video and only asks to upload it and read back the publishing status; hand off to
lov-media-publisher。
User Profile (cross-session)
Every run reads skill.yaml declared by user-profile/v1: user language and time zone, brand voice, workspace output location, shared preferences, and skills.lov-media-creator . The resolution order is current request, project context, Skill records, shared preferences, user/brand Profile, defaults.
Long-term editing preferences or brand facts stated directly by the user are written back to the Profile through scripts/profile_store.py record --confirm , and the save path is reported in the result. Keep source code portable; do not write in personal absolute paths, credentials, or temporary asset locations. For the full contract, see references/user-profile.md。
Skill Group Composition
Before running, read references/skill-composition.md. Adjacent Skills hand off only through files, JSON, subtitles, or finished videos, and are not hidden runtime dependencies of this Skill.
Workflow (MANDATORY)
First branch according to the finished video goal. When the entire course, event, or multi-person sharing needs to be independently sliced, execute references/independent-clips.md and scripts/clip_batch.py: full-piece取舍 → precise intervals → subtitle review → continuous mixing → lock → batch packaging → actual MP4 acceptance.
This branch does not enforce series numbering, chapter cards, official website cards, or end-credits resource pages; full-piece enhancement can be delegated to lov-media-preprocessor and reuse its verified handoff, without re-brightening. When explicit fully automatic review authorization already exists, record the actual agent review and basis before continuing; it must not be written as the user listening and reviewing item by item; publishing authorization and platform readback are still delegated to the publishing capability. Other screen recording / Screen Studio workflows follow the steps below.
Step 0: Parse the runtime environment
- Use the
SKILL_DIRin the environment; when absent, infer the installation directory from the current Skill context. - First verify whether
$SKILL_DIR/scripts/media_probe.py、timeline_check.py、audio_qc.py、check_opening_still.py、subtitle_gate.py、profile_store.pyanditeration_plan.pyexist; for narrative films with multi-track scoring, additionally verifybgm_tracks.py、validate_cues.py、smr_check.py、score_mix.py、intelligibility.py、cut_metrics.py。 - Then verify media workflow, edit manifest, audio mix, cover/title, delivery contract, and
references/iteration-performance.md; for Screen Studio / Remotion projects also readreferences/screen-studio-remotion-qc.md。 - For an ongoing column or existing multi-episode material, additionally verify and read
$SKILL_DIR/references/project-workspace.md; for narrative films such as Vlogs / travel / documentaries, readreferences/narrative-vlog.md; for long films with lots of material, across devices, and spanning multiple days, additionally readreferences/review-page.md; for explainer films where the author speaks in first person about a product or Skill and cites already published finished films, readreferences/explainer-film.md; for content containing 360 material, readreferences/360-reframe.md, and for deriving a second platform aspect ratio, readreferences/platform-variants.md, for Remotion / FFmpeg / ASR pipeline pitfalls seereferences/remotion-pipeline-pitfalls.md。 - Video inspection or rendering requires
ffprobeandffmpeg. For publishing orplatform-readyand there is no approved cover, a new image is required: immediately start the cover branch. - Never overwrite the source video, source audio, or original subtitles; output first goes to an independent
deliverablesor a user-specified directory. .screenstudiois a read-only source project package:project.json、recording/*.m4s, transcript, or event files must not be rewritten in place.
When manually running scripts:
export SKILL_DIR="/path/to/lov-media-creator"
Each call parses context.profile. If the user explicitly proposes editing principles, audio preferences, or brand facts to be retained long term, call scripts/profile_store.py record with --confirm, then briefly report the save path.
Step 1: Clarify inputs and finished-product goals
If the workspace mixes multiple episodes of material, root-level work / output , or old finished films of unclear ownership, first do a read-only inventory according to references/project-workspace.md , then move files.
The default structure istop level by episode, and within each episode layered by lifecycle; do not choose between "all by episode" and "all by medium".
After moving, you must update old paths in project code, delivery reports, and QC JSON, and perform readability/decoding readback on existing finished films.
Record the following facts, and do not fabricate content for the user:
- Source video, supplementary clips, original audio track, BGM, screenshots, and existing cover; input can be a single screen recording, multiple materials, or one
.screenstudiosource project package. - Target platform, aspect ratio, expected duration, audience, publishing title, cover copy, and whether subtitles need to be burned in or use platform CC.
- Evidence segments that must be retained, especially final result playback, real sound, state readback, or failure feedback.
- Deliverables: Remotion Studio main preview, approved archived master, platform final cuts, cover, edit list, audio/encoding QC report, and optional publishing handoff information; only when Subtitle Edit is needed to correct subtitles, add a review MKV + external SRT.
When the target includes publishing or platform-ready default to cover_required=true; reuse an approved cover matching the current platform, otherwise generate it in parallel after the title hook and assets have stabilized. Only preview tasks may defer this; record waived-by-useronly if the user explicitly does not want it. This is independent of opening_still=false .
Cross-platform tasks default to using Video Account as the first production target: first produce, render, and fully QC the 9:16, 1080×1920, 30fps, H.264, AAC 48kHz vertical version; before first release, scan the encoded final cut according to references/delivery-contract.md"Pre-release Privacy Scan" (detector frame-by-frame, manual contact sheet ≥ 5 fps); after reaching platform-ready , first verify the delivery agreement, present "derive according to agreement" and "reuse existing version" along with the work hours for the author to choose, then derive from the same locked timeline and QC the Bilibili 16:9, 1920×1080 horizontal version (see references/platform-variants.md). The two full renders default to sequential execution; run them in parallel only when a short-window benchmark proves that parallelism shortens total wall-clock time. For dual-aspect self-checks when the two aspect ratios share scene code, the published-aspect still-frame gate, and audio copied as-is, see platform-variants "same timeline, only swap the visuals and layout". When flaws are found in an already published version, inform the author and provide options according to the same section in delivery-contract. If the request explicitly specifies otherwise or the Profile has other settings, the current request takes precedence.
Screen Studio source projects are first-class input
When the input is .screenstudio , do not first compress it into a flat MP4. First parse read-only project.json、recording-markers.json、
transcripts/、recording/channel-*-*.m4s、mouseclicks-*.json and keystrokes-*.json, and rebuild by channel:
- display: screen content;
- webcam: independent camera, can be full screen, bottom-right corner, sidebar, side-by-side, or hidden per segment;
- microphone: authoritative voiceover audio track;
- system-audio: system feedback and demo original sound;
- pointer/events: mouse position, clicks, and shortcuts, used for Remotion focus, zoom, and cue animations.
First write the project facts into the source manifest, then generate rebuildable proxy tracks in the workspace; keep the source project package in place. Any missing channel, near-silence, abnormal timestamp, or incomplete event must be recorded as a source-material fact, and must not be faked with other tracks.
When this is episode N of a series (N>1), first read references/series-template.md, then read the project code left by the previous episode. That file is the final-cut standard that every episode must pass (opening strategy, end-card resource card, chapter progress bar, subtitle position, breath handling, key words, same-source music, loudness criteria). Reuse the previous episode's layout constants, progress bar implementation, and confirmed BGM configuration;early programmatic BGM synthesis is deprecated, and the previous work's music synthesizer must not be imported. The consequence of skipping this step is predictable: delivering after only "removing gaps + burning subtitles" will be judged as a rough first cut, and the entire episode will have to be redone. Default opening_still=false: the cover is produced independently and in parallel with rendering, with no further questions. Only when the user actively requests a static first frame within the video should opening_still=true be written to the run record, and the same-aspect assets and adaptation method confirmed before rendering.
Step 1.5: Read adjacent capabilities and handoff boundaries
First look at references/skill-composition.mdto determine whether an optional handoff is needed:
- Chapter bar: hand off to
lov-video-chapter, input is the confirmed finished video or subtitles, output is chapter items/transparent layers. - Learn subtitles: hand off to
lov-subtitle-freedom-skill, input is the finished video or original subtitles, output is SRT/ASS preserving the original timeline. - WeChat Channels cover: when
lov-channels-coveris found, hand off first; if not found, use the current image capability,lov-image-creatoror the project's RemotionCovercomposition to generate the actual slot image, and do not skip it. - General illustrations or covers for other platforms: hand off to
lov-image-creatoror the current image capability, input is cover direction JSON or a text brief, output is PNG/editable HTML. - Video source acquisition: hand off to
lov-media-fetch/lov-media-crawler(for old videos on a platform, first parse metadata only, and download after the author agrees), hand off original images in the local social cache tolov-wdb-cli, output is verified local assets; cloud transcription can be handed off tolov-voice2srt, but explain upload and billing to the author first. - WeChat Channels / Bilibili publishing: when
lov-media-publisheris found and the author requests publishing, hand off; input issubtitle_status=approved、delivery_status=platform-ready、cover_status=approved's platform finished video and delivery report, output is final draft confirmation, publishing status, and list read-back evidence; if not found, stop atplatform-ready, do not start the handoff (publish_statusremainsnot-requested); if the author has requested publishing, state "publishing capability not found" in the report and give the installation commandnpx skills add lovstudio/media-publisher-skill -g -y(ornpx lovstudio skills add media-publisher). This Skill is responsible for the editing judgment, audio integrity, and delivery gate of the final finished video; optional downstream steps must not replace these acceptance checks.
Opening still frame: skipped by default, enabled only when the user actively requests it
The cover and the opening still frame are two deliverables, not two uses of the same image. WeChat Channels assigns them to different scenarios: the cover serves the homepage nine-grid and share cards (as measured on 2026-08-17, the creation page has only one slot, labeled "Personal Homepage and Share Card (3:4)"), while the video picture serves full-screen feed playback (portrait is generally 1080×1920). The platform itself does not expect the two to have the same aspect ratio. The cover is by default aparallel deliverable, and should run in parallel with rendering without blocking each other. But when the user requests "pause at the beginning before entering the main video", that frame becomes aprerequisite for rendering—it is the first frame of the finished video; if it is not finalized, rendering cannot proceed, and changing it is equivalent to re-rendering. By default, do not ask and skip directly; after the user actively raises it, record the choice:
| User choice | Consequence |
|---|---|
| Did not actively request an opening still frame (default) | The cover only makes the card, can run in parallel with rendering, and changing the cover does not require re-rendering; do not ask |
| Requested | Need to separately make an image with the same frame as the finished video, finalize it first; every change to it requires re-rendering |
Using a 3:4 cover directly as a 9:16 first frame would crop 25% off the left and right, and the title group would inevitably be cut off. This is not a tool missing an aspect ratio option,
but ratherusing the wrong asset——lov-channels-cover is only responsible for the cover, and should not grow a 9:16 option for this. Three paths,
from lowest to highest cost:
- Make a separate opening still frame with the same frame as the finished video, sharing the visual language with the cover but each adapted to its own safe area;
- Accept cropping, but after cropping you must visually confirm the title group is complete, and write the cropped ratio into the delivery report;
- Give up the opening still frame and deliver only the cover (default, and in most cases correct—the cover already bears the responsibility of making people stop).
Do not force-fit with scale/pad in this Skill: padding or stretching will ruin the first impression, and it only becomes visible after rendering.
Step 2: Scan the material and build an edit list
First run:
python3 "$SKILL_DIR/scripts/media_probe.py" \
--input SOURCE_VIDEO \
--output WORK_DIR/source-probe.json \
--pretty
Read duration, resolution, frame rate, codec, audio channels, sample rate, and subtitle streams. For long screen recordings, first identify the nodes of "result/promise, problem, key operations, evidence, final result" based on the actual content, then write them into the EDL defined by references/edit-manifest.md ; do not mechanically cut segments by fixed duration.
.screenstudio Do not pass the directory directly to media_probe.py: first create low-bitrate proxy segments for the EDL hit intervals that are invalidated only with the source material,
then probe track by track, and verify that their start points, end points, and clocks are consistent. Microphone editing must first be decoded to 48kHz PCM/WAV, then addressed at the
PCM sample level; input-side seek on AAC/M4S for each segment is prohibited, as it snaps cut points to compressed packet boundaries,
causing filler words to reappear, complete words to be truncated, or speech to stutter.
Filler words, restatements, and slips of the tongue gate
First do a verbatim transcription that preserves tone, then identify standalone "ah / uh / um / er / like", unfinished sentence starts, same-word rollbacks, and corrections where "after saying it wrong, immediately say it again". Delete only the parts that carry no semantics; if a syllable could simultaneously be the start or end of a complete word, keep it by default, until the adjacent PCM segments and sentence meaning both prove it can be deleted. For each micro cut point, check at least:
- the end of the preceding segment is a complete word or a natural pause;
- the start of the following segment has no residual filler sound and no complete word is lost;
- the verbatim transcription of the short window after splicing no longer shows a repeated sentence start;
- if long-window ASR conflicts with two adjacent short windows, rely on the audible original sound and short-window evidence, to avoid mistaking model hallucination for a slip of the tongue.
python3 "$SKILL_DIR/scripts/timeline_check.py" \
--input WORK_DIR/edit-manifest.json \
--duration SOURCE_DURATION \
--output WORK_DIR/timeline-check.json \
--pretty
Low-information segments such as upload pop-ups, waiting, and stuck file pickers should be compressed to a length that conveys the state; if they obscure the real result, skip them directly. Set protected_audio: truefor the final result and original sound, and all subsequent editing and mixing must not mistakenly delete them.
Step 2.5: First plan the invalidation scope for this round
Each round, first update the iteration-current.json stage and eight revision tokens of draft / locked / approved , then run
iteration_plan.py plan. Execute only run, reuse skip, respect blocked; subtitles, layout, BGM, platform, or cover fine-tuning
must not rebuild unrelated media. For the state format and invalidation matrix, see references/iteration-performance.md。
Step 3: Design the narrative, title, and cover
Read references/media-workflow.md and references/cover-and-title.md:
- The protagonist is the actual problem the workflow solves, and the evidence of "finally getting it to run"; tool names appear only when they truly help understanding.
- Preserve the information gap and suspense, but do not fabricate speed, permissions, success rate, or release status; "one-click", "instant publish", and "fully automatic" may be used only when there is corresponding evidence.
- When the user gives a cover main title, respect it verbatim; the cover keeps only this hook and the series identifier, with no explanatory subtitle or spoiler explanation added. Title priority: the title given verbatim by the user > the title of the adaptation source (published article) > the brief's theme sentence ("theme《…》" is by default a creative direction, listed as pending confirmation on first delivery); for adapted works, the cover first uses the image the author has publicly chosen, and when soliciting opinions, directly send 2–3 images side by side, see
references/cover-and-title.md"Covers for adapted works and narrative films". - When the cover needs a person, prioritize reusing the professional photo specified by the user or already confirmed in the Profile/brand assets; extracting frames from the screen-recording camera is only a fallback, and frames with expression adjustment, half-closed eyes, and mid-speech mouth shapes must be avoided. Screen captures are an optional auxiliary layer and are not forced in for the sake of information density.
- The series identifier follows the layout template and stays within the phone safe area, with lower activity than the main title; the full-width bottom bar may be slightly slanted, but the column text keeps stable fonts and baselines. The main title may break the pattern with semantic size variation, but must preserve the Z-shaped reading order and remain legible at a glance when scaled down.
- Section titles must be derived from that segment's actual spoken narration, visuals, and result evidence, and a one-sentence naming rationale must be kept in the scene-break data; do not use process words like "participating in open source" or "co-creating style" to replace the actual themes of that scene, such as "background" or "custom Prompt".
- Avoid templated AI phrasing, vague "redefining efficiency", and excessive large text. The cover should prioritize showing status, interface evidence, or before-and-after comparison.
- Editing rhythm serves comprehension first, stimulation second; after the results segment appears, hide explanatory subtitles and redundant top bars, letting the real footage and original audio bring it to a close.
At the opening, first discriminate, then follow either the automatic or user-override path
First audit the cleaned original opening; do not add Highlights or a title card by default. Write the decision into the manifest's opening:
- Automatic discrimination (default
strategy=auto): when the first sentence or first complete sense group already directly throws out a specific problem, result, conflict, or cost, and there is no rehearsal, pleasantries, or necessary setup, parse it asdirect. Start from the first valid speech; before the problem is fully stated, do not insert Highlights, title cards, or effect subtitles; when a sense of direction is needed, only insert a shortpost_problem_titleafter the complete problem. Short videos lean toward this path. Only when the original opening is vague, has a long setup, and a stronger closed loop exists later, parse it ashighlights, using 2–4 complete short sentences. - User override: the user may explicitly set it to
direct/highlights, and independently toggle, rewrite, or move the post-problem title. The current request takes precedence over the Profile and automatic judgment; recordresolved_strategy、decision_originanddecision_reason. When followinghighlights, select a 6–15 second closed loop based on semantics and acoustic salience. SRT cues serve only assemantic anchors, not cut points; use PCM to preserve complete word onsets and sentence endings, and run short-window ASR and first/last listening checks on the rendered segment; see the QC reference for the complete gate. When the cover followslov-channels-cover, the title hook is judged by that Skill's gate; when following the fallback path, the same title, series, and factual constraints apply. This Skill is responsible forwhether the facts claimed by the cover match the final video—the numbers, platform status, and result promises on the cover must actually appear in the video. Once the title hook and portrait/interface assets are stable, generate images in parallel; do not wait until the publishing handoff to fill them in. When Step 1.5 selects an opening still frame, that image must be finalized before entering Step 5.
cover-brief.md is only a plan, not a cover deliverable. Once the goal includes publishing or platform-ready, the PNG/JPEG required by the current platform's actual slots must be obtained,
and dimensions, four-edge bands, safe areas, and visual composition checked one by one; when there is only a brief,
prompt, direction draft, or generation script,creative_status is still blocked-on-cover-render. Do not mark a delivery as complete with a missing cover just because the video,
subtitles, and copy have all passed.
Step 4: Edit the visuals and protect key original audio
For series videos, at this step compare item by item against references/series-template.md 's hard checklist; the following is the general part.
Rhythm: breaths are not the point; dead air is. When the user says "cut the filler words," those words are usually not what's actually dragging the rhythm. Measured account (EP.02): filler words + trailing sentence-end drawls totaled 9.0s, while segments with no one speaking and nothing moving on screen totaled 216s. So pause detection should use a 10ms-granularity scan of the entire envelope, not just enumerate "large gaps ≥1.2s." Handling falls into two categories: static pauses are cut to 0.14s (0.40s at chapter boundaries),pauses with on-screen action are frame-extracted, not deleted—deleting them from a demo video breaks it.
Once splice density goes up (hundreds of vocal splices), fades must shorten accordingly to ~6ms; a 30ms ramp will wear away the initial and final consonants of short phrases; the precondition is that every cut point has been snapped to the nearest quietest 10ms window.
- First do a rough cut according to the EDL, then do a continuity check; transitions, speed-ups, and trims must all serve information density.
- The upload modal keeps only the necessary enter, select, and complete signals; stuttering segments need only appear briefly, so that waiting does not become the main body of the video.
- BGM is an atmosphere layer, not the lead. When there is dialogue, click feedback, or final video playback, lower the BGM; when the outcome segment needs the original audio clearly audible, you may temporarily keep only the original audio (narrative films keep the score continuous per 6a).
- BGM uses fades and ducking to avoid loop seams, abrupt onsets, and tail truncation. For specific filters and parameters, see
references/audio-mix.md。 - If the source material itself has no usable original audio, mark that fact; do not use BGM to fake real feedback.
- Series films use the agreed
Screen Studio Lo-fi / Bright Loungeby default: build a continuous music bed from licensed material; do not run or reuse the previous work's procedural synthesizer,make_music.pyor similar generation scripts; if material is missing, block and report; do not fall back to procedural synthesis or temporary substitute tracks. 6a. Narrative films such as vlogs, travel, documentaries, and promos do not use the series default: the user's entire music library is usable, and should not be narrowed to the few tracks they casually named; first try the tracks the author named at their suggested positions, mix multiple tracks according to chapter and the true mood at the time, and write the narrative reason for each cue. The score by default runs continuously from start to finish, one track handing off to the next; voiceover only lowers the music, never stops it (narrative films do not apply point 3 above or the temporary silence in audio-mix "basic strategy"); silence is given only to the segments the author requests; before delivery, scan the music stem for gaps longer than 2 seconds; lyrics in the same language as the dialogue are by default not compressed under dialogue, and are conditionally allowed only when the author explicitly names that track to be bedded under dialogue or explicitly says not to stop the music for voiceover; on the cue uselyric_overrideto record the reason and the author's original words; for allowed sentences, compare the CER mean by group against the pure-vocal baseline, and only order spot-listening sentence by sentence; under text cards, avoid lyrics by default; vocals and music need not be mutually exclusive; choose clear / blend / feature by moment, and leave enough breath at segment transitions; work in scene units and change tracks sparingly; agent-initiated changes only subtract; usecut_metrics.pyto measure fragmentation. For text cards, photos, voiceover cut points, and character wording, seereferences/narrative-vlog.md。validate_cues.py --preset narrative、smr_check.py、intelligibility.py's three objective gates against inaudibility (values are calibration references) andscore_mix.py's linear master (-3 dBTP) seereferences/audio-mix.md's "multi-track scoring for narrative films." 6b. Key products mentioned in the video must be researched and then placed back into the frame; self-developed products take priority(search → official site → distill current positioning → capture hero/brand assets → picture-in-picture held 4.5–5.5 seconds). For the process, how to measure placement, and$ego-browsersee the pitfallsreferences/pip-research.md。 - Keyword emphasis must have an upper limit: the same word has a count limit, at most one occurrence per line, and high-frequency words that appear in half the sentences are excluded; accompanying sound effects are diluted by "at most once every N seconds". A screen full of emphasis equals no emphasis.
- Chapter cards in a long-video series follow the opening strategy: for knowledge-sharing content, 1.8–2.4s is recommended, showing "Chapter N + semantic title"; cards must land on spoken-sentence boundaries or EDL clip boundaries, during which the voiceover pauses, while low-volume background music and light transition sounds may continue.
highlightsThe path may place the first chapter card after the main title card;directthe path may skip the first chapter card to avoid interrupting an already established opening, with subsequent chapter cards as usual. Inserting cards changes subsequent subtitle and chapter timecodes, so offsets must be accumulated by the same mapping function.
Screen Studio + Remotion phased media architecture
draft lazily generate source-scoped low-bitrate proxy segments according to the EDL, without pre-transcoding the full long source track; subtitles, layout, and cards only update upper-layer data.
locked only then generate equal-length continuous masters for display, webcam, microphone, and system-audio according to the EDL; Remotion attaches
only one continuous media element per track.approved only then run the platform final version. Before long tasks, first run seam, visual, or audio canaries, and stop locally on failure.
When this episode's voiceover is noticeably slow, by default try cutting at 1.08×–1.15× while preserving the original pitch; the gate is sentence intelligibility, no consonant loss, and demo actions still being able to keep up. After the landscape version is locked, derive the vertical version from the same data timeline, without separately duplicating editing facts.
Voiceover speed changes must not be implemented by resampling. resample / resample_poly changes both duration and pitch; for dialogue and real system sound, use only FFmpeg atempo / Rubber Band and other pitch-preserving time-stretch, and lock the sample count according to output_frames × samples_per_frame . Acceptance must A/B against the 1.0× source audio; loudness reports cannot replace pitch perception.
The vertical safe area is defined by the final publishing container rather than the bare canvas; for WeChat Channels 1080×1920, reserve about 160px at the top in the first round and calibrate with real-device screenshots; the chapter bar, main stage, and debug frame share one set of constants, see references/screen-studio-remotion-qc.md。
BGM is always mounted last. First lock the visuals, voiceover, system sound, subtitles, and chapters, then expand the authorized
Screen Studio Lo-fi / Bright Lounge into a continuous music bed of equal length to the final timeline
with seamless crossfades, and finally mount it only once at the Remotion root layer with global ducking. BGM must not be cut segment by segment along the EDL, repeatedly mounted, or restarted at transitions. Programmatically synthesized BGM is a deprecated path; when the agreed track or licensed source cannot be obtained,
record audio_status=blocked-on-agreed-bgm, and do not generate or substitute tracks on your own.
Remotion is also responsible for animated titles enabled according to the opening strategy, chapter progress bars, webcam B-roll layouts, visual explanations, professional subtitles, transitions, landscape and vertical versions, and cover Compositions. Animations must be driven by useCurrentFrame() and other timelines, without using runtime CSS animations; the final duration, fps, and aspect ratio are uniformly calculated by data/Composition registration.
Step 5: Use Studio as the primary preview; upgrade evidence by stage
draft First start or reuse Studio to quickly review the cut with proxies, the current EDL/subtitles/layout, and the preview mix; run only the local canaries affected by this round, without waiting for the final continuous master, final mix, full-film ASR, or full-track complete decoding.locked Only then switch to the continuous master
and final mix, and perform complete decoding, full-film ASR, keyframes, and loudness checks.approved Only then render the platform file and perform full QC.
Remotion Studio is always the primary preview for picture, pacing, sound, and subtitles; MKV is only used for Subtitle Edit subtitle handoff. When the author reviews the cut online, the main agent directly edits the edit list, re-renders only the changed shots, and advances Studio; by default it does not start a long workflow where multiple agents each produce a version for review, and does not render a preview every round; before sending the link, confirm the service is running and loading this round's data (see references/iteration-performance.md"Author Online Rapid Iteration").
The full matrix is in references/screen-studio-remotion-qc.md。
Studio passing does not equal the final encoded picture passing. OffthreadVideo The preview may be <video>, and the final version is <img>; the style should go into a
stable wrapper or cover both video, img. The final version must be extracted fromthe encoded final film itselfinto a camera representative frame contact sheet; see the QC reference.
The locked primary preview audio must not be re-assembled from the original stems. After picture and dialogue are locked, BGM ducking, and overall loudness processing are complete, first generate
a final mix; the main Studio Composition mounts only this one, and it is either from the same source as the approved master's audio or stream copied from it.
microphone、system-audio And the independent BGM track is kept only for diagnostics, and must not both remain in the primary preview causing duplicate mixing. Acceptance must
record the final mix's SHA-256, LUFS-I, and dBTP, and confirm in the Studio component tree that there is only one audio instance.
When subtitles exist, preview them in Studio first; only when the author needs to correct them with Subtitle Edit do you run the two subtitle gates. Before approval, do not generate the platform MP4, and do not call the file the final film. After the author returns the SRT, you must, without overwriting the author's file, sync it back to the Remotion subtitle data, refresh the existing Studio, and re-check the subtitles, picture, and sound.
Step 5A: Generate the picture master with hard subtitles and no narration
Use FFmpeg to uniformly re-encode once, avoiding multiple lossy exports. The title card, chapter title cards, chapter bars, identity blocks, and non-subtitle graphics may remain in the picture; narration subtitles that the author needs to proofread must not be burned into this version. Common picture master parameters:
ffmpeg -y -hide_banner \
-i SOURCE_VIDEO \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black,fps=30" \
-c:v libx264 -preset medium -crf 18 -pix_fmt yuv420p \
-an WORK_DIR/video-master-no-subs.mp4
If multiple picture segments, original sound, and BGM are involved, use filter_complex to explicitly map video and audio; do not rely on default stream selection. Keep the source material in place.
Step 5B: As needed, package the Subtitle Edit subtitle correction MKV
Only when Subtitle Edit is needed to correct subtitles, package the picture master with hard subtitles and no narration, the final audio, and the final film timeline SRT
into an MKV, and at the same time put the same SRT separately in
deliverables/. Subtitle Edit can open the MKV directly; the external SRT lets the author proofread without extracting tracks. The SHA-256 of both
must be written into the report at the same time. This MKV is a subtitle correction exchange file, not the Remotion primary preview, and is not used for picture review.
python3 "$SKILL_DIR/scripts/subtitle_gate.py" review \
--video WORK_DIR/video-master-no-subs.mp4 \
--audio WORK_DIR/audio-master.wav \
--srt DELIVERABLE_DIR/review-v0.1.srt \
--output DELIVERABLE_DIR/review-v0.1.mkv \
--report DELIVERABLE_DIR/subtitle-review.json
At this point you may only record:
render_status: review-ready
subtitle_status: awaiting-review
delivery_status: blocked-on-subtitle-approval
Do not generate or hand off the platform MP4, do not write final、approved or publish-ready. The user can modify the text, line breaks, and timecodes in Subtitle Edit;
the saved UTF-8 SRT is the sole authoritative subtitle source thereafter.
Author Ownership Gate (mandatory): Once the reviewed MKV/SRT is handed to the author, it becomes an immutable author input. Automation must not export subtitles again to the same path, nor rebuild from the transcript, an old timeline, or ASR results and overwrite it; re-running the review package must use a new review version number. If the author inserts chapter title cards, an intro, or modifies the EDL after proofreading, the author SRT must be migrated to the new timeline via an explicit time mapping, output as a new approved SRT, and report whether the text was preserved verbatim before and after migration. Re-transcription must not be used as a substitute for migration.
Step 5C: After subtitles are approved, package and archive the master and platform files
Only after the user explicitly confirms the subtitles have passed, run the approval gate:
python3 "$SKILL_DIR/scripts/subtitle_gate.py" approve \
--review DELIVERABLE_DIR/review-v0.1.mkv \
--srt DELIVERABLE_DIR/subs-approved-v0.2.srt \
--expect-edits \
--output DELIVERABLE_DIR/master-v0.2.mkv \
--report DELIVERABLE_DIR/subtitle-approved.json
When the user explicitly says "the subtitles have been changed",--expect-edits is mandatory: if the approved SRT is exactly identical line by line to the embedded subtitles in the reviewed MKV, the gate must fail; first check Subtitle Edit's automatic backups or the author's save path, and do not copy identical files as approved. The approval report must record the review MKV, the approved SRT's path, mtime, SHA-256, line count, and
changed_from_review; if there was a timeline migration, also attach the migration report. Even if the author only changed line breaks or timecodes, it counts as a valid difference.
The script validates UTF-8, timecodes, positive duration, order, no overlap, film boundaries, and consistency with the extracted embedded subtitles, and replaces the subtitle track via stream copy; video and audio are no longer lossily encoded.master.mkv is the archive master and is not automatically equal to the platform upload file.
The platform container is subject to the current upload interface each time. Default strategy:
- Even if Bilibili allows MKV, prefer delivering H.264/AAC MP4: directly deliver the rendered H.264/AAC MP4 at the original bitrate, without secondary compression for bitrate; and upload the approved SRT as platform CC subtitles; if the user requires subtitles to always be visible, burn them in once from the subtitle-free picture master.
- WeChat Channels prefers H.264/AAC MP4; when the platform does not explicitly promise to preserve the MKV embedded subtitle track, use the MP4 burned in with the approved SRT; output the video bitrate once according to the platform's recommended ≤ 10 Mbps (CRF + maxrate about 9M +
+faststart, see platform-variants), without waiting for the upload pre-check to re-compress. - When only the container needs to be changed and the video/audio are already H.264/AAC, use
-c copy -movflags +faststart; do not transcode the MKV again; only re-encode the video when burning in subtitles.
A platform "accepting MKV" does not equal "preserving the subtitle track inside the MKV". The report must separately record the container support evidence, the subtitle delivery method (embedded / platform-cc / burned-in) and the verification date. Each derived platform file must also record
subtitle_source_sha256, and it must be the same as the SHA-256 of this time's approved SRT; for the WeChat Channels burned-in version, at least three real frames hitting the author's modification points must be extracted from the final file, and only after visually confirming the modified text and subtitle style may it be handed to the publishing Skill.
Opening still frame: determine the aspect ratio first, then render
When Step 1.5 selected an opening still frame, a read-only determination must be run before rendering,do not directly -loop 1 splice it on:
# --still 传的是与成片同画幅的静帧图,不是主页卡片用的 3:4 封面
python3 "$SKILL_DIR/scripts/check_opening_still.py" \
--still DELIVERABLE_DIR/opening-still-1080x1920.png \
--video WORK_DIR/body.mp4 \
--hold 1.5 --json
When the aspect ratios match, it returns ok: true and a directly executable ffmpeg_command. When the aspect ratios do not match,default exit code 1, and you must explicitly choose one path:--allow-crop(crop the picture edges) or --allow-pad(The first frame has black bars).
The point of this gate is to turn "how much was cropped" into a decision written into the delivery report, rather than discovering it
from the picture only after rendering for several minutes. When the crop loss exceeds 12% or upscaling beyond 1.05x is needed, it raises a separate warning—at this point the title group
has very likely been cut off, and after cropping you must visually confirm the first frame; you cannot rely only on the exit code.
On the audio side, you need to pad a stretch of silence equal in length to the first frame, otherwise after concat the entire audio-video will shift forward, and the original sound of the results segment will
be out of sync with the picture; the command given by the script already includes anullsrc. When the final cut has no audio track, change it to -an and delete the audio chain.
The first-frame hold defaults to 1.5s; below 0.6s it raises a warning: the audience won't have time to finish reading the title, which amounts to leaving a frame for nothing.
Step 6: Do media and audio QC
python3 "$SKILL_DIR/scripts/media_probe.py" \
--input REVIEW_OR_APPROVED_OUTPUT \
--output DELIVERABLE_DIR/final-probe.json \
--pretty
python3 "$SKILL_DIR/scripts/audio_qc.py" \
--input REVIEW_OR_APPROVED_OUTPUT \
--output DELIVERABLE_DIR/audio-qc.json \
--pretty
ffmpeg -v error -i REVIEW_OR_APPROVED_OUTPUT -f null -
Review item by item the opening, each chapter title card, each key cut point, the continuous playback of the final result, and the ending. At minimum confirm: the chapter titles summarize the actual content,
the black screen card hasn't cut into a sentence, after the card the audio-video and subtitles are in sync, the final segment still has sound, the BGM doesn't drown out the voice, the picture has no undesigned black frames
or unexpected still frames, the upload popup doesn't occupy the main subject, and the official cover thumbnail still conveys the theme. The cover must be opened as the actual image for visual inspection;
spec.json, generation logs, file names and cover-brief.md cannot substitute for looking at the image. The review version must also confirm that the MKV contains exactly one default
SubRip subtitle track, and extract it to verify it matches the external SRT item by item. Target loudness reference -16 LUFS-I ±1.5, True Peak controlled below
-1 dBFS ; actual values are subject to the report. For films with voiceover plus music and segments left with pure music, master with static gain plus a peak limiter, not the loudnormthat falls back to dynamic mode; a screen recording with a single music bed is not subject to this limit, see references/audio-mix.md"General Linear Mastering".
For the final MP4 / MKV, additionally extract a contact sheet of representative frames covering the actual opening strategy,camera-full, picture-in-picture, side-by-side and ending, to confirm the face subject,
cropping and object-position are correct, with no abnormal local areas on the beard or forehead; the evidence must come from the encoded file, not from Studio / DOM.
When an opening still frame was made, additionally extract the first frame for visual confirmation;a script exit code of 0 cannot replace looking at the image:
ffmpeg -y -v error -i REVIEW_OR_APPROVED_OUTPUT -vframes 1 DELIVERABLE_DIR/first-frame.png
Check three things: the title group is complete and not cropped off, there are no black bars on the four sides, and the transition from the first frame to the main content is not abrupt. Also confirm the audio
has not shifted forward overall—the first-frame stretch should be silent, and the position of the first sentence of the main content matches body.mp4 .
Step 7: Delivery and release handoff
In an ongoing series, deliverables go into this episode's deliverables/, process files go into this episode's work/, and raw materials stay in
this episode's sources/; only backgrounds, font notes or series-level templates reused across two or more episodes are promoted to the root-level shared/.
In the report, prefer writing paths relative to this episode's directory, to avoid all evidence links failing after the workspace is renamed or migrated.
Generate the delivery report according to references/delivery-contract.md , clearly stating separately:
render_status: whether the final cut was exported and passed decoding and parameter checks;subtitle_status:awaiting-review/approved; only after user confirmation can you writeapproved;delivery_status: whether it is still blocked by the subtitle approval gate, or has alreadyplatform-ready;audio_status: whether the original sound, BGM, loudness and peaks pass;creative_status: whether the title, cover, narrative and evidence segments are complete;publish_status: whether it was handed off to the release Skill, whether it has been published, and whether there is an online read-back.
"Proofread version rendered", "Subtitles approved", "Platform file generated", "Uploaded", "Published", and "Read back" are six distinct statuses. Only when genuine platform read-back evidence is present should publish_status be written as published。
Publishing-type deliverables additionally record cover_status:missing / brief-only / rendered / approved。
creative_status=passed can only appear together with cover_status=approved ;rendered only means the image has been generated,
and size, safe area, four-edge bands, and visual inspection have not yet been completed. Only when the user explicitly states that no cover is wanted for this issue may
cover_status=waived-by-userbe recorded, and the executor must not grant an exemption on their own.
When an opening still frame has been made,creative_status additionally record three items, because they determine whether that frame of this version of the final cut can still be changed:
| Field | Content |
|---|---|
opening_still |
true |
opening_still_source |
The still image's file path and version number |
opening_still_fit |
match / crop:<裁掉比例> / pad, and the dwell seconds |
State one precondition clearly:The first frame of this version of the final cut is bound to this version of the still image, and changing the image requires re-rendering. The still frame and the cover are two files, and they should share the same visual language; otherwise the cover the viewer sees on the listing page and the first frame after clicking in look like they come from two different sources.
Validation
Before completion, run:
python3 "$SKILL_DIR/scripts/validate_skill.py" "$SKILL_DIR"
python3 "$SKILL_DIR/scripts/media_probe.py" --help
python3 "$SKILL_DIR/scripts/timeline_check.py" --help
python3 "$SKILL_DIR/scripts/audio_qc.py" --help
python3 "$SKILL_DIR/scripts/check_opening_still.py" --help
python3 "$SKILL_DIR/scripts/subtitle_gate.py" --help
python3 "$SKILL_DIR/scripts/iteration_plan.py" --help
for s in bgm_tracks validate_cues smr_check score_mix intelligibility cut_metrics; do python3 "$SKILL_DIR/scripts/$s.py" --help >/dev/null; done
Also check skill-card.yaml、skill-card.md、cases/cases.json and pricing-card.yaml. Keep at least one real Input → Prompt → Output case, record three or more quality dimensions with evidence, and indicate the free/paid channel status.
Dependencies
- Python 3.8+ standard library;
PyYAMLis used for Skill structure validation; narrative video soundtrack gating and mixing requirenumpy, and the intelligibility gate additionally requiresmlx-whisperoropenai-whisper; prefer running with an existing persistent venv (see audio-mix "Runtime Environment"). - FFmpeg and FFprobe are used for video decoding, transcoding, frame extraction, and audio quality checking.
- Optional Pillow, Playwright, or image generation capability, for new cover assets; installation is not mandatory when a cover already exists.
- The Screen Studio source project workflow requires Node.js and Remotion; Remotion only reads the workspace proxy track and does not modify the source project package. Optional subtitle, chapter, and media publishing Skills hand off only through deliverable files and are not installation dependencies of this Skill;
npx lovstudio skills add media-creatorwill use the frontmatter'sdependencies:to indicate the optionallov-media-publisher, and only install with--with-deps; thenpx skills addpath does not read this item.