post(devops): every player stuttered on the same video — the file was blameless (EN+ZH) + og/banner
Deploy / build (push) Successful in 24s
Deploy / build (push) Successful in 24s
The converted HEVC stuttered in VLC, Chrome and on an iPad (offline) while the source played fine. Container timing was perfect (5818/5818 frame intervals at exactly 0.040000 s, no dup/backward PTS, ctts not flat) and a full decode printed nothing. Cross-decoder SSIM found the real defect: NVDEC's legacy av1_cuvid wrapper returns frames from the wrong timestamps - 106 of 5819 frames, SSIM down to 0.330, deterministically, roughly every 30 frames - and the HEVC output was a faithful encode of those wrong pictures (min 0.991 against the NVDEC decode, min 0.330 against a software decode). Fix is one line (-hwaccel cuda -hwaccel_output_format cuda -c:v av1, verified 1.000000 over 1500 frames; vp9_cuvid unaffected). Adds the content gate (structure AND pictures, defect-shaped thresholds) to the pipeline.
This commit is contained in:
@@ -1149,6 +1149,24 @@ BANNERS['putting-a-front-door-on-an-app-you-cant-modify'] = {
|
||||
],
|
||||
};
|
||||
|
||||
BANNERS['every-player-stuttered-the-file-was-fine'] = {
|
||||
titlebar: "root@media - the file was blameless",
|
||||
lines: [
|
||||
{ t: 'prompt', text: "$" }, { t: 'cmd', text: "tsconv --file 5YkGHtaduGU" },
|
||||
{ t: 'dim', text: "container: 5818/5818 frames @ 0.040000 s" }, { t: 'dim', text: "decode: rc=0, zero errors printed" },
|
||||
{ t: 'err', text: "pictures: 106 frames wrong (SSIM 0.33)" }, { t: 'prompt', text: "$" },
|
||||
{ t: 'cmd', text: "-hwaccel cuda -c:v av1" }, { t: 'ok', text: "0 wrong frames SSIM 1.000000" },
|
||||
{ t: 'hl', text: "gate: structure AND content, then replace" }, { t: 'dim', text: "65/65 affected files re-encoded" },
|
||||
],
|
||||
flow: [
|
||||
{ n: '1', label: "decode" },
|
||||
{ n: '2', label: "encode" },
|
||||
{ n: '3', label: "verify" },
|
||||
{ n: '4', label: "content" },
|
||||
{ n: '5', label: "replace" },
|
||||
],
|
||||
};
|
||||
|
||||
// ---------- read frontmatter ----------
|
||||
const postPath = join(ROOT, 'src', 'content', 'posts', `${slug}.md`);
|
||||
let category = 'devops';
|
||||
|
||||
@@ -349,6 +349,12 @@ TERMINALS['putting-a-front-door-on-an-app-you-cant-modify'] = `
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">docker compose up -d (gateway takes the public port)</span><span class="fix">→ front page 200 ✓</span></div>
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">curl -s /index.html | grep -o lang=</span><span class="fix">→ zh-CN ✓</span></div>`;
|
||||
|
||||
TERMINALS['every-player-stuttered-the-file-was-fine'] = `
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">ffmpeg -v error -i out.mp4 -f null - -> 0 errors</span></div>
|
||||
<div class="line"><span class="prompt"> </span><span class="err">106/5819 frames show the WRONG picture</span></div>
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">-c:v av1_cuvid -> -hwaccel cuda -c:v av1</span></div>
|
||||
<div class="line"><span class="prompt"> </span><span class="cmd">0 wrong frames SSIM 1.000000</span><span class="fix">-> fixed</span></div>`;
|
||||
|
||||
// ---------- read frontmatter ----------
|
||||
const postPath = join(ROOT, 'src', 'content', 'posts', `${slug}.md`);
|
||||
if (!existsSync(postPath)) {
|
||||
|
||||
Reference in New Issue
Block a user