
用 Remotion 把散片段拼成一條片時間線定位與過渡效果拆解【免費下載鏈接】remotion Make videos programmatically with React項目地址: https://gitcode.com/GitHub_Trending/re/remotion把三段不同長度的素材卡著節(jié)奏排進同一條時間線傳統(tǒng)做法是在剪輯軟件里手動拖拽、逐幀對齊銜接處再補轉(zhuǎn)場關(guān)鍵幀素材一改就得重來。這篇文章用 Remotion 做程序化視頻拼接把拼接關(guān)系直接寫成代碼時間線、時長與轉(zhuǎn)場全部可復(fù)現(xiàn)。最短路徑跑通一條命令初始化空白項目npx create-videolatest my-video --template blank cd my-video往合成文件里寫兩段片段打開新項目的src/Composition.tsx把內(nèi)容替換成兩段Sequence一行核心寫法長這樣Sequence from{90} durationInFrames{150}Main //Sequence啟動 Studio 預(yù)覽畫面npm run dev瀏覽器里的 Studio 會打開預(yù)覽拖動時間線可以看到兩段畫面在第 90 幀切換第一次視頻拼接就跑通了。如果跑通往下看原理如果報錯跳到避坑清單章節(jié)。它是怎么工作的視頻拼接的核心對象是Sequence它把一組 React 組件包起來聲明這段內(nèi)容在全局時間線里的位置。兩個關(guān)鍵參數(shù)from起始幀號默認(rèn) 0durationInFrames持續(xù)幀數(shù)幀之于視頻猶如節(jié)拍之于音樂每段素材的起點和長度都能用節(jié)拍說清楚時間線就完全確定。Sequence from{0} durationInFrames{90} {/* from: 起點幀durationInFrames: 長度 */} Intro / /Sequence Sequence from{90} durationInFrames{150} {/* 起點正好接上一段的終點無縫拼接 */} Main / /SequenceSequence支持嵌套內(nèi)層序列的幀號相對外層重新計算每個模塊可以獨立開發(fā)調(diào)試實現(xiàn)見 packages/core/src/Sequence.tsx。把它用到真實場景多段視頻拼接三段不同長度的素材首尾相接排在同一條時間線上。import {AbsoluteFill, Sequence, Video, staticFile} from remotion; export const Concat: React.FC () ( AbsoluteFill Sequence from{0} durationInFrames{120} {/* 片段一第 0–120 幀 */} Video src{staticFile(intro.mp4)} / /Sequence Sequence from{120} durationInFrames{180} {/* 片段二緊接片段一結(jié)束處 */} Video src{staticFile(main.mp4)} / /Sequence /AbsoluteFill );為什么這樣寫每段片段的起始幀等于前一段的結(jié)束幀時間線只有一份真值Video只會加載當(dāng)前播放范圍內(nèi)的媒體文件片段再多也不白占帶寬。從手動重疊到聲明式轉(zhuǎn)場手寫淡入淡出要自己用插值算淡出與淡入兩段的透明度片段一多幀號就散得到處都是。remotion/transitions的TransitionSeries是自動處理重疊的序列容器呈現(xiàn)效果做什么與時間曲線怎么做彼此分離。聲明每段時長和轉(zhuǎn)場時長即可總時長自動累加。帶淡入淡出的轉(zhuǎn)場拼接銜接處不想要硬切想要平滑溶解時替換掉TransitionSeries。import {TransitionSeries, linearTiming} from remotion/transitions; import {fade} from remotion/transitions/fade; export const WithTransition: React.FC () ( TransitionSeries TransitionSeries.Sequence durationInFrames{120}Intro //TransitionSeries.Sequence TransitionSeries.Transition presentation{fade()} timing{linearTiming({durationInFrames: 30})} / TransitionSeries.Sequence durationInFrames{180}Main //TransitionSeries.Sequence /TransitionSeries );為什么這樣寫30 幀的轉(zhuǎn)場時長由容器自動從上一段尾部與下一段頭部各取一半計算重疊無需手算換成slide或springTiming只改一個詞轉(zhuǎn)場拼接的效果即可切換。避坑清單癥狀視頻后段音畫逐漸錯位。原因素材是可變幀率VFR渲染按固定幀推進。處理導(dǎo)入前把素材轉(zhuǎn)成恒定幀率ffmpeg -i intro.mp4 -vsync cfr -r 30 intro-cfr.mp4癥狀預(yù)覽只出現(xiàn)第一段或成片尾部被截斷。原因各片段from durationInFrames之和超過合成注冊總時長多出來的部分被裁掉。處理注冊合成時把總時長寫足Composition idConcat component{Concat} durationInFrames{300} fps{30} width{1920} height{1080} /癥狀性能/資源相關(guān)1080p 多段拼接渲染慢、內(nèi)存飆高。原因默認(rèn)全分辨率并行渲染視頻解碼占用大量內(nèi)存。處理預(yù)覽降采樣、渲染降并發(fā)、中間幀改有損格式參數(shù)建議值作用--scale預(yù)覽0.5成片1預(yù)覽降分辨率流暢度更高--concurrencyCPU 核心數(shù) ÷ 2限制并行渲染幀數(shù)壓內(nèi)存峰值--image-formatjpeg幀以有損格式落盤減少磁盤寫入接下來往哪走轉(zhuǎn)場特效庫remotion/transitions內(nèi)置 fade、slide、crossZoom 等二十余種呈現(xiàn)效果可混用springTiming等時間曲線packages/transitions/項目模板template-blank 是空白骨架template-music-visualization 展示了多媒體源的視頻拼接結(jié)構(gòu)packages/template-blank/官方文檔docs 目錄里 Sequence、視頻與轉(zhuǎn)場各有專門章節(jié)查參數(shù)方便packages/docs/以上代碼均可在項目模板中找到對應(yīng)實現(xiàn)直接 fork 跑一遍比讀十遍文檔更快?!久赓M下載鏈接】remotion Make videos programmatically with React項目地址: https://gitcode.com/GitHub_Trending/re/remotion創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考