文章目錄
- 一、工具安裝
- 二、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 "$@"