FFmpeg 壓縮視頻文件

文章目錄

  • FFmpeg 壓縮視頻文件
    • 基本壓縮命令(保持 MP4 格式)
    • 轉換為其他格式示例:
    • 關鍵參數說明:
    • 額外優化選項:
  • 在FFmpeg中使用多線程加速
    • 1. 幀級多線程 (frame-level multithreading)
    • 2. 切片級多線程 (slice-level multithreading)
    • 3. 編碼器特定多線程選項
      • H.264/H.265 (libx264/libx265)
      • VP9
    • 4. 硬件加速
    • 5. 并行處理多個文件
    • 最佳實踐建議

FFmpeg 壓縮視頻文件

使用 FFmpeg 壓縮視頻文件(包括 MPEG-4/MP4 格式)并輸出為其他格式的基本命令如下:

基本壓縮命令(保持 MP4 格式)

ffmpeg -i input.mp4 -vcodec libx264 -crf 23 -preset medium -acodec aac -b:a 128k output.mp4

轉換為其他格式示例:

  1. 輸出為 MKV 格式
ffmpeg -i input.mp4 -vcodec libx265 -crf 28 -preset fast -acodec libvorbis output.mkv
  1. 輸出為 WebM (VP9) 格式
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webm
  1. 輸出為 MOV 格式
ffmpeg -i input.mp4 -vcodec mpeg4 -q:v 5 -acodec aac output.mov

關鍵參數說明:

  • -crf:質量系數(18-28 是常用范圍,值越大壓縮率越高)
  • -preset:編碼速度/效率平衡(ultrafast/superfast/veryfast/faster/fast/medium/slow/slower/veryslow)
  • 視頻編碼器:
    • libx264:H.264/AVC(兼容性好)
    • libx265:H.265/HEVC(壓縮率高)
    • libvpx-vp9:WebM 專用
  • 音頻編碼器:
    • aac:MP4 常用
    • libopus:WebM 專用
    • libvorbis:MKV 常用

額外優化選項:

  • 縮放視頻:-vf "scale=1280:-1"(設置寬度為1280,高度自動計算)
  • 降低幀率:-r 24(改為24fps)
  • 裁剪視頻:-ss 00:01:30 -t 10(從1分30秒開始,截取10秒)

注意:實際使用時請先確保已安裝 FFmpeg,且支持相關編解碼器(可通過 ffmpeg -codecs 查看)。


在FFmpeg中使用多線程加速

FFmpeg提供了多種方式利用多線程來加速視頻處理,主要包括以下幾種方法:

1. 幀級多線程 (frame-level multithreading)

使用 -threads 參數可以開啟幀級多線程處理:

ffmpeg -threads 4 -i input.mp4 output.mp4

或者分別控制不同組件的線程數:

ffmpeg -threads 4 -i input.mp4 -threads 8 output.mp4

2. 切片級多線程 (slice-level multithreading)

某些編碼器支持切片編碼,可以并行處理:

ffmpeg -i input.mp4 -c:v libx264 -slices 4 output.mp4

3. 編碼器特定多線程選項

不同編碼器有自己特定的多線程選項:

H.264/H.265 (libx264/libx265)

ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 -x264-params threads=8 output.mp4
# 或者
ffmpeg -i input.mp4 -c:v libx265 -x265-params pools=8 output.mp4

VP9

ffmpeg -i input.mp4 -c:v libvpx-vp9 -row-mt 1 -threads 8 output.webm

4. 硬件加速

雖然不是嚴格的多線程,但硬件加速可以顯著提高速度:

# NVIDIA硬件加速
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4

5. 并行處理多個文件

使用GNU parallel等工具并行處理多個文件:

parallel ffmpeg -i {} -c:v libx264 {.}.mp4 ::: *.mov

最佳實踐建議

  1. 線程數通常設置為CPU核心數或略多
  2. 不同階段(I/O、解碼、編碼)可以設置不同線程數
  3. 使用 -threads 0 讓FFmpeg自動選擇最佳線程數
  4. 監控CPU使用率調整線程數以達到最佳效果

注意:過多的線程可能會導致性能下降,因為線程管理開銷會增加。

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

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

相關文章

Ubuntu 系統通過防火墻管控 Docker 容器

Ubuntu 系統通過防火墻管控 Docker 容器指南 一、基礎防火墻配置 # 啟用防火墻 sudo ufw enable# 允許 SSH 連接(防止配置過程中斷聯) sudo ufw allow 22/tcp二、Docker 配置調整 # 編輯 Docker 配置文件 sudo vim /etc/docker/daemon.json配置文件內…

虛擬機新增硬盤,與數據掛載

我有個虛擬機,當時選擇了獨立文件,現在遇到個問題,硬盤不夠了,索性加了一個新硬盤,現在想把數據庫的數據映射到這個新的硬盤處理。 羅列硬盤 lsblk我得是sdb是新硬盤 2. 分區 sudo fdisk /dev/sdb交互操作&#xff…

go語言學習 第10章:面向對象編程

第10章:面向對象編程 面向對象編程(OOP)是一種編程范式,它使用“對象”來表示數據和方法,并通過類來定義對象的結構和行為。Go語言雖然不是傳統的面向對象語言,但它通過結構體(struct&#xff…

android計算器代碼

本次作業要求實現一個計算器應用的基礎框架。以下是布局文件的核心代碼&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"andr…

Go 語言接口詳解

Go 語言接口詳解 核心概念 接口定義 在 Go 語言中&#xff0c;接口是一種抽象類型&#xff0c;它定義了一組方法的集合&#xff1a; // 定義接口 type Shape interface {Area() float64Perimeter() float64 } 接口實現 Go 接口的實現是隱式的&#xff1a; // 矩形結構體…

我們來學mysql -- 8.4版本記錄慢查詢

記錄慢查詢 開啟慢查詢的配置查看慢查詢狀態動態開啟慢查詢日志永久開啟配置log_throttle_queries_not_using_indexes 記錄慢查詢對性能的影響實際案例說明第一條記錄第二條記錄第三條記錄第四條記錄 開啟慢查詢的配置 查看慢查詢狀態 - 執行 show variables like slow_quer…

2025 年中國大學生程序設計競賽全國邀請賽(鄭州)暨第七屆CCPC河南省大學生程序設計競賽(補題)

文章目錄 前言F、幻形之路G、直徑與最大獨立集H&#xff0c;樹論函數M&#xff0c; 川陀航空學院總結 前言 本次比賽&#xff0c;只能說太多沒接觸的知識了&#xff0c;還有太容易被題面嚇住。 F、幻形之路 題目鏈接&#xff1a;幻形之路 解題思路&#xff1a; 對于這一題只…

如何使用k8s安裝redis呢

在Kubernetes (k8s) 上安裝Redis 在Kubernetes上安裝Redis有幾種方法&#xff0c;下面我將介紹兩種常見的方式&#xff1a;使用StatefulSet直接部署和使用Helm chart部署。 一、安裝redis 1.1 拉去ARM鏡像&#xff08;7.4.2&#xff09; docker pull registry.cn-hangzhou.ali…

SpringBoot的5種日志輸出規范策略

在企業級應用開發中&#xff0c;合理規范的日志記錄是系統穩定運行、問題排查和性能優化的關鍵保障。 SpringBoot作為流行的Java開發框架&#xff0c;提供了強大而靈活的日志支持&#xff0c;但如何建立統一、高效的日志輸出規范卻是許多團隊面臨的挑戰。 本文將介紹SpringBo…

Python Cookbook-7.11 在 PostgreSQL 中儲存 BLOB

任務 需要將 BLOB 存入一個 PostgreSQL 數據庫。 解決方案 PostgreSQL7.2 以及更新的版本支持大對象,而psycopg 模塊提供了二進制轉義函數: import psycopg,cPickle #連接到數據庫,用你的本機來測試數據庫,并獲得游標 connection = psycopg.connect("dbname = test…

Android端口轉發

如上圖所示&#xff0c;有一個Android設備&#xff0c;Android設備里面有主板&#xff0c;主板上有網絡接口和Wi-Fi&#xff0c;網絡接口通過網線連接了一個網絡攝像頭&#xff0c;這就跟電腦一樣&#xff0c;電腦即可以通過網線接入一個網絡&#xff0c;也可以同時用Wi-Fi接入…

Unity基礎-協程

Unity基礎-協程 四、協程 概述 協程&#xff08;Coroutine&#xff09;&#xff0c;本質上并不是多線程&#xff0c;而是在當前線程中將代碼分時執行&#xff0c;不卡主線程。可以理解為&#xff0c;協程會把可能使主線程卡頓的程序分時分布進行。 協程通常用來&#xff1a;…

UniApp組件封裝,2025年最新HarmonyOS鴻蒙模塊化開發項目式教程

一、環境配置與前置條件 ?開發工具要求? HBuilderX 4.64&#xff08;鴻蒙插件已預裝&#xff09;DevEco Studio 5.0.3.400&#xff08;真機調試必備&#xff09;鴻蒙離線SDK&#xff08;通過HBuilderX導入&#xff0c;每個項目獨立配置&#xff09; ?項目初始化 # 創建Vu…

C++ 精簡知識點

目錄 一、核心語法 1.指針VS引用 2. 類與對象&#xff08;必寫代碼&#xff09; 3. 繼承與多態&#xff08;必寫代碼&#xff09; 4. 模板&#xff08;必寫代碼&#xff09; 5.智能指針 6. 異常處理&#xff08;必寫結構&#xff09; 二、簡答題速記 三、考試應急策略 一…

7.Vue的compute計算屬性

3.8. 【computed】 作用&#xff1a;根據已有數據計算出新數據&#xff08;和Vue2中的computed作用一致&#xff09;。 <template><div class"person">姓&#xff1a;<input type"text" v-model"firstName"> <br>名&am…

在VSCode中借助AI豐富C++Qt應用程序

隨著國內外各類自動化編程助手的普及&#xff0c;作為傳統桌面C開發者&#xff0c;也要及時地用上這樣強大的工具。考慮到網速問題&#xff0c;國外的服務時斷時續&#xff0c;還是傾向于使用一些國產的大語言模型助手。我們今天就來看看在VSCode下使用大語言模型輔助Qt開發。 …

Java八股文——JVM「內存模型篇」

JVM的內存模型介紹一下 面試官您好&#xff0c;您問的“JVM內存模型”&#xff0c;這是一個非常核心的問題。在Java技術體系中&#xff0c;這個術語通常可能指代兩個不同的概念&#xff1a;一個是JVM的運行時數據區&#xff0c;另一個是Java內存模型&#xff08;JMM&#xff0…

RabbitMQ 高可用與可靠性保障實現

RabbitMQ 高可用與可靠性保障實現詳解 一、高可用架構設計1.1 集群部署模式1.2 鏡像隊列&#xff08;Mirrored Queue&#xff09; 二、可靠性保障機制2.1 消息持久化2.2 確認機制&#xff08;Confirm & Ack&#xff09;2.3 死信隊列&#xff08;DLX&#xff09; 三、容災與…

12.7Swing控件6 JList

在 Java Swing 中&#xff0c;列表框&#xff08;JList&#xff09;是用于顯示一組選項的組件&#xff0c;用戶可以從中選擇一個或多個項目。以下是關于 Swing 列表框的詳細介紹&#xff1a; 1. 基本概念與用途 作用&#xff1a;以垂直列表形式展示選項&#xff0c;支持單選或…

C++: condition_variable: wait_for -> unlock_wait_for_lock?

作為C++的初學者,面臨的一個很大的問題,就是很多的概念并不是可以通過名稱直觀的預知它要完成的細節,比如這里的condition_variable的wait_for。C++的設計意圖好像是,我告訴你這樣用,你只要這樣做就行,又簡單還實用!而且需要記住的規則量又大的驚人。最后看起來,更像是…