路線與視覺無損編碼實戰(zhàn))
上周一個做婚禮跟拍的朋友甩過來一段素材說是自己早前用剪輯軟件導預覽版時被試用版在右下角打了個半透明的標識現(xiàn)在客戶要成片那個印子必須干凈。他先搜了一圈“在線去水印”挨個試了七八個站點結(jié)果五花八門有的下回來片頭多了三秒廣告有的畫面從 1080p 變成了 720p還有一個更絕——標識位置確實干凈了但整段視頻碼率從 12Mbps 掉到 3Mbps暗部全是色塊客戶的黑色西裝直接糊成一團。這件事的癥結(jié)不在“有沒有工具”而在于大部分人把“去水印”當成一個點一下按鈕的動作忽略了它背后其實是三條完全不同的技術(shù)路線而每一條路線對畫質(zhì)、構(gòu)圖、時間成本的要求都不一樣更要命的是凡是把素材傳到別人服務器上處理的方案質(zhì)量和隱私這兩件事你都不再擁有決定權(quán)。這篇就把本地視頻去水印這件事徹底拆開講三條路線各自適合什么畫面、本地處理時濾鏡參數(shù)怎么量怎么填、編碼參數(shù)怎么設才不至于二壓、動態(tài)水印和多水印怎么處理以及那些掛著“免費無水印”招牌的頁面套路通常埋在哪幾個位置。內(nèi)容偏實操新手照著參數(shù)抄能跑通有剪輯基礎的人可以重點看編碼和驗收那兩節(jié)。先說一句邊界問題這不是客套能理直氣壯去水印的只有你自己的素材——自己拍的、自己剪的、自己早前導出時被工具打上的標識或者你明確拿到了授權(quán)的內(nèi)容。別人作品上的署名標識、平臺版權(quán)標識動了就是另一回事了這條線在哪兒做這行的人心里都清楚。1. 把“去水印”拆成三條路線才知道自己能不能做到不壓縮很多人一上來就問“哪個工具最好”這個問題問錯了。正確的問法是我這個水印貼在哪、背景是什么、畫面還能不能挪。答案不同路線就不同最終畫質(zhì)的天花板也完全不同。1.1 路線一直接裁掉代價是構(gòu)圖這是最干脆的做法本質(zhì)是把帶水印的那一條邊整塊切走。命令行里對應的就是裁剪濾鏡參數(shù)邏輯是“保留多寬多高、從哪個坐標開始取”。舉個具體例子素材是 1920×1080標識在右下角占據(jù)大約 180×60 像素位置距離右邊 40 像素、距離底部 60 像素。那你至少要切掉右側(cè) 220 像素保留寬度變成 1700。crop1700:1080:0:0這里有個新手百分之百會踩的坑寬高必須是偶數(shù)。絕大多數(shù)視頻是 YUV420 色度采樣色度平面在水平和垂直方向都是亮度的一半寬或高是奇數(shù)時編碼器要么直接報錯要么自動取整給你切掉一列像素畫面邊緣會出現(xiàn)一條細黑線或者一像素的錯位。所以我一般直接按偶數(shù)取整往上湊寧可多切兩個像素。裁剪真正的代價不是分辨率是構(gòu)圖。切完之后畫面的視覺重心會偏移原本居中的人物會偏到一側(cè)如果片子里還有字幕或者角標切完可能把字幕也帶走了。我自己的判斷標準是切掉的寬度不超過原寬的 12%構(gòu)圖基本還能救超過 15%基本就得重新考慮畫幅或者干脆改方案。這條路線適合什么水印死死貼在畫面邊緣、主體偏另一側(cè)、且成片對畫幅比例要求不嚴的場景。反過來如果水印壓在畫面中間偏內(nèi)的位置裁剪等于把片子廢了。1.2 路線二蓋住本質(zhì)是糊一層但極其穩(wěn)蓋住的思路是不動原始像素在標識位置疊一層模糊、馬賽克或者純色塊。聽起來很土但實際項目里我用得最多原因很簡單——它極其穩(wěn)定不會產(chǎn)生鬼影、不會在動態(tài)背景上抽風、不會因為一幀判斷失誤毀掉整段。實現(xiàn)方式是把畫面復制兩路一路裁剪出目標區(qū)域做模糊處理再疊回原位置。大概是這么個結(jié)構(gòu)split[a][b]; [b]crop200:80:1680:940,boxblur12:3[c]; [a][c]overlay1680:940模糊半徑的選擇有講究。我的經(jīng)驗值是模糊半徑不小于目標區(qū)域短邊的八分之一。上面這個 200×80 的區(qū)域短邊是 80半徑就該在 10 以上取 12 比較穩(wěn)妥。半徑太小標識的輪廓還能隱約透出來半徑太大那一塊會糊成一坨明顯的“補丁”反而更扎眼。蓋住方案最大的問題是“看得見補丁”。要緩解這一點有兩個小技巧一是模糊之后再疊一層極淡的同色系色塊把對比度壓下來二是如果背景是大面積純色比如天空、白墻、純色背景板直接用純色塊蓋比模糊更自然取周圍像素的中位色值填進去就行。1.3 路線三像素重建效果最好也最吃參數(shù)這條路線才是大家心里想的那個“去水印”——根據(jù)標識周圍的像素推斷被蓋住的區(qū)域原本該長什么樣。開源方案里對應的是鄰域插值類濾鏡商業(yè)軟件里叫“內(nèi)容識別填充”原理上都是拿邊緣像素往里推。它的優(yōu)點是視覺上最干凈沒有補丁感缺點是挑背景。背景是平坦的墻面、天空、虛化背景、純色幕布重建效果幾乎看不出痕跡背景是高密度紋理草地、頭發(fā)、樹葉、密集文字重建區(qū)域會糊成一片還會隨著畫面運動產(chǎn)生輕微的“呼吸感”一幀一幀看特別明顯。參數(shù)上有兩個硬約束必須記住區(qū)域不能貼邊坐標至少留 1 到 2 像素區(qū)域加坐標不能超出畫面邊界。另外重建區(qū)域要比實際水印大一圈通常四邊各擴 2 到 4 像素把標識的抗鋸齒邊緣和半透明過渡都包進去否則邊緣會留一圈淡淡的殘影——這是最高頻的翻車點很多人以為參數(shù)填對了其實只是差了兩個像素。1.4 為什么“不壓縮”這件事只能在本地成立三條路線里裁剪改的是畫幅、蓋住和重建改的是像素只要畫面內(nèi)容變了就必須重新編碼。區(qū)別在于本地處理時編碼器用什么參數(shù)是你說了算上傳到別人服務器上編碼器參數(shù)是對方定的而且對方幾乎一定會為了省算力和省存儲把參數(shù)往低里壓。所以“不壓縮”在技術(shù)上從來不是“不編碼”而是“用足夠高的質(zhì)量參數(shù)編碼讓肉眼看不出損失”。這個控制權(quán)在誰手里決定了最終畫質(zhì)。2. “在線處理”和“安全、不壓縮”為什么天然打架每次有人問我“有沒有那種網(wǎng)頁打開就能去水印、還不掉畫質(zhì)的”我都得先潑一盆冷水。不是沒有而是這三個條件同時成立的場景比想象中少得多。2.1 文件上傳的那一刻控制權(quán)已經(jīng)交出去了本地方案里素材從硬盤讀到內(nèi)存處理完寫回硬盤中間不經(jīng)過任何第三方。在線方案里文件要先上傳、在對方服務器上排隊、處理、再下載回來。這個鏈條上有三個你無法驗證的環(huán)節(jié)文件在服務器上存了多久、有沒有被復制、有沒有被打包進訓練數(shù)據(jù)或者樣本庫。我不是說所有在線服務都會亂來而是說你沒有手段去驗證它沒有亂來。對于商業(yè)拍攝素材、帶人臉的訪談、內(nèi)部培訓視頻這個風險是實打?qū)嵉?。我個人的處理原則很簡單能本地就本地實在要在線就只傳那種“泄露了也無所謂”的素材。2.2 平臺幾乎必然會重編碼原因很現(xiàn)實即使對方主觀上不想壓你的片子客觀上也很難做到。第一是算力成本一張顯卡同時處理十個任務和同時處理兩個任務成本差好幾倍平臺方一定會選擇更快的參數(shù)。第二是輸出統(tǒng)一化為了兼容各種瀏覽器和播放器輸出往往被強制轉(zhuǎn)成最常見的編碼格式和像素格式。第三是免費額度免費站點普遍會用“限時長、限分辨率、限碼率”三把刀來控制成本。這三條疊加起來結(jié)果就是你在頁面上看到“保持原畫質(zhì)”四個字下載下來一驗參數(shù)分辨率沒變、碼率腰斬。分辨率不變但碼率腰斬就是典型的“參數(shù)看著對、質(zhì)量已經(jīng)掉了一半”。2.3 三個動作快速判斷一個在線工具會不會壓你的片子不用懂技術(shù)也能做判斷我一般看這三點檢查項危險信號相對可靠的信號是否公開輸出參數(shù)只寫“高清”“原畫質(zhì)”這類模糊詞明確寫出輸出分辨率、碼率范圍、編碼格式免費額度限制限 30 秒、限 720p、限 100MB限制清晰且與畫質(zhì)無關(guān)如每日次數(shù)處理流程上傳后看不到任何進度細節(jié)有明確的任務狀態(tài)、可下載原始處理結(jié)果還有一個特別簡單的土辦法拿一段已知碼率的片子比如 10Mbps、30 秒跑一遍完整流程下載回來后看文件大小。如果原文件 37MB 左右輸出只有 8MB那不用問壓了。文件體積不一定等于畫質(zhì)但體積腰斬到四分之一畫質(zhì)一定掉了。2.4 什么情況下在線方案其實可以接受說句公道話不是所有場景都值得折騰本地工具。如果素材是一段三十秒的、要發(fā)在社交平臺的豎版短視頻最終平臺自己還會再壓一遍那你在中間環(huán)節(jié)死磕無損編碼性價比極低。這種場景下用在線工具圖個快只要能確認對方?jīng)]往輸出里加水印、沒加片頭是可以接受的。反過來的場景——客戶交付母版、需要長期存檔、要投放到大屏或者做二次剪輯的素材——一律本地處理沒得商量。3. 本地處理的完整工作流從量坐標到出片這一節(jié)是實操主干。我按自己的習慣順序排量坐標、判斷動靜、選濾鏡、定編碼參數(shù)、處理音頻和封裝。每一步都有它的理由跳過任何一步后面都會返工。3.1 第一步把水印位置量準別靠眼睛估坐標量不準后面全白搭。我的做法是用播放器把畫面停在信息最豐富的一幀不要停在純色幀看不清邊界截圖然后在任意能顯示像素坐標的圖片工具里打開把光標移到標識左上角記下 x、y再移到右下角記下 xw、yh。這里有兩個取整規(guī)則**坐標向下取偶、寬高向上取偶。**比如量出來 x1679、w181就取 x1678、w182。這樣處理區(qū)域完整包住標識且寬高是偶數(shù)。**四邊各留 2 到 4 像素余量。**視頻經(jīng)過一次壓縮后標識邊緣會有一圈很淡的色暈和抗鋸齒過渡不包進去就會留殘影。舉個完整的換算1920×1080 視頻標識量出來左上角 (1681, 941)右下角 (1858, 1002)。那么 x1680、y940、w18218582-1680 取偶、h6410022-940 取偶。同時要驗證 16801821862 1920、940641004 1080都沒越界參數(shù)可用。3.2 第二步判斷水印是釘死的還是跟著畫面走的這一步?jīng)Q定你要不要用分段表達式。判斷方法很土但有效在片頭、片中、片尾各抽一幀把三張圖疊在一起看標識位置有沒有位移。三個位置完全重合靜態(tài)水印一套參數(shù)從頭跑到尾。有位移但只是整體平移比如畫面做了推拉可以用帶表達式的位置參數(shù)按時間插值。位移無規(guī)律甚至尺寸在變比如縮放動畫老老實實分段處理一段一套參數(shù)。我吃過一次虧一段素材前 20 秒是靜態(tài)的21 秒開始有個緩慢的推鏡標識跟著往左上跑。我圖省事用了統(tǒng)一參數(shù)前 20 秒完美后面 40 秒全廢還得多跑一遍。這種虧吃一次就記住了——抽幀檢查花兩分鐘返工花兩小時。3.3 第三步按水印形態(tài)挑濾鏡別硬剛我把常見形態(tài)和對應方案列個對照遇到新素材直接查表就行水印形態(tài)首選方案關(guān)鍵參數(shù)備注貼邊、不透明、面積小裁剪寬高取偶切幅不超原寬 12%最快最穩(wěn)注意構(gòu)圖貼邊、半透明、背景是純色純色塊覆蓋取鄰域中位色值比模糊更自然畫面內(nèi)部、背景平坦鄰域重建區(qū)域外擴 2-4px不貼邊效果最好畫面內(nèi)部、背景高密度紋理模糊覆蓋半徑 ≥ 區(qū)域短邊 1/8重建會糊別硬剛半透明、帶漸變邊緣重建 輕微模糊疊加先重建再對邊緣做小半徑模糊單用重建會留殘影動態(tài)、位置漂移分段處理每段獨立坐標別想用一套參數(shù)通吃3.4 第四步編碼參數(shù)怎么設才叫“視覺無損”參數(shù)這塊是最容易被糊弄的也是最能體現(xiàn)水平的地方。先明確一點完全無損qp0會讓文件膨脹到原文件的五到十倍除了極少數(shù)存檔場景沒人這么干。實際項目中我們用“視覺無損”也就是肉眼看不出和原片有區(qū)別。我的常用配置和理由-c:v libx264 -crf 17 -preset slow -pix_fmt yuv420p -profile:v high -level 4.1CRF 17這是質(zhì)量恒定模式數(shù)值越低質(zhì)量越高。x264 的經(jīng)驗區(qū)間是 18 到 23 為“看起來一樣”17 到 18 是“仔細對比也基本一樣”。我取 17 是為了留一點余量因為處理后的區(qū)域本身是重建出來的再壓就更容易露餡。preset slow編碼慢一點但同等質(zhì)量下碼率更低。對一段十分鐘的片子slow 和 medium 的差距可能就是兩三分鐘值得等。pix_fmt yuv420p兼容性最好的像素格式。如果原片是 10bit 或者 422轉(zhuǎn)成 420 會損失一點點色度精度但換來的是幾乎所有播放器和平臺都能正常播。存檔場景可以保留原格式。profile 和 level跟著原片走別亂升別亂降。level 設高了老設備播不動設低了編碼器會為了滿足約束而降質(zhì)量。還有一個關(guān)鍵點如果原片碼率本身就低比如 4Mbps 的手機片你用 CRF 17 重編碼出來的文件可能比原文件還大。這種情況別慌文件大不代表畫質(zhì)好但也別為了追求“體積不變”去調(diào)低 CRF——原片已經(jīng)在低碼率下丟過信息了再壓一次等于二次損失暗部色塊會非常明顯。寧可文件大一點。3.5 音頻和封裝兩個最容易被忽略的坑視頻處理完之后十個人里有八個直接默認參數(shù)導出結(jié)果音頻被順手重編碼了一遍。音頻處理的原則只有一條能復制就別重編碼。-c:a copy視頻重編碼一次是不可避免的但音頻完全沒必要。復制流不改變音頻的任何采樣信息也幾乎不花時間。如果原片是 AAC 192kbps你重編碼成 AAC 192kbps音質(zhì)一定下降有損編碼不能無損轉(zhuǎn)碼而且時間白白多花。封裝這塊有兩個細節(jié)加 faststart-movflags faststart會把索引信息挪到文件頭網(wǎng)頁播放時不用等整個文件下載完就能起播。做交付的時候我一般都會加。別亂改時間基有些工具默認會重設 timescale導致音畫同步出現(xiàn)幾十毫秒的偏移。這種偏移單看畫面看不出來但配上對白口型就能察覺。處理長片時尤其要注意跑完先抽三處對白驗證口型。4. 動態(tài)水印、多水印、半透明水印三種難纏情況的處理思路前面講的都是理想情況。真實項目里遇到的素材八成屬于下面這三類。4.1 時間軸分段的正確寫法水印只在某一段出現(xiàn)比如片頭 0 到 8 秒有后面沒有沒必要全片處理。濾鏡支持按時間啟用寫法是給濾鏡掛一個時間條件表達式delogox1680:y940:w182:h64:enablebetween(t,0,8)這段的意思是只在第 0 秒到第 8 秒之間應用這個處理。注意 t 是秒為單位的浮點數(shù)邊界建議多給半秒余量寫成between(t,0,8.5)因為壓縮后的關(guān)鍵幀位置不一定精確落在 8.0 秒卡太死會有一兩幀漏處理。如果是多段出現(xiàn)用邏輯或串起來enablebetween(t,0,8)between(t,42,50)。別寫成or表達式里加法就是邏輯或的意思寫法更短也不容易出錯。分段處理還有個隱性好處處理區(qū)域只在需要的時候才動其余時間畫面是原樣透傳的。雖然整段還是要重編碼但至少不會因為不必要的處理引入額外的重建瑕疵。4.2 多區(qū)域疊加串聯(lián)還是并聯(lián)畫面里有兩個水印比如左上角一個、右下角一個處理方式是把濾鏡串起來-vf delogox40:y30:w160:h60,delogox1680:y940:w182:h64串聯(lián)的好處是寫法簡單壞處是兩個區(qū)域如果挨得近第二個濾鏡會拿第一個處理后的像素當輸入可能出現(xiàn)互相干擾。我的經(jīng)驗是兩個區(qū)域間距小于 20 像素時改用并聯(lián)寫法split 成多路分別處理后疊加間距大的直接串聯(lián)省事。還有一種情況是水印區(qū)域部分重疊比如一個橫條標識和一個角標疊在一起。這種別想著分兩次處理直接把兩個區(qū)域合并成一個大的包絡矩形一次處理完。區(qū)域大一點重建的瑕疵會多一點但比處理兩次、兩次都留殘影要好。4.3 半透明和漸變邊緣為什么單用重建會翻車半透明水印是最難處理的。原因在于它不是“蓋住”了背景而是和背景做了加權(quán)混合顯示出來的像素 α×水印色 (1-α)×背景色。你要還原背景理論上得知道 α 和水印顏色而這兩個值通常是未知的。實際操作中重建濾鏡會按不透明處理把整個區(qū)域當成都被遮住了結(jié)果就是——標識本身沒了但標識邊緣那圈半透明的漸變過渡還留著一層淡淡的痕跡尤其在純色背景上特別明顯比如天空上會留一圈比周圍略亮或略暗的環(huán)。我的處理套路是兩步走先對稍微大一圈的區(qū)域做重建把漸變過渡也包進去再對處理區(qū)域的邊緣做一次小半徑模糊半徑 2 到 3把重建區(qū)域和原始區(qū)域的接縫軟化掉。接縫軟化這一步很多人不做做完之后你會發(fā)現(xiàn)“補丁感”一下子消失了。代價是處理區(qū)域會略微損失一點銳度。這個取舍我覺得值——一圈淡淡的殘影比一點點銳度損失扎眼得多。5. 那些掛“免費無水印”招牌的頁面套路基本埋在這幾處這一段是踩坑記錄。我前后試過二十多個在線站點套路高度雷同列出來供參考。5.1 時長和分辨率的暗門最常見的做法是頁面上大字寫“免費、無水印、高清”小字在底下寫“免費用戶單次限 60 秒、輸出 720p”。等你上傳完、處理到一半才彈出升級提示。防范方法很簡單上傳前先在頁面上找“限制”“額度”“免費版說明”這類字樣找不到就直接關(guān)掉。真免費的工具不需要把限制藏起來。5.2 輸出端偷偷加東西比降分辨率更惡心的是往輸出里加內(nèi)容。常見的有三種加片頭或片尾多出兩三秒的推廣畫面剪輯時得手動切掉還得重新封裝。在角落加自己的標識位置通常和你剛?cè)サ舻哪莻€不一樣一不留神就漏了。改元數(shù)據(jù)往文件信息里寫入推廣字段播放器上不顯示但做二次處理時會被帶出去。驗收方法處理完先完整播一遍開頭和結(jié)尾各五秒再用能查看文件信息的工具翻一遍元數(shù)據(jù)字段。5.3 “下載客戶端”的連環(huán)套有些頁面點“開始處理”之后不干活先讓你裝一個“加速客戶端”。裝完發(fā)現(xiàn)是個下載器再點又要裝另一個組件。這類流程我一般到第二步就退出不值得浪費時間。判斷依據(jù)正規(guī)的網(wǎng)頁工具處理動作是在瀏覽器里發(fā)起請求、在服務端完成的不需要你本地裝任何東西。凡是要求裝客戶端的“在線工具”本質(zhì)上已經(jīng)不是在線工具了。5.4 隱私條款里那幾行字這一條最容易被跳過但影響最大。很多站點在條款里會寫類似“您授予我們?nèi)蚍秶鷥?nèi)、免許可費的權(quán)利用于改進服務”——這句話的實際含義是把你的素材納入了可以分析的范疇。我的做法是涉及人臉的、涉及商業(yè)內(nèi)容的、涉及客戶保密要求的素材一律不看在線方案。這不是技術(shù)問題是責任問題。6. 驗收怎么確認自己真的沒被壓處理完不等于做完驗收這一步?jīng)Q定了你交付的東西到底能不能用。我給自己定了一套固定的檢查流程每次都跑一遍。6.1 三個可量化的檢查點檢查點怎么查合格標準分辨率與幀率看文件信息與原始素材完全一致幀率不能從 29.97 變成 30碼率看文件信息的平均碼率與原始碼率相差不超過 20%處理區(qū)域小時應更接近音頻參數(shù)看音頻流信息采樣率、聲道數(shù)、編碼格式與原始完全一致幀率這一點特別值得說。有些工具會把 29.97 轉(zhuǎn)成 30看起來只差 0.03但一段十分鐘的片子累計下來會差出好幾幀音畫同步會逐漸漂移配樂卡點全部對不上。這種問題在短片里看不出來長片里是災難。6.2 肉眼之外的檢查抽三個關(guān)鍵幀放大看參數(shù)都對也不代表畫質(zhì)沒問題。我的固定動作是抽三幀——片頭、片中、片尾各一幀放大到 200% 看兩個地方暗部黑色衣服、夜景、陰影區(qū)。二次壓縮最先犧牲的就是暗部會出現(xiàn)明顯的色塊和“爬行”噪點。高頻紋理草地、頭發(fā)、織物、密集文字。這些區(qū)域在低碼率下會糊成一片邊緣還會出現(xiàn)振鈴。再加一個動作把處理區(qū)域和周圍區(qū)域放在一起看。如果處理區(qū)域明顯比周圍更平滑、噪點更少說明那塊被重建糊了需要把參數(shù)往回退一點縮小區(qū)域或者換方案。6.3 一套可復用的驗收清單把上面的內(nèi)容整理成一張表每次交付前照著打勾分辨率、幀率、像素格式與原始一致平均碼率下降不超過 20%音頻流為復制參數(shù)與原始完全一致片頭片尾各五秒完整播放無額外內(nèi)容元數(shù)據(jù)字段無異常寫入抽三幀放大檢查暗部與紋理處理區(qū)域與周圍接縫自然無明顯邊界音畫同步抽三處對白驗證口型這張表看著啰嗦但真按這個跑返工率能降一大半。我最初做這類活兒的時候吃過一次大虧片子交出去三天客戶說第三段的對白口型不對。回頭一查幀率被工具從 29.97 轉(zhuǎn)成了 30前面幾分鐘沒問題到第七分鐘開始累積偏移越往后越明顯。重做一遍不說還耽誤了客戶的排期。最后分享一個我一直在用的笨辦法處理之前先把原始素材復制一份到另一個目錄命名加上“_原始”后綴。所有處理都在副本上做輸出另存第三個文件名。這樣萬一參數(shù)填錯了或者處理效果不滿意隨時能從原始文件重來不用滿硬盤找備份。這個習慣幫我省下的時間比我學過的任何一個濾鏡參數(shù)都值錢。