Files
cursor-demo/02-eksport-i-ffmpeg.html

482 lines
13 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<title>02-eksport-i-ffmpeg.md</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<style>
/* https://github.com/microsoft/vscode/blob/master/extensions/markdown-language-features/media/markdown.css */
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif);
font-size: var(--vscode-markdown-font-size, 14px);
padding: 0 26px;
line-height: var(--vscode-markdown-line-height, 22px);
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-light.showEditorSelection .code-line .code-line:hover:before {
border-left: none;
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-dark.showEditorSelection .code-line .code-line:hover:before {
border-left: none;
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
.vscode-high-contrast.showEditorSelection .code-line .code-line:hover:before {
border-left: none;
}
img {
max-width: 100%;
max-height: 100%;
}
a {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left-width: 5px;
border-left-style: solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 1em;
line-height: 1.357em;
}
body.wordWrap pre {
white-space: pre-wrap;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
pre code {
color: var(--vscode-editor-foreground);
tab-size: 4;
}
/** Theming */
.vscode-light pre {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif, "Meiryo";
padding: 0 12px;
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
code {
font-size: 14px;
line-height: 19px;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> or <div class="page"></div> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
<script src="https://unpkg.com/mermaid/dist/mermaid.min.js"></script>
</head>
<body>
<script>
mermaid.initialize({
startOnLoad: true,
theme: document.body.classList.contains('vscode-dark') || document.body.classList.contains('vscode-high-contrast')
? 'dark'
: 'default'
});
</script>
<h1 id="блок-2-экспорт-и-картинки-для-веба">Блок 2. Экспорт и картинки для веба</h1>
<p>md — исходник. Людям часто нужен PDF, HTML, слайды. Картинки на сайте лучше лёгкие.</p>
<img src="img/ffmpeg-webp.png" alt="PNG проходит пресс и становится WebP" width="720" />
<h2 id="из-markdown-в-другие-форматы">Из Markdown в другие форматы</h2>
<p>В Cursor те же расширения, что в VS Code: <code>Ctrl+Shift+X</code>.</p>
<h3 id="markdown-pdf">Markdown PDF</h3>
<p>Расширение: <strong>Markdown PDF</strong> (<code>yzane.markdown-pdf</code>).</p>
<p>Умеет из открытого <code>.md</code>:</p>
<ul>
<li>PDF</li>
<li>HTML</li>
<li>PNG (снимок)</li>
<li>иногда Markdown (пересобрать)</li>
</ul>
<p>Как пользоваться: правый клик по файлу или по превью → <code>Markdown PDF: Export (pdf)</code> / <code>Export (html)</code>.</p>
<p>Настройки, которые стоит глянуть один раз:</p>
<ul>
<li>формат страницы (A4)</li>
<li>поля</li>
<li>ломать ли код на границе страницы</li>
<li>включён ли math (формулы)</li>
<li>тема / CSS — если хочется «не как из Word 2003»</li>
</ul>
<p>Для доклада PDF — ок. Для сайта лучше HTML (или статический генератор, это уже другой разговор).</p>
<h3 id="mermaid">Mermaid</h3>
<p>Расширение: <strong>Markdown Preview Mermaid Support</strong> (<code>bierner.markdown-mermaid</code>) — чтобы схемы из блока 1 рисовались в превью.</p>
<p>Без него <code>```mermaid</code> так и останется серой простынёй.</p>
<p>Markdown PDF часто подхватывает mermaid, <strong>если</strong> превью его уже рисует. Экспортировал — открой PDF и проверь схемы. Нет схемы — сначала mermaid-плагин, потом снова Export.</p>
<p>Есть ещё <strong>Mermaid Editor</strong> / предпросмотр отдельных <code>.mmd</code> — не обязательно, если всё живёт внутри md.</p>
<h3 id="что-ещё-бывает">Что ещё бывает</h3>
<table>
<thead>
<tr>
<th>Плагин / штука</th>
<th>Зачем</th>
</tr>
</thead>
<tbody>
<tr>
<td>Markdown PDF</td>
<td>быстрый pdf/html из файла</td>
</tr>
<tr>
<td>Markdown Preview Mermaid Support</td>
<td>схемы в превью</td>
</tr>
<tr>
<td>Markdown All in One</td>
<td>оглавление, шорткаты</td>
</tr>
<tr>
<td>Pandoc (уже не плагин, а комбайн)</td>
<td>md → docx/tex/html, если припрёт Word</td>
</tr>
</tbody>
</table>
<p>Для сегодняшнего круга хватает <strong>Markdown PDF + Mermaid</strong>.</p>
<hr>
<h2 id="ffmpeg--картинки-для-вёрстки">ffmpeg — картинки для вёрстки</h2>
<p>ffmpeg — комбайн для видео/аудио/картинок из терминала. Режет ролики, меняет кодеки, клеит. Одна программа вместо зоопарка конвертеров.</p>
<p>Разбор «что это вообще такое» лучше смотреть тут (очень советую):</p>
<p><strong><a href="https://youtu.be/Ww8MzcBJUd4?si=WxVvv4p86D0WcHQN">FFmpeg — крутое видео</a></strong></p>
<p>Нам из всего комбайна — узкий кусок: <strong>для сайта</strong>. Тяжёлые PNG/JPG в HTML — страница тупит. Делаем <strong>WebP</strong>: меньше вес, в браузерах давно ок.</p>
<p>Идея: ширина под макет (например 800px), качество ~80, папка отдельно от исходников.</p>
<p>Из <code>команды ffmpeg.txt</code>:</p>
<pre class="hljs"><code><div>ffmpeg -i input.jpg -vf <span class="hljs-string">&quot;scale=800:-1&quot;</span> -c:v libwebp -quality 80 output.webp
</div></code></pre>
<p>С картинкой из этой папки:</p>
<pre class="hljs"><code><div>ffmpeg -i img/cover.png -vf <span class="hljs-string">&quot;scale=800:-1&quot;</span> -c:v libwebp -quality 80 img_web/cover.webp
</div></code></pre>
<p>Что значат куски:</p>
<table>
<thead>
<tr>
<th>Кусок</th>
<th>Смысл</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>-i ...</code></td>
<td>вход</td>
</tr>
<tr>
<td><code>-vf &quot;scale=800:-1&quot;</code></td>
<td>ширина 800, высота сама (пропорции)</td>
</tr>
<tr>
<td><code>-c:v libwebp</code></td>
<td>кодек WebP</td>
</tr>
<tr>
<td><code>-quality 80</code></td>
<td>качество, 80 — нормальный компромисс</td>
</tr>
</tbody>
</table>
<p>Папку <code>img_web</code> создай заранее.</p>
<p>Ещё пара рабочих:</p>
<p>Другая ширина под узкую колонку:</p>
<pre class="hljs"><code><div>ffmpeg -i img/cover.png -vf <span class="hljs-string">&quot;scale=480:-1&quot;</span> -c:v libwebp -quality 75 img_web/cover-480.webp
</div></code></pre>
<p>JPG → WebP без смены размера:</p>
<pre class="hljs"><code><div>ffmpeg -i input.jpg -c:v libwebp -quality 80 output.webp
</div></code></pre>
<p>В HTML потом:</p>
<pre class="hljs"><code><div><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;img_web/cover.webp&quot;</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">&quot;обложка&quot;</span> <span class="hljs-attr">width</span>=<span class="hljs-string">&quot;800&quot;</span>&gt;</span>
</div></code></pre>
<p>Исходники в <code>img/</code> не трогаем — это «негатив». На страницу отдаём WebP.</p>
<p>ffmpeg в PATH: в терминале <code>ffmpeg -version</code>. Нет команды — поставь сборку под Windows и переоткрой терминал.</p>
<p>Дальше: кто напишет md за нас, если лень — <a href="03-ii.md">блок 3</a>.</p>
</body>
</html>