FFMPEG將H264轉HEVC時,碼率縮小多少好,以及如何通過SSIM(Structural Similarity Index結構相似性指數)衡量轉碼損失

最近整理一些視頻,我發現太多了,就想把一些本來就需要轉碼的視頻縮小一下。因為轉碼的時候為了彌補損失,我將碼率增大了 10-20%,但是如果將 H264 轉 HEVC(當然也可以是其他格式),那么或許不用增大碼率甚至可以減少碼率。

但是碼率縮小多少好呢?

HEVC 的體積一般是 H264 的 50-80%,但是這個跨度也不小。

肉眼觀察太難評了,而且每次都這樣很麻煩,我就找了一些技術評判方法,來找到合理的縮小值。

FFMPEG 支持 SSIM(Structural Similarity Index,結構相似性指數),可以評估兩個視頻之間的差別。我們就使用這個指標。

在轉碼的時候,我們首先要考慮原視頻的碼率。因為碼率極大的情況下,碼率哪怕只有原來的 5%,效果也不會下降太多。而在低碼率的情況下,下降 50% 就會帶來很大的影響。

其次我們需要考慮我們能接受的損失程度是多少。要做到這點,需要通過實驗,建立 SSIM 和人肉眼看到的情況之間的關系。

SSIM 測試

這里需要說明一下,SSIM 只是一個參考,它只是從某種角度上表示轉碼前后的損失度,重點還是我們肉眼看到的情況。

首先這個測試分兩類:第一次我用 Blackmagic Camera 這個 App 拍攝 220Mbps 碼率的 4K H264 視頻,文件大小 80MB;第二次我截取一個 5700Kbps 1080P 流媒體電影片段,文件大小 100 MB,分別代表兩種可能的情況。

本節轉碼時,編碼均使用顯卡加速。

對比測試命令如下:

ffmpeg -i 第一個文件路徑 -i 第二個文件路徑 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]ssim" -f null -

這里我使用的是-lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]ssim",而不是網上常見的-filter_complex ssim,是因為我的兩個視頻如果用這個會識別錯誤。你可以根據你自己的情況修改一下。

你會看到一個類似編碼的過程,然后看到最終的結果:

SSIM Y:0.986175 (18.593297) U:0.995715 (23.680221) V:0.995205 (23.192565) All:0.989270 (19.693974)

它分別顯示了 YUV 和總共的 SSIM。

可以看到在高碼率的情況下,視頻壓到 10% 碼率的時候曲線才出現了波動,當然在肉眼觀察的時候也發現此處開始,畫質有明顯的下降,比如沒有那么銳利了(由于素材不咋地,就不放截圖了)。

請添加圖片描述

我們把圖表縱軸上下限修改一下,可以更精確的看到變化情況:

請添加圖片描述

當在常見的流媒體碼率下,只要壓到 50% 左右,SSIM 就開始有較大損失,雖然肉眼可以發現畫質損失了,但是不明顯,依舊屬于能看。但是當壓到 10% 的時候,那就很無語了。

注意下圖的上下限和上圖不一樣。

請添加圖片描述

下面第一張是原文件,第二張是 45% 碼率的,第三張是 10% 碼率的。可以看到第三張的畫質損失嚴重:

請添加圖片描述
請添加圖片描述
請添加圖片描述

根據數據可以發現,如果碼率相比 100% 碼率的情況下, SSIM 差距達到 0.01,那么畫質會有肉眼可見的損失。如果達到 0.05 -0.1,那么會有很嚴重的畫質損失。

SSIM 僅供參考

這里再次強調一下,SSIM 只是一個參考,它只是從某種角度上表示轉碼前后的損失度,重點還是我們肉眼看到的情況。不要本末倒置。

比如在一些特殊情況下,兩個完全不同的視頻的 SSIM 可能能達到 0.9 的級別。只不過我們在測試原視頻和轉碼文件的時候這個指標可以當做參考。

同碼率下轉碼一定有損失

首先這種換編碼的轉化一定有損失,那怕不降低碼率甚至提高 20% 的碼率也會有損失,上面的測試中你也可以看到 100% 的時候 SSIM 也不為 1(5700K 測試 為 0.992643,而 220m 的結果為 0.896002)。如果你使用--lossless可以保證無損,但是碼率會高很多,不劃算。

關于無損轉碼的詳細說明可以看 x265 - readthedocs。

選擇 75% 碼率

根據上面的測試,我們可以看到 50% 左右一定會損失畫質,只是不明顯罷了,但是 50% 到 100% 這區間,可以看到變化不大,我們可以取中間值。

此外,在 Blackmagic Camera App 中, H264 的編碼為 220Mbps,而 HEVC 的編碼為 160Mbps,約為73%。

所以選擇 75% 碼率是一個比較合理的選項。

在完整轉碼一個約 680 MB 的文件視頻后,得到 SSIM 為 0.989270,肉眼可見沒啥區別。證明這個比例是比較合適的,節約了四分之一的體積,雖然小文件沒什么區別,但是 1TB 變成 0.75 TB,還是差距巨大的

H264 轉 HEVC

在使用 FFMPEG 將 H264 轉為 HEVC,請使用以下命令:

ffmpeg -c:v h264_cuvid -i 輸入文件路徑 -c:v hevc_nvenc -b:v 碼率 -tag:v hvc1 輸出文件路徑

解釋一下:

  • -c:v libx265:表示使用 libx265 軟件編碼器。
  • -b:v 碼率:這里設置碼率,需要注意如果是大碼率,比如上面的 220Mbps 這種級別,不要使用220m,而是應該使用220000k,因為前者可能會導致轉碼后的碼率非常低,比如我在測試過程中發現,使用220m轉碼后只有7562 kb/s,這差距太大了。
  • -tag:v hvc1:這部分是為了支持 Apple 的 HEVC,不然你轉碼完的視頻會發現無法使用 Mac 等蘋果設備的播放器播放。

如果你需要使用 Nvidia 硬件加速,那么使用以下命令:

ffmpeg -c:v h264_cuvid -i 輸入文件路徑 -c:v hevc_nvenc -b:v 碼率 -tag:v hvc1 輸出文件路徑

解釋一下:

  • -c:v h264_cuvid表示使用硬件解碼器。如果你的格式出現問題,那么不要用這個,使用軟件解碼兼容性更高,而且速度沒啥區別,就是 CPU 利用率高。
  • -c:v hevc_nvenc:表示使用 NVENC 的 HEVC 硬件編碼器。

希望能幫到有需要的人~

參考資料/擴展閱讀

Structural similarity index measure - Wikipedia:SSIM 的維基百科,里面解釋了 SSIM 是如何計算的。

H.265/HEVC Video Encoding Guide - FFMPEG:FFMPEG 官方關于 HEVC 的編碼指南。如果你需要使用 HEVC 編碼,那么建議看看這個指南。

11.237 ssim - FFmpeg Filters Documentation:FFMPEG 關于 SSIM 的文檔。

此外感謝豆包幫我把輸出轉換成表格,方便我制圖。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92929.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端,route路由

路由定義與導航動態路由匹配&#xff1a;參數傳遞&#xff08;/user/:id&#xff09;嵌套路由配置與 <router-view> 層級渲染編程式導航&#xff1a;router.push、router.replace 和 router.go路由守衛與權限控制全局守衛&#xff1a;beforeEach、beforeResolve、afterEa…

Kubernetes網絡原理深度解析

Kubernetes網絡原理深度解析 1 Kubernetes網絡模型 Kubernetes 網絡模型是其實現容器化應用高效通信的基礎框架。它致力于解決容器編排環境中復雜的網絡連通性、服務發現與負載均衡等問題&#xff0c;追求讓容器、Pod 等網絡端點像傳統主機網絡一樣簡潔、可預測地通信 。其核心…

Python3.10 + Firecrawl 下載 Markdown 文檔:構建高效通用文章爬蟲

在信息爆炸的時代&#xff0c;從各種網站收集和整理文章內容已成為許多開發者和研究人員的常見需求。無論是為了內容聚合、數據分析還是知識管理&#xff0c;一個高效、穩定的通用文章爬蟲都是不可或缺的工具。 本文將詳細介紹如何使用 Python 3.10 結合 Firecrawl API 構建一個…

國產3D大型裝配設計新突破②:裝配約束智能推斷 | 中望3D 2026

本文為CAD芯智庫整理&#xff0c;未經允許請勿復制、轉載&#xff01;→ www.xwzsoft.com/h-nd-605.html中望3D2026亮點速遞之【裝配篇】已經介紹了設計效率的提升&#xff0c;今天將分享的是中望3D2026【裝配約束智能推斷】&#xff0c;也預告一下第三篇是講解【組件復用效率提…

深入淺出設計模式——行為型模式之觀察者模式 Observer

文章目錄1.觀察者模式簡介2.觀察者模式結構3.觀察者模式代碼實例3.0.公共頭文件3.1.觀察者3.1.1.抽象觀察者Observer3.1.2.具體觀察者Player3.2.目標類3.2.1.抽象目標AllyCenter3.2.2.具體目標AllyCenterController循環包含錯誤示例“前向聲明什么時候不夠、必須 #include 對方…

CA證書、SSL加速器、HTTPS、HTTP和域名之間的關系

理解CA證書、SSL加速器、HTTPS、HTTP和域名之間的關系對于構建安全、高效的網站至關重要。它們共同構成了現代安全網絡通信的基礎。下面是它們各自的概念以及它們之間的關系&#xff1a;域名 概念&#xff1a; 人類可讀的網站地址&#xff08;如 www.example.com&#xff09;。…

3D感知多模態(圖像、雷達感知)

一.BEVFusion1.簡要介紹BEV是一個俯視空間&#xff0c;Fusion做的就是融合&#xff0c;這里指的就是圖像和點云的融合。那如何把圖像和點云融合在一起&#xff1f;認為融合方法有三種&#xff1a;a.point level fusion:點集的融合&#xff0c;從點云中采樣一些點,再根據相機的內…

STM32 HAL庫驅動W25QXX Flash

STM32 HAL庫驅動W25QXX Flash 1. 概述 W25QXX系列是一種SPI接口的Flash存儲器&#xff0c;廣泛應用于嵌入式系統中作為數據存儲設備。本文檔詳細介紹了基于STM32 HAL庫的W25QXX Flash驅動實現&#xff0c;包括硬件連接、驅動函數實現以及使用示例。 項目源碼倉庫&#xff1a…

Vivado自定義IP核學習筆記

文章目錄【1】創建一個新的IP核【2】實現功能【3】編輯IP核【4】IP封裝【5】創建Vivado工程【1】創建一個新的IP核 1.1 打開Vivado->點擊【Tasks->Manage IP->New IP Location】->彈出窗口1.2 【Next】->設置IP屬性->【Finish】->【OK】 【IP Location】…

【面試】高級開發面試場景題

1、如何保證MySql到ES的數據一致性? 答:ES是一個開元分布式搜索和分析引擎、它提供了全文搜索、結構化搜索分析以及這些組合的能力。 全文搜索能力:ES支持復雜的搜索能力,包括模糊匹配、短語查詢、布爾查詢等,并且可以快速的返回結果 實時數據分析:實時數據分析,支持對…

《 慢 SQL 分析與 SQL 優化實戰指南》

&#x1f50d; 慢 SQL 分析與 SQL 優化實戰指南、 &#x1f9e0;前言 在數據庫性能調優中&#xff0c;慢 SQL 是性能瓶頸的常見元兇。 一次慢查詢可能會拖垮整個業務線程池&#xff0c;甚至引發鎖等待、雪崩效應。 對后端開發與 DBA 而言&#xff0c;快速定位并優化慢 SQL&am…

C#中如何運用JWT用戶認證

一、JWT概述JSON Web Token&#xff08;JWT&#xff09;是一種輕量級的身份認證機制&#xff0c;廣泛應用于分布式系統中的用戶認證。它通過緊湊的JSON格式存儲用戶身份信息&#xff0c;并使用數字簽名確保信息的完整性和真實性。與傳統的基于Session的認證相比&#xff0c;JWT…

Hibernate 使用詳解

在現代的Java開發中&#xff0c;數據持久化是一個至關重要的環節。而在眾多持久化框架中&#xff0c;Hibernate以其強大的功能和靈活性&#xff0c;成為了開發者們的首選工具。本文將詳細介紹Hibernate的原理、實現過程以及其使用方法&#xff0c;希望能為廣大開發者提供一些有…

【圖像算法 - 13】基于 YOLO12 與 OpenCV 的實時目標點擊跟蹤系統(系統介紹 + 源碼詳細)

基于 YOLO12 與 OpenCV 的實時點擊目標跟蹤系統 在計算機視覺領域&#xff0c;目標檢測與跟蹤是兩個核心任務。本文將介紹一個結合 YOLO 目標檢測模型與 OpenCV 跟蹤算法的實時目標跟蹤系統&#xff0c;該系統允許用戶通過鼠標交互選擇特定目標進行持續跟蹤&#xff0c;支持多…

【數據庫】 MySQL 表的操作詳解

在 MySQL 數據庫的日常開發與維護中&#xff0c;表的操作是最基礎且最常用的部分。本文將從 創建表、查看表結構、修改表 以及 刪除表 等方面進行詳細講解&#xff0c;并附上對應的 SQL 語句示例&#xff0c;方便在實際項目中直接應用。一、創建表 1.1 創建表語法 CREATE TABLE…

DiT: Transformer上的擴散模型

論文&#xff08;ICCV 2023&#xff09;&#xff1a;Scalable Diffusion Models with Transformers 代碼和工程網頁&#xff1a;https://www.wpeebles.com/DiT.html DiTs&#xff08;Diffusion Transformers&#xff09;是首個基于Transformer架構的擴散模型&#xff01;它在…

MySQL 索引:索引為什么使用 B+樹?(詳解B樹、B+樹)

文章目錄一、二叉查找樹(BST)&#xff1a;不平衡二、平衡二叉樹(AVL)&#xff1a;旋轉耗時三、紅黑樹&#xff1a;樹太高由一個例子總結索引的特點基于哈希表實現的哈希索引高效的查找方式&#xff1a;二分查找基于二分查找思想的二叉查找樹升級版的BST樹&#xff1a;AVL 樹四、…

ESP32入門開發·VScode空白項目搭建·點亮一顆LED燈

目錄 1. 環境搭建 2. 創建項目 3. 調試相關介紹 4. 代碼編寫 4.1 包含頭文件 4.2 引腳配置 4.3 設置輸出電平 4.4 延時函數 4.5 調試 1. 環境搭建 默認已經搭建好環境&#xff0c;如果未搭建好可參考&#xff1a; ESP32入門開發Windows平臺下開發環境的搭建…

ONLYOFFICE AI 智能體上線!與編輯器、新的 AI 提供商等進行智能交互

ONLYOFFICE AI 插件?迎來重要更新&#xff0c;帶來了新功能和更智能的交互體驗。隨著 AI 智能體&#xff08;現為測試版&#xff09;的上線、帶來更多 AI 提供商支持以及其他新功能&#xff0c;AI 插件已經成為功能強大的文檔智能助理。 關于 ONLYOFFICE ONLYOFFICE 文檔是多…

【C++進階學習】第十一彈——C++11(上)——右值引用和移動語義

前言&#xff1a; 前面我們已經將C的重點語法講的大差不差了&#xff0c;但是在C11版本之后&#xff0c;又出來了很多新的語法&#xff0c;其中有一些作用還是非常大的&#xff0c;今天我們就先來學習其中一個很重要的點——右值引用以及它所擴展的移動定義 目錄 一、左值引用和…