[TOOL] ubuntu 使用 ffmpeg 操作 gif、mp4

文章目錄

  • 一、工具安裝
  • 二、gif 轉mp4
  • 三、mp4 兩倍速

一、工具安裝

安裝 ffmpeg 工具:

sudo apt install ffmpeg

二、gif 轉mp4

1. 配置環境
核心指令:

ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output_2x.mp4

編輯 gif2map4 文件,內容如下:


#!/bin/bash# 檢查是否輸入參數
if [ $# -eq 0 ]; thenecho "Usage: $0 <input.gif> [output.mp4]"echo "Example:"echo "  $0 mygif.gif              # 輸出: mygif_YYYYMMDD_HHMMSS.mp4"echo "  $0 mygif.gif custom_video   # 輸出: custom_video.mp4"exit 1
fi# 輸入文件
INPUT_FILE="$1"
if [ ! -f "$INPUT_FILE" ]; thenecho "Error: Input file '$INPUT_FILE' not found!"exit 1
fi# 輸出文件名
if [ $# -ge 2 ]; then# 如果指定了第二個參數,直接使用OUTPUT_FILE="$2"# 確保輸出文件有.mp4擴展名if [[ "$OUTPUT_FILE" != *.mp4 ]]; thenOUTPUT_FILE="${OUTPUT_FILE}.mp4"fi
else# 否則自動生成帶時間的文件名TIMESTAMP=$(date +"%Y%m%d_%H%M%S")INPUT_BASENAME=$(basename "$INPUT_FILE" .gif)OUTPUT_FILE="${INPUT_BASENAME}_${TIMESTAMP}.mp4"
fi# 運行轉換命令
ffmpeg -i "$INPUT_FILE" -vf "fps=15,scale=640:-2:flags=lanczos" -c:v libx264 -preset slow -crf 23 -pix_fmt yuv420p "$OUTPUT_FILE"# 檢查是否成功生成文件
if [ -f "$OUTPUT_FILE" ]; thenecho "Success! Output file:"echo "  - $OUTPUT_FILE"
elseecho "Error: Failed to generate output file!"exit 1
fi

添加到終端指令

sudo cp gif2map4 /bin/

2. 命令使用

# 默認輸出文件名
gif2map4 input.gif# 指定輸出文件名
gif2map4 input.gif output_20250711.mp4

三、mp4 兩倍速

1. 配置環境
與步驟二類似

# 從第30秒開始,截取10秒的視頻(保持原速度)
ffmpeg -i input.mp4 -ss 00:00:30 -t 10 -c:v copy -c:a copy output_cut.mp4# 參數說明:
# -ss 開始時間(格式:HH:MM:SS或秒數)
# -t 持續時間
# -c:v copy 視頻流直接復制(無損)
# -c:a copy 音頻流直接復制# 視頻加速2倍(音頻同步加速)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output_2x.mp4
# setpts=0.5*PTS 視頻速度2倍(值越小越快)
# atempo=2.0 音頻速度2倍(范圍0.5-2.0,超過需嵌套處理)# 同時裁剪和加速
ffmpeg -i input.mp4 -ss 00:01:00 -t 20 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output_final.mp4
#!/bin/bash# 腳本名稱:mp4_2x_smart
# 功能:智能2倍速轉換MP4視頻(自動檢測處理音頻流)
# 版本:1.1
# 作者:您的名字
# 日期:$(date +"%Y-%m-%d")# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color# 檢查必需工具
check_dependencies() {local missing=0if ! command -v ffmpeg &> /dev/null; thenecho -e "${RED}錯誤:未找到ffmpeg${NC}"missing=1fiif ! command -v ffprobe &> /dev/null; thenecho -e "${RED}錯誤:未找到ffprobe${NC}"missing=1fi[ $missing -eq 1 ] && exit 1
}# 顯示幫助信息
show_help() {echo -e "${GREEN}使用方法:${NC}"echo "  $0 <輸入文件> [輸出文件]"echo -e "${GREEN}示例:${NC}"echo "  $0 input.mp4                  # 輸出: input_2x_YYYYMMDD_HHMMSS.mp4"echo "  $0 input.mp4 output_fast.mp4  # 指定輸出文件名"echo -e "${YELLOW}注意:${NC}"echo "  - 輸出文件將自動添加.mp4后綴(如未指定)"echo "  - 腳本會自動檢測并處理音頻流(如有)"
}# 主函數
main() {# 檢查依賴check_dependencies# 參數檢查if [ $# -eq 0 ]; thenshow_helpexit 1fi# 輸入文件local INPUT_FILE="$1"if [ ! -f "$INPUT_FILE" ]; thenecho -e "${RED}錯誤:輸入文件 '$INPUT_FILE' 不存在!${NC}"exit 1fi# 輸出文件名處理local OUTPUT_FILEif [ $# -ge 2 ]; thenOUTPUT_FILE="$2"# 確保有.mp4后綴if [[ "$OUTPUT_FILE" != *.mp4 ]]; thenOUTPUT_FILE="${OUTPUT_FILE}.mp4"fielselocal TIMESTAMP=$(date +"%Y%m%d_%H%M%S")local INPUT_BASENAME=$(basename "$INPUT_FILE" .mp4)OUTPUT_FILE="${INPUT_BASENAME}_2x_${TIMESTAMP}.mp4"fi# 檢查輸出文件是否已存在if [ -f "$OUTPUT_FILE" ]; thenecho -e "${YELLOW}警告:輸出文件 '$OUTPUT_FILE' 已存在,將被覆蓋!${NC}"read -p "是否繼續?(y/n) " -n 1 -rechoif [[ ! $REPLY =~ ^[Yy]$ ]]; thenexit 0fifi# 檢測音頻流echo -e "${GREEN}正在分析輸入文件...${NC}"local HAS_AUDIO=$(ffprobe -i "$INPUT_FILE" -show_streams -select_streams a -loglevel error 2>&1 | grep -c "Stream #")# 執行轉換echo -e "${GREEN}開始轉換...${NC}"if [ "$HAS_AUDIO" -ge 1 ]; thenecho -e "${YELLOW}檢測到音頻流 - 將同時處理音視頻${NC}"ffmpeg -i "$INPUT_FILE" \-filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" \-map "[v]" -map "[a]" \-c:v libx264 -preset fast -crf 20 \-c:a aac -b:a 128k \-movflags +faststart \-y \"$OUTPUT_FILE"elseecho -e "${YELLOW}未檢測到音頻流 - 僅處理視頻${NC}"ffmpeg -i "$INPUT_FILE" \-vf "setpts=0.5*PTS" \-an \-c:v libx264 -preset fast -crf 20 \-movflags +faststart \-y \"$OUTPUT_FILE"fi# 驗證輸出if [ -f "$OUTPUT_FILE" ]; thenlocal ORIG_DURATION=$(ffprobe -i "$INPUT_FILE" -show_entries format=duration -v quiet -of csv="p=0")local NEW_DURATION=$(ffprobe -i "$OUTPUT_FILE" -show_entries format=duration -v quiet -of csv="p=0")local SPEED_FACTOR=$(awk "BEGIN {print $ORIG_DURATION/$NEW_DURATION}")echo -e "${GREEN}\n轉換成功完成!${NC}"echo "================================="echo -e "輸入文件: ${YELLOW}$INPUT_FILE${NC}"echo -e "輸出文件: ${YELLOW}$OUTPUT_FILE${NC}"echo "---------------------------------"printf "原始時長: %.2f 秒\n" "$ORIG_DURATION"printf "新時長:   %.2f 秒\n" "$NEW_DURATION"printf "加速倍數: %.2f 倍\n" "$SPEED_FACTOR"echo "================================="elseecho -e "${RED}錯誤:未能創建輸出文件!${NC}"exit 1fi
}# 執行主函數
main "$@"

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

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

相關文章

linux中INIT_MM_CONTEXT宏對pgd的重復賦值

在GNU C中&#xff0c;支持通過標號元素對指定結構體成員名進行初始化&#xff0c;這允許初始化值以任意順序出現。在linux內核中對init_mm初始化時有如下代碼。#define INIT_MM_CONTEXT(name) \.pgd init_pg_dir,struct mm_struct init_mm {.mm_rb RB_ROOT,.pgd swapper…

第十五章 STL(stack、queue、list、set、map容器使用)

棧stack使用&#xff1a;隊列queue雙向循環鏈表listlist構造函數list 賦值和交換list 大小操作list 插入和刪除list 數據存取list 反轉和排序排序算法sort降序操作排序案例#include<iostream> using namespace std; #include<list>class Person { private:string n…

【論文閱讀】HCCF:Hypergraph Contrastive Collaborative Filtering

論文出處&#xff1a;SIGIR 2022 CCF-A 論文地址&#xff1a;Hypergraph Contrastive Collaborative Filtering 論文代碼&#xff1a;akaxlh/HCCF: HCCF, SIGIR 2022 目錄 摘要 介紹 研究背景與核心問題 現有方法局限性 HCCF的創新解決方案 技術優勢 定義與相關工作 …

Retrofit+RxJava:打造聲明式REST客戶端的藝術 —— 像點咖啡一樣調用API

目錄一、告別Callback地獄&#xff1a;聲明式編程的魅力1.1 傳統網絡請求的痛點1.2 Retrofit的聲明式革命二、Retrofit核心配置工廠2.1 構建Retrofit實例2.2 常用注解速查表三、RxJava響應式魔法3.1 鏈式調用優雅變身3.2 超能力操作符盤點四、實戰演練&#xff1a;構建天氣查詢…

【離線數倉項目】——任務調度與數據可視化實戰

摘要 本文主要圍繞離線數倉項目中的任務調度與數據可視化實戰展開&#xff0c;介紹了業務流程虛擬節點、離線數倉任務調度、數據可視化等方面的內容&#xff0c;涉及DataWorks和QuickBI等工具的使用&#xff0c;并提供了相關的博文參考和項目實戰域信息。 1. 任務調度管理實戰…

【視頻格式轉換】.264格式轉為mp4格式

背景 視頻格式轉換是多媒體處理中的常見需求&#xff0c;尤其在視頻編輯、存儲或跨平臺播放時。H.264&#xff08;即AVC&#xff09;是一種廣泛使用的視頻編碼標準&#xff0c;以其高壓縮率和良好兼容性著稱&#xff0c;但通常以容器格式&#xff08;如.264裸流文件&#xff0…

JAVA學習筆記 使用notepad++開發JAVA-003

目錄 1 前言 2 部署notepad的java開發環境 2.1 下載并安裝notepad 2.2 設置新建文件的語言 2.3 安裝NppExec插件 2.4 編寫JAVA腳本 2.5 設置腳本執行快捷鍵 2.6 效果測試 3 小結 1 前言 JAVA可以使用記事本來編寫代碼&#xff0c;但是這種方式效率十分低下。我們可以使…

Vue Router 完全指南:從入門到實戰,高效管理前端路由

前言在現代化的前端開發中&#xff0c;路由管理是構建單頁應用&#xff08;SPA&#xff09;的核心功能之一。Vue.js 作為主流的前端框架之一&#xff0c;提供了強大的官方路由庫Vue Router&#xff0c;幫助開發者高效管理頁面跳轉、動態加載、權限控制等關鍵需求。無論是構建企…

Sentinel熱點參數限流完整示例實現

Sentinel熱點參數限流完整示例實現 1. 添加Maven依賴 (pom.xml) <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.2.7.RELEASE</version> </depend…

正則表達式深度解析:從LeetCode 3136題說起

正則表達式深度解析&#xff1a;從LeetCode 3136題說起 引言 正則表達式&#xff08;Regular Expression&#xff0c;簡稱RegEx&#xff09;是一種強大的字符串匹配工具&#xff0c;在字符串處理、數據驗證、文本搜索等場景中有著廣泛的應用。本文將以LeetCode 3136題"有效…

映美打印機-URL頁面打印

<?php /** 打印 - 映美云 https://open.jolimark.com/doc/ */ namespace Home\Controller; use Admin\Logic\OrderLogic;class PrintController extends BaseController {private $appid "";private $appkey "";//打印機編號private $deviceIds &qu…

機器學習算法 ——XGBoost 的介紹和使用

前言&#xff1a; 最近在工作中遇到一個結構化數據回歸預測的問題&#xff0c;用到了很多回歸算法&#xff08;如多元線性回歸等&#xff09;都沒有很好的效果&#xff0c;于是使用了XGBoost&#xff0c;自己也沖三個特征參數人為的增加來幾個&#xff0c;訓練出來的效果還是很…

Linux操作系統之信號:保存與處理信號

目錄 前言&#xff1a; 前文回顧與補充&#xff1a; 信號的保存 PCB里的信號保存 sigset_t 信號集操作函數 信號的處理 信號捕捉的流程&#xff1a;?編輯 操作系統的運行原理 硬件中斷 時鐘中斷 死循環 軟中斷 總結&#xff1a; 前言&#xff1a; 在上一篇文…

Spring Boot 設置滾動日志logback

Spring Boot 的 logback 框架 Spring Boot 默認內置了 Logback 作為日志實現框架&#xff0c;只需要在resources文件夾下添加一個logback-spring.xml&#xff0c;springboot會按照你的設置自動開啟logback日志功能。 配置 logback-spring.xml 實現每天產生一個日志文件&#xf…

如何定義一個只能在堆上或棧上生成對象的類

在C中&#xff0c;可以通過特定的技術手段來控制對象只能在堆(heap)或棧(stack)上創建。只能在堆上創建對象的類要實現這一點&#xff0c;我們需要阻止用戶直接實例化對象&#xff0c;而只能通過new操作符創建。class HeapOnly { public:static HeapOnly* create() {return new…

1.1 前端-vue3項目的創建

構建工具先搭好vue3框架 vue2的vue-cli腳手架基于webpack構建工具創建vue的框架. 而在vue3&#xff0c;可以通過vite構建工具創建vue3項目&#xff0c;性能更優。 兩者創建方式的區別&#xff1a;cmd命令基于的構建工具vue2/vue3vue create 項目名稱&#xff08;或 vue ui圖形化…

PHP password_get_info() 函數

password_get_info() 函數用于返回指定散列&#xff08;hash&#xff09;的相關信息。 PHP 版本要求: PHP 5 > 5.5.0, PHP 7 語法 array password_get_info ( string $hash ) 參數說明&#xff1a; $hash: 一個由 password_hash() 創建的散列值。 返回值 返回三個元素…

mac上的app如何自動分類

使用文件夾進行手動分類在Finder中創建文件夾&#xff0c;將同類應用拖入同一文件夾。右鍵點擊Dock上的應用圖標&#xff0c;選擇「選項」→「在Finder中顯示」&#xff0c;可快速定位應用安裝位置。利用Launchpad自動分組打開Launchpad&#xff08;觸控板四指捏合或按F4鍵&…

LLM面試題目 3

LLM面試題目 3 什么是自注意力機制(Self-Attention)?為什么它在LLM中很重要?如何評估LLM的性能?LLM面臨的挑戰有哪些?Transformer和RNN的區別是什么?LLM如何處理多輪對話? 題目講解 什么是自注意力機制(Self-Attention)?為什么它在LLM中很重要? 自注意力機制是一種…

linux上的軟掛載操作方法

針對linux上的軟掛載 可以查看linux已經掛載和存儲的磁盤分區 df -hfdisk 命令是檢索相同信息的另一種方法&#xff0c;可以看到所有的磁盤分區 sudo fdisk -l 要將磁盤分區 /dev/sda1 掛載到 /home/visionx/EXD1 目錄 步驟 1&#xff1a;準備工作 1.創建掛載目錄&#xff08;如…