FFmpeg多媒体处理命令行工具详解
myzbx 2025-01-21 20:00 24 浏览
FFmpeg是一款非常快速的视频和音频转换器, 是开源项目 FFmpeg (Fast Forward moving pictures expert group) 的命令行程序。 它可以在任意采样率之间转换,并通过高质量的多相滤波器实时调整视频大小。
FFppeg 载地址:http://ffmpeg.org/download.html
FFmpeg程序的转码流程,如下所示
其中, demuxer 为解复用器, muxer 为复用器; decoder 为解码器, encoder 为编码器
ffmpeg 语法:ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
ffmpeg参数
1)通用选项:
-L license
-h 帮助
-fromats 显示可用的格式,编解码的,协议的。
-f fmt 强迫采用格式fmt
-I filename 输入文件
-y 覆盖输出文件
-t duration 设置记录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
-title string 设置标题
-author string 设置作者
-copyright string 设置版权
-comment string 设置评论
-target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置 ,只需要输入如下的就可以了: ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高质量设置
-itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
2)视频选项:
-b bitrate 设置比特率,缺省200kb/s
-r fps 设置帧频 缺省25
-s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-croptop size 设置顶部切除带大小 像素单位
-cropbottom size –cropleft size –cropright size
-padtop size 设置顶部补齐的大小 像素单位
-padbottom size –padleft size –padright size –padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)
-vn 不做视频记录
-bt tolerance 设置视频码率容忍度kbit/s
-maxrate bitrate设置最大视频码率容忍度
-minrate bitreate 设置最小视频码率容忍度
-bufsize size 设置码率控制缓冲区大小
-vcodec codec 强制使用codec编解码方式。 如果用copy表示原始编解码数据必须被拷贝。
-sameq 使用同样视频质量作为源(VBR)
-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
-passlogfile file 选择两遍的纪录文件名为file
3)音频选项:
-ab bitrate 设置音频码率
-ar freq 设置音频采样率
-ac channels 设置通道 缺省为1
-an 不使能音频纪录
-acodec codec 使用codec编解码
4)音频/视频捕获选项
-vd device 设置视频捕获设备。比如/dev/video0
-vc channel 设置视频捕获通道 DV1394专用
-tvstd standard 设置电视标准 NTSC PAL(SECAM)
-dv1394 设置DV1394捕获
-av device 设置音频设备 比如/dev/dsp
5)高级选项
-map file:stream 设置输入流映射
-debug 打印特定调试信息
-benchmark 为基准测试加入时间
-hex 倾倒每一个输入包
-bitexact 仅使用位精确算法 用于编解码测试
-ps size 设置包大小,以bits为单位
-re 以本地帧频读数据,主要用于模拟捕获设备
-loop 循环输入流。只工作于图像流,用于ffserver测试
1、获取音频/视频文件信息
查看视频文件的元信息,比如编码格式和比特率,可以只使用-i参数。
ffmpeg -i input.mp4
上面命令会输出很多冗余信息,加上-hide_banner参数,可以只显示元信息。
ffmpeg -i input.mp4 -hide_banner
2、转换视频文件到不同的格式
ffmpeg -formats #检查FFmpeg支持格式的列表
ffmpeg -i video.mp4 video.avi #转换mp4文件为avi文件
ffmpeg -i video.flv video.mpeg #转换flv格式视频为mpeg 格式
ffmpeg -i input.webm -qscale 0 output.mp4 #使用-qscale 0参数维持源视频文件的质量,
ffmpeg -i [input.file] -c:v libx264 output.mp4 #转成H.264编码
ffmpeg -i [input.file] -c:v libx265 output.mp4 #转成H.265编码
ffmpeg -i test.mp4 -ab 56 -ar 22050 -qmin 2 -qmax 16 -b 320k -r 15 -s 320x240 outputfile.flv #mp4转flv
ffmpeg -i outputfile.flv -copyts -strict -2 test.mp4 #flv转mp4
3、转换视频文件到音频文件
转换一个视频文件到音频文件,只需具体指明输出格式,像 .mp3或 .ogg,或其它任意音频格式。
ffmpeg -i input.mp4 -vn output.mp3 #转换 input.mp4 视频文件到 output.mp3 音频文件
ffmpeg -i input.mp4 -vn -c:a copy output.aac #-c:a copy表示不改变音频编码,直接拷贝
也可以对输出文件使用各种各样的音频转换编码选项:
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3
相关选项:
-vn – 表明我们已经在输出文件中禁用视频录制。
-ar – 设置输出文件的音频频率。通常使用的值是22050 Hz、44100 Hz、48000 Hz。
-ac – 设置音频通道的数目。
-ab – 表明音频比特率。
-f – 输出文件格式。在我们的实例中,它是 mp3 格式。
4、更改视频文件的分辨率
设置视频文件的分辨率到 1280×720
ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4或
ffmpeg -i input.mp4 -s 1280x720 -c:a copy output.mp4
转换视频文件到 640×480 大小
ffmpeg -i input.mp4 -filter:v scale=640:480 -c:a copy output.mp4或
ffmpeg -i input.mp4 -s 640x480 -c:a copy output.mp4
该技巧帮助缩放视频文件到较小的显示设备上,如平板电脑和手机。
ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4 #转换文件为480p
5、压缩视频文件
ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4
减小视频文件的大小,将损失视频质量。如果24值过大,可以降低 -crf 值到或更低值。
也可以通过下面的选项来转换编码音频降低比特率,使其有立体声感,从而减小大小。
-ac 2 -c:a aac -strict -2 -b:a 128k
6、压缩音频文件
假设input.mp3是比特率320kbps的音频文件,可通过更改比特率到任意较低的值来压缩
$ ffmpeg -i input.mp3 -ab 128 output.mp3 #-ab标志压缩音频文件
各种各样可用的音频比特率列表是: 96kbps、112kbps、128kbps、160kbps、192kbps、256kbps、320kbps
7、调整码率
调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。
ffmpeg -i input.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output.mp4
8、从一个视频文件移除音频流
ffmpeg -i input.mp4 -an output.mp4 #-an表示没有音频录制。
上面的命令会撤销所有音频相关的标志。
9、从一个媒体文件移除视频流
ffmpeg -i input.mp4 -vn output.mp3 #-vn表示没有视频录制
ffmpeg -i input.mp4 -vn -ab 320 output.mp3 #加-ab标志来指出输出文件的比特率
10、从视频中提取图像(截图)
ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png
其中:
-r – 设置帧速度。即每秒提取帧到图像的数字。默认值是 25。
-f – 表示输出格式,在上例中是图像。
image-%2d.png – 表示如何命名提取的图像。上例命名文件像image-01.png、image-02.png、image-03.png开始递加。如果使用 %3d,那么图像的命名像 image-001.png、image-002.png递加。
ffmpeg -y -i input.mp4 -ss 00:01:24 -t 00:00:01 #从指定时间开始,连续对1秒钟的视频进行截图
ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg #-vframes 1指定只截取一帧,-q:v 2表示输出的图片质量,一般是1到5之间(1 为质量最高)
ffeg -i test.mp4 -y -f mjpeg -ss 3 -t 1 test1.jpg #在第三秒的时候截图
ffmpeg -i test.mp4 -y -f image2 -ss 3 -vframes 1 test1.jpg #在第三秒的时候截图
11、视频内裁剪
ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4
其中:
input.mp4 – 源视频文件。
-filter:v – 表示视频过滤器。
crop – 表示裁剪过滤器。
w – 我们想自源视频中裁剪的矩形的宽度。
h – 矩形的高度。
x – 我们想自源视频中裁剪的矩形的 x 坐标 。
y – 矩形的 y 坐标。
比如需要一个来自视频的位置 (200,150),且具有 640 像素宽度和 480 像素高度的视频
ffmpeg -i input.mp4 -filter:v "crop=640:480:200:150" output.mp4
注意,剪切视频将影响质量。除非必要,请勿剪切。
12、转换一个视频的具体的部分
ffmpeg -i input.mp4 -t 10 output.avi #转换文件开头10秒到视频avi格式
上例以秒具体说明时间。也可用hh.mm.ss 格式具体说明时间。
13、设置视频的屏幕高宽比
$ ffmpeg -i input.mp4 -aspect 16:9 output.mp4 #使用-aspect标志设置一个视频文件的屏幕高宽比
常用高宽比有:16:9、4:3、16:10、5:4、2:21:1、2:35:1、2:39:1
14、添加海报图像到音频文件
添加海报图像到文件,以便图像将在播放音频文件时显示,相当于将音频文件转为带封面的视频文件。
ffmpeg -loop 1 -i inputimage.jpg -i inputaudio.mp3 -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
ffmpeg -loop 1 -i cover.jpg -i input.mp3 -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4
-loop 1参数表示图片无限循环,-shortest参数表示音频文件结束,输出视频就结束。
15、使用开始和停止时间剪下一段媒体文件
ffmpeg -i input.mp4 -ss 00:00:50 -codec copy -t 50 output.mp4
ffmpeg -ss 00:00:00 -t 00:00:03 -y -i test.mp4 -vcodec copy -acodec copy test1.mp4 #将test.mp4视频的前3秒,重新生成一个新视频
-ss 开始时间,如: 00:00:00,表示从0秒开始,格式也可以00:00:0
-t 时长,如: 00:00:03,表示截取3秒长的视频,格式也可以00:00:3
-y 如果文件已存在强制替换;
-i 输入,后面是空格,紧跟着就是输入视频文件;
-vcodec copy 和 -acodec copy表示所要使用的视频和音频的编码格式,这里指定为copy表示原样拷贝;
也可剪辑音频
ffmpeg -i audio.mp3 -ss 00:01:54 -to 00:06:53 -c copy output.mp3
16、切分视频文件为多个部分
ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4
其中:
-t 00:00:30 表示从视频的开始到视频的第 30 秒创建一部分视频。
-ss 00:00:30 为视频的下一部分显示开始时间戳。它意味着第2部分将从第30秒开始,并将持续到原始视频文件的结尾。
17、接合或合并多个视频部分到一个单个视频文件
方法一:
创建包含你想接合文件的准确的路径的 join.txt。
所有的文件要求相同的编码格式。所有文件的路径应该逐个列出如下。
file /home/sk/myvideos/part1.mp4
file /home/sk/myvideos/part2.mp4
file /home/sk/myvideos/part3.mp4
file /home/sk/myvideos/part4.mp4
使用命令接合join.txt中列的所有文件:
ffmpeg -f concat -i join.txt -c copy output.mp4
如果出现下面的错误;
[concat @ 0x555fed174cc0] Unsafe file name '/path/to/mp4'
join.txt: Operation not permitted
添加 -safe 0 :
ffmpeg -f concat -safe 0 -i join.txt -c copy output.mp4
上面的命令接合 part1.mp4、part2.mp4、part3.mp4 和 part4.mp4 文件到一个称为output.mp4的单个文件中。
方法二:
ffmpeg -i "concat:1.flv|2.flv|3.flv" -c copy 4.flv
方法三:
ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'" input.mp4; done) -c copy output.mp4
18、添加字幕到一个视频文件
为视频下载正确的字幕,并如下所示添加它到视频文件中。
fmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4
19、 添加音频到一个视频文件(音轨)
添加音轨(muxing):将外部音频加入视频,比如添加背景音乐或旁白。
ffmpeg -i input.aac -i input.mp4 output.mp4
上例中,有音频和视频两个输入文件,ffmpeg 会将它们合成为一个文件。
20、音频合成
ffmpeg -i test.mp3 -i test1.mp3 -filter_complex amix=inputs=2 -f mp3 c.mp3 #合并二个音频
ffmpeg -i test.mp3 -i test1.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 a.mp3 #合并二个音频,以第一个音频的时长为新音频时长
21、预览或测试视频或音频文件
ffplay video.mp4 #预览视频
ffplay audio.mp3 #测试音频
22、增加/减少视频播放速度
增加视频播放速度,运行:
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4 #该命令将双倍视频的速度。
为降低你的视频速度,需要使用一个大于 1 的倍数。
减少播放速度,运行:
fmpeg -i input.mp4 -vf "setpts=4.0*PTS" output.mp4
23、转换容器格式
转换容器格式(transmuxing)指的是,将视频文件从一种容器转到另一种容器。
下面是 mp4 转 webm 的写法
ffmpeg -i input.mp4 -c copy output.webm
24、获取视频时长
ffmpeg -i test.mp4 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
25、视频加水印
ffmpeg -y -i test.mp4 -acodec copy -vf "movie=input.jpg [logo]; [in][logo] overlay=10:10:1 [out]" test2.mp4
overlay=10:10:1,后三个数据表示是距离左边的距离,距离上边的距离,是否透明,1表示透明。上例我用的是jpg,当然不可能透明。
ffmpeg -y -i test.mp4 -acodec copy -vf "movie=input.jpg [logo]; [in][logo] overlay=enable='lte(t,1)' [out]" test2.mp4
overlay=enable='lte(t,1)' ,这个参数表示,水印在前一秒显示。
26、生成GIF图片
ffmpeg -i test.asf -vframes 30 -y -f gif output.gif #把视频的前30帧转换成一个Gif
ffmpeg -i test2.mp4 -y -f image2 -ss 08 -t 0.001 -s 352x240 output.jpg #在秒处接取一个352X240的图片
27、下载RTMP流
ffmpeg -i "rtmp://192.168.10.103:1935/live/111 live=1" -acodec copy -vcodec copy -f flv -y test.flv #将rtmp流,以文件的形势保存到本地
- 上一篇:Elixir实战: 4 数据抽象 (2)处理层次数据
- 下一篇:计算机相关的编码 P
相关推荐
- 零基础入门AI智能体:详细了解什么是变量类型、JSON结构、Markdown格式
-
当品牌跳出固有框架,以跨界联动、场景创新叩击年轻群体的兴趣点,一场关于如何在迭代中保持鲜活的探索正在展开,既藏着破圈的巧思,也映照着与新一代对话的密码。在创建AI智能体时,我们会调用插件或大模型,而在...
- C# 13模式匹配:递归模式与属性模式在真实代码中的性能影响分析
-
C#13对模式匹配的增强让复杂数据处理代码更简洁,但递归模式与属性模式的性能差异一直是开发者关注的焦点。在实际项目中,选择合适的模式不仅影响代码可读性,还可能导致执行效率的显著差异。本文结合真实测试...
- 零基础快速入门 VBA 系列 6 —— 常用对象(工作簿、工作表和区域)
-
上一节,我介绍了VBA内置函数以及如何自动打字和自动保存文件。这一节,我们来了解一下Excel常用对象。Excel常用对象Excel有很多对象,其中最常用也最重要的包括以下3个:1.Workbo...
- 不同生命数字的生肖龙!准到雷普!
-
属龙的人总在自信爆棚和自讨苦吃之间反复横跳?看完这届龙宝宝的日常我悟了。属龙的人好像天生自带矛盾体:领导力超强可人缘时好时坏,工作雷厉风行却总在爱情里翻车。关键年份的龙性格差异更大——76年龙靠谱但不...
- 仓颉编程语言基础-面向对象编程-属性(Properties)
-
属性是仓颉颉中一种强大的机制,它允许你封装对类(或接口interface、结构体struct、枚举enum、扩展extend)内部状态的访问。它看起来像一个普通的成员变量(字段),但在其背后,它通过...
- Python中class对象/属性/方法/继承/多态/魔法方法详解
-
一、基础入门:认识类和对象1.类和对象的概念在Python中,类(class)是一种抽象的概念,用于定义对象的属性和行为,而对象(也称为实例)则是类的具体表现。比如,“汽车”可以是一个类,它有...
- VBA基础入门:搞清楚对象、属性和方法就成功了一半
-
如果你刚接触VBA(VisualBasicforApplications),可能会被“对象”“属性”“方法”这些术语搞得一头雾水。但事实上,这三个概念是VBA编程的基石。只要理解它们之间的关系,...
- P.O类型文推荐|年度编推合集(一百九十五篇)
-
点击左上方关注获取更多精彩推文目录2019年度编推35篇(1V1)《悖论》作者:流苏.txt(1V1)《桂花蒸》作者:大姑娘浪.txt(1V1)《豪门浪女》作者:奚行.txt...
- Python参数传递内存大揭秘:可变对象 vs 不可变对象
-
90%的Python程序员不知道,函数参数传递中可变对象的修改竟会导致意想不到的副作用!一、参数传递的本质:对象引用传递在Python中,所有参数传递都是对象引用的传递。这意味着函数调用时传递的不是对...
- JS 开发者必看!TC39 2025 最新动向,这些新语法要火?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。TC39第...
- 2025 年值得尝试的 5 个被低估的 JavaScript 库
-
这些JavaScript库可能不会在社交媒体或HackerNews上流行起来,但它们会显著提高您的工作效率和代码质量。JavaScript不再只是框架。虽然React、Vue和Sv...
- Python自动化办公应用学习笔记30—函数的参数
-
一、函数的参数1.形参:o定义:在函数定义时,声明在函数名后面括号中的变量。o作用:它们是函数内部的占位符变量,用于接收函数被调用时传入的实际值。o生命周期:在函数被调用时创建,在函数执...
- 16种MBTI人格全解析|测完我沉默了三秒:原来我是这样的人?
-
MBTI性格测试火了这么久,你还不知道自己是哪一型?有人拿它当社交话题,有人拿它分析老板性格,还有人干脆当成择偶参考表。不废话,今天我一次性给你整理全部16种MBTI人格类型!看完你不仅能知道自己是谁...
- JS基础与高级应用: 性能优化
-
在现代Web开发中,性能优化已成为前端工程师必须掌握的核心技能之一。本文从URL输入到页面加载完成的全过程出发,深入分析了HTTP协议的演进、域名解析、代码层面性能优化以及编译与渲染的最佳实践。通过节...
- 爱思创CSP-J/S初赛模拟赛线上开赛!助力冲入2024年CSP-J/S复赛!
-
CSP-J/S组初赛模拟赛爱思创,专注信奥教育19年,2022年CSP-J/S组赛事指定考点,特邀NOIP教练,开启全真实CSP-J/S组线上初赛模拟大赛!一、比赛对象:2024年备考CSP-J/S初...
- 一周热门
- 最近发表
-
- 零基础入门AI智能体:详细了解什么是变量类型、JSON结构、Markdown格式
- C# 13模式匹配:递归模式与属性模式在真实代码中的性能影响分析
- 零基础快速入门 VBA 系列 6 —— 常用对象(工作簿、工作表和区域)
- 不同生命数字的生肖龙!准到雷普!
- 仓颉编程语言基础-面向对象编程-属性(Properties)
- Python中class对象/属性/方法/继承/多态/魔法方法详解
- VBA基础入门:搞清楚对象、属性和方法就成功了一半
- P.O类型文推荐|年度编推合集(一百九十五篇)
- Python参数传递内存大揭秘:可变对象 vs 不可变对象
- JS 开发者必看!TC39 2025 最新动向,这些新语法要火?
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)