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