我在命令行下剪辑视频

news2024/12/23 10:23:44

是的,你不需要格式工厂,你也不需要会声会影,更不需要爱剪辑这些莫名其妙的流氓软件,命令行下视频处理,包括剪辑,转码,提取,合成,缩放,字幕,特效等等,全部命令行搞定,这不是疯狂,而是效率:

MP4 转换 GIF

很多社区可以发 MP4,但对桌面录屏这种十多二十秒的小短片远远没有 GIF 来的便捷,GIF 在很多软件里支持的也比 MP4 要广泛,转换命令为:

ffmpeg -i in.mp4 -an -c:v gif out.gif

参数 -i 的指明输入文件 “in.mp4” ,-an 代表禁用音频,-c:v 的意思是指定视频编码为 gif,最后是输出文件名。

那么效率在哪里呢? 别急,我们写完善点,做个脚本:video_convert_to_gif.cmd

@echo off
if "%1" == "" goto HELP

set "IN=%1"
set "OUT=%~dpn1.gif"

if "%2" == "" goto NEXT
set "OUT=%2"
:NEXT

call ffmpeg -i "%IN%" -an -c:v gif "%OUT%"
pause
goto END

:HELP
echo usage: video_convert_to_gif ^<input^> [^<output^>]
:END
echo.

将上面的脚本完善一下,保存成名为 video_convert_to_gif.cmd 的脚本:

每次要使用的时候,直接把任何格式的视频文件拖到这个脚本上面去,同级目录下就有了一个 gif 文件了,比你格式工厂修改一半天点点点来的高效多了。

转换为 MP4

最简单写法:

ffmpeg -i in.wmv -c:v libx264 -c:a aac out.mp4

前面输入可以是任意格式的视频文件,用 -c:v 指定视频编码器是 libx264,用 c:a 指定音频编码器是 aac,然后输出 mp4,考虑到某些安卓机可能无法正确播放,完善下:

ffmpeg -i in.wmv -c:v libx264 -c:a aac -pix_fmt yuv420p -vf ^
          "scale=trunc(iw/2)*2:trunc(ih/2)*2" out.mp4

在 Windows 的 Bat 文件里,^ 符号代表换行继续,这里针对部分安卓机只能播放 yuv420 的像素格式的问题,做了一些处理,并且把长宽设置为偶数,否则无法使用 yuv420 格式,完善一下,写成脚本:

@echo off
if "%1" == "" goto HELP

set "IN=%1"
set "OUT=%~dpn1.mp4"

if "%2" == "" goto NEXT
set "OUT=%2"
:NEXT

call ffmpeg -i "%IN%" -c:v libx264 -c:a aac ^
	-pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" ^
   	"%OUT%"
pause
goto END

:HELP
echo usage: video_convert_to_mp4 ^<input^> [^<output^>]
:END
echo.

保存成 video_convert_to_mp4.cmd 用法和上面相同,也是鼠标拖上去就行了。

转换 H.265

和转换 264 类似:

ffmpeg -i in.mp4 -c:v libx265 -c:a aac ^
	-pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" ^
	out.x265.mp4

脚本文件可以照葫芦画瓢,头两行最后用了 ^ 符号,代表命令在下一行继续。

GIF 转换 MP4

上面有了 MP4 到 GIF,反过来的话,需要做一些处理,添加一段空白音频,不然有些软件或者网站可能出问题:

ffmpeg -f lavfi -i anullsrc -i in.gif -c:v libx264 -c:a aac -shortest ^
       -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" out.mp4

这里用了 anullsrc 代表空的音频输入,同时加了一个 -shortest 代表多个输入取时间最短的那个,一样照葫芦画瓢做一个脚本文件封装一下即可。

MP4 分离音频

将 MP4 的音频分离出来,保存成 mp3 也是比较常见的用法:

@echo off
if "%1" == "" goto HELP

set "IN=%1"
set "OUT=%~dpn1.mp3"

if "%2" == "" goto NEXT
set "OUT=%2"
:NEXT

call ffmpeg -i "%IN%" -vn -c:a mp3 -ar 48000 -ac 2 "%OUT%"

pause

goto END
:HELP
echo usage: video_extract_audio ^<input^> [^<output^>]
:END
echo.

保存成 video_extract_audio.cmd 把文件拖上去即可转换。

这里 -vn 的意思是禁用视频,-c:a 指定编码为 mp3,-ar 的意思是指定音频采样率为 48000,同时 -ac 的意思是声道数量。

视频裁剪

直接上脚本:

@echo off
if "%3" == "" goto HELP
set "IN=%1"
set "OUT=%~dpn1_clip%~x1"

if "%4" == "" goto NEXT
set "OUT=%4"
:NEXT

call ffmpeg -i "%IN%" -ss "%2" -to "%3" -c:a copy -c:v copy "%OUT%"
pause
goto END

:HELP
echo usage: video_clip ^<input^> ^<from ^(00:00:00.000^)^> ^<to ^(00:10:00.000^)^> [^<output^>]
:END
echo.

指定输入文件,然后从几分几秒到积分几秒即可:

video_clip in.mp4  00:00:00  00:00:10 out.mp4

即可剪辑头 10 秒钟的视频保存成 out.mp4

视频合并

将两段视频合并成一段:

@echo off
if "%2" == "" goto HELP

set "IN1=%1"
set "IN2=%2"
set "OUT=%~dpn1_%~dpn2_merged.%~x1"

if "%3" == "" goto NEXT
set "OUT=%3"
:NEXT

call ffmpeg -i "%IN1%" -i "%IN2%" ^
	-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" ^
   	-map "[outv]" -map "[outa]" "%OUT%"
pause

goto END
:HELP
echo usage: video_concat ^<input1^> ^<input2^> [^<output^>]
:END
echo.
区域裁剪

将视频里的一个矩形截取出来,保存成一个新的视频:

@echo off
if "%5" == "" goto HELP

set "IN=%1"
set "OUT=%~dpn1_crop%~x1"

if "%6" == "" goto NEXT
set "OUT=%6"
:NEXT

call ffmpeg -i "%IN%" -filter:v "crop=%4:%5:%2:%3" "%OUT%"
pause

goto END
:HELP
echo usage: video_crop ^<input^> ^<x^> ^<y^> ^<w^> ^<h^> [^<output^>]
:END
echo.

这样输入源视频和矩形区域坐标和长宽即可裁剪。

更多用法

欢迎使用 ffmpeg 命令速查表:

  • FFMPEG 命令速查表

附赠:我自己写好的一堆脚本

地址:

  • github.com/skywind3000/vim

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

攻防世界5

cgpwn2 发现是32位文件 打开main函数发现hello双击进入 这里我们发现栈溢出了&#xff0c;双击name 我们发现了bss 发现这题的system有点问题&#xff0c;后门需要我们自己输入&#xff0c;刚好有bss我们直接用它 知道system的地址 exp: from pwn import * context(oslinux,a…

vue项目中如何在路由变化时增加一个进度条

在 Vue.js 项目中&#xff0c;使用路由&#xff08;如 Vue Router&#xff09;时&#xff0c;为了提升用户体验&#xff0c;你可能会想要在路由变化时显示一个进度条。这可以通过多种方式实现&#xff0c;其中一种流行的做法是使用第三方库&#xff0c;如 vue-loading-bar 或 n…

红米K70至尊版修复“nv损坏”主板电阻图示 mtk芯片工程固件刷写与步骤说明

💝💝💝红米K70至尊版 机型代码:rothko,搭载天玑9300+旗舰芯片.后置5000万像素索尼IMX906高动态OIS主摄,800万像素超广角镜头,200万像素微距镜头,前置2000万像素摄像头,也适用于以下型号的小米机型:2407FPN8EG, 2407FPN8ER, XIG06, A402XM, 2407FRK8EC。 💝💝…

qt QSlider详解

1、概述 QSlider是Qt框架中的一个控件&#xff0c;它允许用户通过拖动滑块来选择一个范围内的值。这个控件在用户界面中非常常见&#xff0c;通常用于调整音量、亮度、进度等需要连续数值输入的场景。QSlider提供了水平和垂直两种方向&#xff0c;可以根据需要选择合适的方向。…

D54【python 接口自动化学习】- python基础之模块与标准库

day54 第三方模块的使用 学习日期&#xff1a;20241031 学习目标&#xff1a;模块与标准库 -- 69 第三方模块的使用&#xff1a;如何使用其他人编写的代码&#xff1f; 学习笔记&#xff1a; 第三方模块的安装 虚拟环境 加速第三方模块的安装 总结 第三方模块使用pip命令进…

Python毕业设计选题:基于Django+Vue的图书馆管理系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 图书馆界面 图书信息界面 个人中心界面 后台登录界面 管理员功能界面 用户…

李跳跳 2.4 | 最新蓝色版,附加3000条规则

李跳跳是一款非常好用的可以跳过广告的神器&#xff0c;今天软件已经更新到了2.4最新的蓝色版本&#xff0c;支持更多的规则&#xff0c;能够为你全面地去除广告。李跳跳是一款十分实用的去除广告工具软件&#xff0c;软件的开屏广告都可以在这里一键去除&#xff0c;而且软件是…

做反向代购,采购订单应该怎么批量管理?

在反向代购这片充满商机的蓝海中&#xff0c;代购企业们正驾驶着各自的航船&#xff0c;奋力驶向成功的彼岸。然而&#xff0c;当订单如繁星点点般密布在夜空中时&#xff0c;如何高效地管理这些采购订单&#xff0c;便成为了决定船只是否能平稳前行的关键。 想象一下&#xff…

【分布式技术】分布式事务深入理解

文章目录 概述产生原因关键点 分布式事务解决方案3PC3PC的三个阶段&#xff1a;3PC相比于2PC的改进&#xff1a;3PC的缺点&#xff1a; TCCTCC事务的三个阶段&#xff1a;TCC事务的设计原则&#xff1a;TCC事务的适用场景&#xff1a;TCC事务的优缺点&#xff1a;如何解决TCC模…

字符串逆序(c语言)

错误代码 #include<stdio.h>//字符串逆序 void reverse(char arr[], int n) {int j 0;//采用中间值法//访问数组中第一个元素和最后一个元素//交换他们的值&#xff0c;从而完成了字符串逆序//所以这个需要临时变量for (j 0; j < n / 2; j){char temp arr[j];arr[…

四足机器人实战篇之二十三:四足机器人支撑腿反作用力规划之VMC解耦控制方法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、分解式VMC 的实现原理1.虚拟力的定义2.虚拟力分配方法3.在每个需要控制的自由度上构造恰当的虚拟构件以产生合适的虚拟力(1)计算虚拟力的方法…

【VS中Git同步提交 报错:访问.vs/FileContentIndex/xxx.vsidx权限不允许】

参考&#xff1a; Git commit vsidx file access denied in Visual Studio 一劳永逸的方法&#xff1a; 在VSCode里&#xff0c;Git->设置->选项&#xff1a;编辑.gitignore文件&#xff0c;如下图&#xff1a; 忽略整个.vs文件夹&#xff0c;再重新提交就不会有涉及…

[java][高级]FilterListenerAjax

Filter&Listener&Ajax 目标&#xff1a; 能够使用 Filter 完成登陆状态校验功能 能够使用 axios 发送 ajax 请求 熟悉 json 格式&#xff0c;并能使用 Fastjson 完成 java 对象和 json 串的相互转换 1&#xff0c;Filter 1.1 Filter概述 Filter 表示过滤器&#…

计算机网络——网络拥塞

让网络尽可能不拥塞 哪些指标标示网络可能发生拥塞呢&#xff08;靠端系统的判断&#xff09; 1.超时 2.收到三个冗余的ACK确认 网络拥塞的特点 如果网络拥塞不加控制的话&#xff0c;会让网络加速变快 ER字段 &#xff1a;表示交换设备能够提供多少的带宽——存储的是源端…

MiniWord

1.nuget 下载配置 2.引用 3. var value = new Dictionary<string, object>() { ["nianfen"] = nianfen, ["yuefen"] = yuefen, ["yuefenjian1"] = (int.Par…

Android启动流程_SystemServer阶段

前言 上一篇文档我们描述了在 Android 启动流程中 Zygote 部分的内容&#xff0c;从 Zygote 的配置、启动、初始化等内容展开&#xff0c;描述了 Zygote 在 Android 启动中的功能逻辑。本篇文档将会继续 Android 启动流程的描述&#xff0c;从 SystemServer 进程的内容展开&am…

启动任务节点时,传入机械臂参数

MoveIt2_tutorial-Examples-Planning Scene ROS API 先启动move_group节点&#xff0c;后启动任务节点 方式1&#xff1a; 直接传入参数文件的地址 from launch import LaunchDescription # 导入启动描述&#xff0c;用于描述启动文件的结构 from launch_ros.actions impor…

HarmonyOS NEXT星河版笔记--ArkTS篇(1)

一、概念 ArkTS&#xff1a;是一门用于开发鸿蒙应用的编程语言 console.log(我说,HelloWorld) 二、认识数据 2.1.基础数据类型 string字符串描述信息number数字计算boolean布尔判断&#xff08;真、假&#xff09; 2.2.存储数据 存储数据包括变量和常量。 2.2.1.变量&a…

【数据结构】ArrayList的模拟实现--Java

目录 一、&#x1f369;简单了解ArrayList 二、&#x1f369;ArrayList的简单模拟实现 1.&#x1f354;IList接口 1.&#x1f355;IList接口 2. &#x1f355; MyArrayList 重写接口方法 2.&#x1f354;ArrayList方法 1.&#x1f96a;增 1.add&#xff08;添加元素&…

数据结构+算法

一、数据结构 1、线性结构 数组&#xff1a; 访问&#xff1a;O(1)访问特定位置的元素&#xff1b;插入&#xff1a;O(n)最坏的情况发生在插入发生在数组的首部并需要移动所有元素时&#xff1b;删除&#xff1a;O(n)最坏的情况发生在删除数组的开头发生并需要移动第一元素后…