[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.tpcf.cn/news/914648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;如…