达里亚视频编辑套件 (darija-video-editing) 是做什么的?
专为使用摩洛哥达里亚语(الدارجة المغربية)拍摄的高码率手机素材(MotionCam Pro / Android / Open Gate)量身定制的完整流水线,集成于Storyteller FilmCraft编辑器。
解决了达里亚手机视频制作的四个关键难题:
- MTP总线停滞与断开:弹性顺序文件拉取,支持基于字节级别的断点续传。
- 播放延迟与磁盘膨胀:超紧凑960×720帧内友好代理(
-bf 0,-tune fastdecode),解码速度达138+ fps,节省**>96%**磁盘空间。 - FilmCraft语言不匹配:使用
faster-whisper(--language ar)替代默认英语转录,通过stdin安全流式传输词级时间戳,规避LinuxARG_MAX上限。 - YouTube增长协同:先构建长视频叙事结构,再衍生出高留存率的9:16竖版Shorts,直接通过YouTube“相关视频”功能链接。
5阶段操作协议
[手机 (MTP)] ──> 步骤1: mtp_ingest.py ──> [原始素材]
│
├──> 步骤2: generate_proxies.py ──> [960x720代理文件 (~1.5GB)]
│
├──> 步骤3: darija_transcribe.py ──> [词级时间戳]
│
└──> 步骤4: filmcraft_pipeline.py ──> [LongForm_Fisik101.fcproj]
│
(审核通过的主剪辑)
│
步骤5: 9:16 Shorts产线
阶段1: 移动端与MTP弹性摄入
手机拍摄素材(例如MotionCam Pro 4K/UHD Open Gate)通过USB传输时会产生40–100 GB文件。标准的GVFS/MTP GUI复制时常在长时间传输过程中崩溃或卡死。
运行弹性顺序摄入工具:
python3 scripts/mtp_ingest.py \
--dst "/path/to/project/raw_footage" \
--pattern "*.mov" \
--date "YYMMDD"
- 智能分块续传:如果10 GB文件传输中途中断,引擎会读取磁盘上已有的字节数,定位到精确偏移量,然后只追加剩余分块,无需重新下载之前数GB数据。
- 顺序线程:强制严格单文件顺序传输,防止MTP协议管道冲突。
阶段2: 轻量级编辑代理(对磁盘与CPU友好)
原始4000×3008素材在标准CPU上播放低于实时速度(约18 fps)。这些代理文件可实现即时、零延迟的时间线浏览,同时仅占用原始磁盘空间的不到4%:
python3 scripts/generate_proxies.py \
--input "/path/to/project/raw_footage" \
--output-dir "/path/to/project/proxies" \
--width 960 \
--crf 24
- 规格:
- 缩放:
960×720(精确4:3)或960×540(16:9)。 - 零B帧(
-bf 0)与GOP 60:即时帧搜索,零预测性帧间解码延迟。 - Fastdecode调优(
-tune fastdecode):禁用高复杂度CABAC和环内去块滤波;在FilmCraft中解码速度达138+ fps。 - 音频直通(
-c:a copy):逐位无损复制原始48 kHz立体声音频,保留清晰的波形和对话同步在音轨A1上。 - 磁盘占用:1小时4K素材总计约~1.5 GB(节省>96%空间)。
- 缩放:
阶段3: 摩洛哥达里亚语音识别与原生FilmCraft注入
FilmCraft的原生自动转录默认为英语("defaultLanguage": "en")。使用达里亚转录引擎提取词级时间戳:
uv run --python 3.12 --with "faster-whisper" --with "av<14" python3 \
scripts/darija_transcribe.py \
--input "/path/to/clip.mov" \
--output "/path/to/transcripts/clip.json" \
--model small \
--language ar
安全的Stdin转录注入(绕过ARG_MAX)
长剪辑(>5分钟)会产生数千个带时间戳的词。通过命令行字符串传递会导致OSError: [Errno 7] Argument list too long。
始终使用filmcraft-cli run -通过stdin流式传输JSON命令负载:
import json, subprocess
TICKS_PER_SEC = 254016000000
cmd_obj = {
"id": "transcript.set",
"params": {
"item": item_id,
"transcript": {
"language": "ar",
"speakers": [{"name": "Speaker 1"}],
"words": [
{
"text": w["word"],
"start": int(round(w["start"] * TICKS_PER_SEC)),
"end": int(round(w["end"] * TICKS_PER_SEC)),
"speaker": 0
}
for w in words_data
]
}
}
}
subprocess.run(
["filmcraft-cli", "--project", "project.fcproj", "--save", "run", "-"],
input=json.dumps(cmd_obj) + "\n",
text=True
)
阶段4: 长视频时间线主汇编
通过一个命令套件编排整个FilmCraft项目和时间线:
# 1. 初始化主4K序列(V1-V3, A1-A3)
python3 scripts/filmcraft_pipeline.py init \
--project "/path/to/LongForm_Fisik101.fcproj" \
--sequence-name "Master Assembly" \
--width 3840 --height 2160 --fps 24.0
# 2. 批量导入所有原始素材
python3 scripts/filmcraft_pipeline.py import \
--project "/path/to/LongForm_Fisik101.fcproj" \
--media "/path/to/raw_footage"
# 3. 按时间顺序将剪辑放入V1/A1轨道
python3 scripts/filmcraft_pipeline.py assemble \
--project "/path/to/LongForm_Fisik101.fcproj"
# 4. 为所有项目附加生成的代理文件
python3 scripts/filmcraft_pipeline.py attach-proxies \
--project "/path/to/LongForm_Fisik101.fcproj" \
--proxies-dir "/path/to/proxies"
# 5. 为所有项目注入达里亚转录
python3 scripts/filmcraft_pipeline.py attach-transcripts \
--project "/path/to/LongForm_Fisik101.fcproj" \
--transcripts-dir "/path/to/transcripts"
全局偏好设置
确认~/.local/share/filmcraft/preferences.json中包含以下设置,以确保FilmCraft启动时自动默认使用代理播放:
"enableProxies": true
阶段5: YouTube增长与Shorts衍生产线(@fisik101)
一旦长视频主剪辑完成并得到批准:
- 策略性发布节奏:
- 长视频:每周1到2个视频(两次上传间隔48–72小时,以便浏览与推荐算法建立索引)。
- Shorts:每天2到3个Shorts,间隔3到4小时(例如 GMT+1 13:00、17:00、21:00)。
- 相关视频流量漏斗:
- 对于每个从长视频衍生的Shorts,在YouTube Studio中将其“相关视频”链接设置为父级长视频。
- 将Shorts的大量观看转化为长视频的观看时长和频道订阅者。
- Shorts画布与样式:
- 9:16竖版画布(1080×1920)。
- 高对比度动态字幕位于麦克风/胸部安全区内(
margin_v: ~420px)。 - 钩子→故事→回报结构(死寂>0.4秒被切除,保留80毫秒辅音保护缓冲)。