# 影片剪輯 線上剪影片

一邊看一邊標出要留的段落，最後拿回一個影片。

> 一邊看一邊把值得留的段落標出來，然後把這些段落存成一個檔案。在瀏覽器裡跑，不上傳，不重新編碼，斷網也能用。

本頁是一個完全在你的瀏覽器裡執行的互動式工具，地址是 https://abox.tools/zh-TW/trim-video/。你交給它的任何內容都不會被上傳。下面是這個頁面用文字對該工具的全部說明；要使用它，請開啟這個地址。

## 你的影片**不會上傳**。這裡根本沒有伺服器。

你的影片由你自己的瀏覽器讀取、標記、剪輯、寫出，用的是你自己的硬體。這裡沒有任何東西能取資料或者發資料，這個工具壓根沒有聯網功能。就算真有，這個頁面的另一頭也沒有伺服器能接住一段影片。

- ✗ 不上傳
- ✗ 不註冊
- ✗ 沒有水印
- ✓ 想標幾段就標幾段
- ✓ 畫質不掉
- ✓ 斷網能用

## 影片怎麼剪

1. **選一段影片。** 把 MP4、MOV、M4V 或者 WebM 拖到下面的方框裡。瀏覽器直接從你的硬碟上讀，這期間沒有東西發出去。一次拖好幾個，它們會按你放進去的順序接起來。
2. **放起來，把要留的段落標出來。** 該開始的地方按 `I`，該結束的地方按 `O`，想標幾次標幾次。每一對就是下面表格裡的一行，也是時間軸上的一條色帶。`U` 撤銷剛才那一次，`Space` 播放和暫停，方向鍵一次跳五秒。那一下不好抓的話，把播放速度放慢。
3. **把標記調準。** 每一行都能單獨回放，也能直接打進一個精確時間來改，還能上下調順序或者刪掉。選中那一段的兩個端點，也可以在時間軸上直接拖。上面那個合計，就是成品影片將有多長。
4. **是留下它們，還是剪掉它們。** 通常是留下：成品就是你標出來的那些段落，按順序接在一起。剪掉是另一件大家想做、卻很少找得到工具的工作，把廣告、冷場、廢鏡頭標出來，剩下的部分會自動接上。
5. **剪完就下載。** 「一個位元組都不動」是把畫面幀原樣搬過去，快，而且不可能掉畫質，代價是每一段從你標記之前那個關鍵幀開始。「就在這裡下刀」會把畫面解碼重寫一遍，每一段都從你選中的那一幀開始。你按按鈕之前，頁面就寫明瞭你將拿到哪一種，以及它的代價。

## 說得更細的版本

[怎麼剪影片而不重新編碼](https://abox.tools/zh-TW/guides/trim-a-video/): 剪一段片子可以一個位元組的畫質都不掉。為什麼下刀的位置有時候比你標的早，關鍵幀跟這有什麼關係，以及什麼時候該認下那次重新編碼。

## 工具箱裡還有

- [影片裁剪](https://abox.tools/zh-TW/crop-video/): 把片子切到只剩要緊的那塊。
- [影片倒放](https://abox.tools/zh-TW/reverse-video/): 最後一幀排在最前，連聲音一起。
- [延時影片](https://abox.tools/zh-TW/timelapse-video/): 一小時的素材，二十秒看完。
- [影片截幀](https://abox.tools/zh-TW/grab-frame/): 任意位置，一張原畫質靜幀。

## 常見問題

### 我的影片會傳到什麼地方去嗎？

不會。讀取、標記、剪輯、寫出，全由你自己的瀏覽器在你自己的硬體上完成。這個工具沒有伺服器那一半，頁面的 `Content-Security-Policy` 把它可能聯的地址全列了出來，沒有一個是本站的。與其聽我們說，不如拔掉網線，照剪一段試試。

### 同一段影片裡能留好幾處嗎？

這正是它的本行。播放時想按幾次 `I` 和 `O` 就按幾次，每一對成為一行，成品就是這些行按順序接起來，別的全沒了。網上多數剪輯工具只給你一對滑塊，問你要留哪一段。掐頭去尾還行，可要是你只想把一小時素材看一遍、留下其中值得的六個瞬間，那就完全不夠用。

### 剪輯會掉畫質嗎？

走常規那條路不會，至少在要緊的意義上不會。剪輯不改變任何一幀的樣子，所以那些幀是原樣搬進新檔案的，位元組一樣，編碼引數一樣，什麼都一樣。這裡唯一會重新編碼的是精確剪輯，而按鈕上就寫著。

### 為什麼有一段開始得比我標的早？

這跟影片的儲存方式有關，而且只在那些忽略了格式中一項標準約定的播放器上才看得出來。多數幀存的是「我跟鄰居有哪些不同」，離開鄰居就解不出來；只有關鍵幀能獨立成立，而關鍵幀一般每隔一到十秒才有一個。所以靠複製幀來剪，就必須把你標記前面那個關鍵幀起的一段一併帶上。檔案裡同時寫明瞭*從你標記的位置開始播*，主流播放器都認這一條。你要是需要在任何播放器上都精確，那就選「就在這裡下刀」，它會重新編碼。匯出之前，頁面會告訴你落在哪種情況，以及差了多少。

### 反過來，能把廣告剪掉嗎？

能。把它們標出來，然後選「剪掉它們」，於是接起來的是你*沒*標的那些部分，順序不變。同一份標記回答的是同一個問題的兩面，所以你可以來回切換，看著時長變化，而不用重標一遍。

### 標記能儲存下來，回頭再接著弄嗎？

能。「儲存標記」寫出一個純文字檔案，一行一段，開始和結束用逗號隔開；「載入標記」把它讀回來。兩種格式可選，純秒數和 `HH:MM:SS.mmm`，都遵循同類工具早就在用的那種排布，所以這裡寫出來的檔案能拿給它們用，它們寫出來的檔案也能拖到這個頁面上。標記是件細緻的事，誰都不該做第二遍。

### 能剪哪些格式？

MP4、M4V 和 MOV 直接讀，裡面裝的是 H.264、HEVC、AV1 還是 VP9 都行。複製幀這件事根本不涉及解碼，所以哪怕你的瀏覽器壓根沒有那個編碼的解碼器，這條路照樣走得通。其他瀏覽器能播的格式，最典型的是 WebM，改成一邊播一邊錄來剪，能用，結果多長就得花多長時間，而且只能留一段。瀏覽器既讀不了也播不了的檔案，實際上就是 AVI、WMV、FLV 和大多數 MKV，會被直接拒收並說明原因，不會做到一半才崩。

### 影片的大小和長度有限制嗎？

工具裡沒設上限，而且走複製那條路時，檔案基本沒被讀過：你要留的那些幀只是被指著，不是被裝進來的，所以從一個四 GB 的錄影裡留四分鐘，花的代價大約就等於把這四分鐘寫到硬碟上。精確剪輯則一次幾 MB 地走過整個檔案。兩條路的真正天花板都是成品，它要在記憶體裡拼好你才能下載。

### 聲音會保住嗎？

兩條 MP4 路徑上，音訊都是逐個取樣複製過去、全程不解碼的，跟原檔案裡的位元組一模一樣，而且每一段的聲音跟畫面對齊到千分之一秒以內。唯一的例外是把幾個聲音描述方式不同的影片接在一起，比如取樣率不一樣，那種情況下不解碼就沒法把它們塞進同一條音軌，頁面會在動手之前說明。走錄製那條路，聲音是從播放裡採下來再編一遍的。兩種情況都有個勾選框，可以乾脆不要聲音。

### 免費嗎？要註冊嗎？

免費，沒有帳號，不用登入，沒有試用期，也沒有水印。本站帶廣告，經費就是這麼來的，廣告拿不到關於你影片的任何資訊。

## 這條隱私承諾怎麼核實

- **你的影片沒地方可去。** Content-Security-Policy 把這個頁面允許聯的地址全列了出來，沒有一個是本站的。這裡沒有能收檔案的介面，程式碼裡也沒有一行會把檔案發出去，就算真有那麼個介面也一樣。
- **這裡沒有任何東西會去聯網取資料。** 這個工具完全沒有聯網功能。沒有網址可以貼，沒有東西要下載，第一次用也不去取什麼引擎。碰過你影片的每一個位元組，都是頁面載入時從本站來的。
- **走常規那條路，連解碼都沒有。** 剪輯不會改變任何一幀的樣子，所以你標出來那些段落的編碼幀，是照原樣搬進新檔案的。每一幀在這期間只是你硬碟上那個檔案的一小段引用，也就是一句「從第幾個位元組到第幾個位元組」，而不是位元組本身。真正把它們讀出來，是你的瀏覽器在寫下載檔案的那一刻。這裡從來沒有哪一步把你的影片還原成畫面。
- **標記檔案是在這個頁面裡產生的。** 儲存標記，就是把螢幕上那些數字寫成一個文字檔案，直接進你的下載目錄。載入標記則在這裡把它讀回來。兩邊都不沾網路，檔案裡除了時間點什麼都沒有。
- **聲音只是搬過去，沒人聽。** 兩條 MP4 路徑上，音訊取樣都是整塊搬過去的，根本不解碼。這裡沒有任何東西會把它們還原成聲音，就算還原了，也沒地方可送。
- **需要解碼的地方，也在這裡解。** 精確剪輯，以及這個瀏覽器放不了的檔案的預覽，走的是你自己機器上的 WebCodecs。那本來就是要放給你看這段影片的同一個解碼器，跑在同一個地方。
- **Google 載入了什麼，又拿不到什麼。** 廣告指令碼和統計指令碼來自 Google。關於你影片的資訊，一條都沒給它們，檔案不給，畫面幀不給，檔名、大小、時長、你在哪裡下的刀，也都不給。讀取、剪輯、寫出的每一行程式碼都從本站發出，也都擺在儲存庫裡。
- **捐助按鈕載入了什麼，又拿不到什麼。** 頁頭那個「Buy me a coffee」按鈕，由 cdnjs.buymeacoffee.com 的指令碼畫出來，字型取自 Google Fonts。它就是個連結，僅此而已，不上報訪問，也拿不到關於你或者你影片的任何東西。
- **斷網照樣能用。** 斷開網路，這個頁面上的一切照常工作。這是最省事的一條證明。

**你可以自己核對。**上面這些不用你信。這個頁面是儲存庫裡的模板和配置產生出來的，構建指令碼你能讀，也能自己跑一遍，跑出來的結果就提交在 `dist` 分支上。拿實際發給你的內容，跟你自己從原始碼構建出來的結果對一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先讀的幾個檔案：`config/site.toml` 裡是 Content-Security-Policy，`src/segments.js` 裡是那些標記和它們存成的檔案，`src/shared/mp4-reader.js` 裡是在 MP4 裡找出幀的那個讀取器，`src/ranges.js` 裡是把一個標記換算成一串取樣的那套算術，`src/copy.js` 裡是把這些取樣搬進新檔案的那個迴圈。這幾個都沒有引入任何能發請求的東西。
