FFmpeg常用实例详解

FFmpeg 是一个专业的多媒体框架,能够解码、编码、转码、复用、解复用、流式传输、过滤和播放几乎所有格式的媒体文件。
这里通过一些示例简单地介绍下 ffmpeg 命令的基本使用。

一、获取详细信息

ffmpeg -i <inputfile> -hide_banner


其中 -hide_banner 选项用于在输出文件的详细信息时省略 ffmpeg 的版本信息和编译选项等。

ffmpeg -i May.mp4 -hide_banner

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'May.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:08.03, start: 0.000000, bitrate: 10299 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 10181 kb/s, 30 fps, 30 tbr, 19200 tbn (default)
    Metadata:
      handler_name    : Core Media Video
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 108 kb/s (default)
    Metadata:
      handler_name    : Core Media Audio
      vendor_id       : [0][0][0][0]
At least one output file must be specified

二、格式转换

ffmpeg -i <inputfile> <outputfile>

FFmpeg 是一个强大的音频和视频格式转换器,几乎支持当前所有常用的格式,如:

ffmpeg -i input.avi output.mp4

或者经常需要用到的,将视频文件转为 GIF 动图:

ffmpeg -i input.mp4 output.gif

如果在格式转换时需要保留源视频的质量,可以添加上 -qscale 0 选项(-qscale 的值越低,输出视频的质量越高):

ffmpeg -i input.webm -qscale 0 output.mp4

可以使用 -formats 选项列出 ffmpeg 命令支持的所有格式(很长很长的一个列表。。。):

ffmpeg -formats -hide_banner

File formats:
 D. = Demuxing supported
 .E = Muxing supported
 --
 D  3dostr          3DO STR
  E 3g2             3GP2 (3GPP2 file format)
  E 3gp             3GP (3GPP file format)
 D  4xm             4X Technologies
  E a64             a64 - video for Commodore 64
 D  aa              Audible AA format files
 D  aac             raw ADTS AAC (Advanced Audio Coding)
 D  aax             CRI AAX
 DE ac3             raw AC-3
 DE ac4             raw AC-4
 D  ace             tri-Ace Audio Container
 D  acm             Interplay ACM
 D  act             ACT Voice file format
 D  adf             Artworx Data Format
 D  adp             ADP
 D  ads             Sony PS2 ADS
  E adts            ADTS AAC (Advanced Audio Coding)
 DE adx             CRI ADX
 D  aea             MD STUDIO audio
 D  afc             AFC
 DE aiff            Audio IFF
 D  aix             CRI AIX
 DE alaw            PCM A-law
 D  alias_pix       Alias/Wavefront PIX image
 DE alp             LEGO Racers ALP
 DE amr             3GPP AMR
 D  amrnb           raw AMR-NB
 D  amrwb           raw AMR-WB
  E amv             AMV
 D  anm             Deluxe Paint Animation
 D  apac            raw APAC
 D  apc             CRYO APC
 D  ape             Monkey's Audio
 ...


 三、指定编码
可以通过 -c 选项手动指定输出文件的编码,如:

ffmpeg -i input.mp4 -c:v vp9 -c:a libvorbis output.mkv

其中 -c:v 用于指定视频编码,-c:a 指定音频编码

PS:视频文件的后缀如 mp4、mkv、avi 等只是表示用来装载媒体流的“容器”类型,而编码时使用的编码方式则另需指定。
当然很多时候 ffmpeg 会根据输出文件的后缀自行选择默认的编码方式,无需手动指定。

只改变视频或者音频流的编码
可以在指定编码时,只改变视频或者音频编码中的一项,另一项则保持原来的格式:

ffmpeg -i input.webm -c:v copy -c:a flac output.mkv

-c:v copy 表示复制输入文件中的视频流到输出文件,不重新进行编码

只改变文件后缀
即输入文件中的视频流和音频流同时复制到输出文件,只改变文件后缀

ffmpeg -i input.webm -c:av copy output.mkv

编码列表
查看 FFmpeg 支持的所有音视频编码格式(又一个很长的列表。。。):

ffmpeg -codecs -hide_banner

Codecs:
 D..... = Decoding supported
 .E.... = Encoding supported
 ..V... = Video codec
 ..A... = Audio codec
 ..S... = Subtitle codec
 ..D... = Data codec
 ..T... = Attachment codec
 ...I.. = Intra frame-only codec
 ....L. = Lossy compression
 .....S = Lossless compression
 -------
 D.VI.S 012v                 Uncompressed 4:2:2 10-bit
 D.V.L. 4xm                  4X Movie
 D.VI.S 8bps                 QuickTime 8BPS video
 .EVIL. a64_multi            Multicolor charset for Commodore 64 (encoders: a64multi)
 .EVIL. a64_multi5           Multicolor charset for Commodore 64, extended with 5th color (colram) (encoders: a64multi5)
 D.V..S aasc                 Autodesk RLE
 D.V.L. agm                  Amuse Graphics Movie
 D.VIL. aic                  Apple Intermediate Codec
 DEVI.S alias_pix            Alias/Wavefront PIX image
 DEVIL. amv                  AMV Video
 D.V.L. anm                  Deluxe Paint Animation
 D.V.L. ansi                 ASCII/ANSI art
 DEV..S apng                 APNG (Animated Portable Network Graphics) image
 D.V.L. arbc                 Gryphon's Anim Compressor
 ...


四、视频压缩
编码与比特率
有些时候,基于磁盘空间和网络传输的考虑,需要对视频文件进行压缩处理。其中一种方法就是改变视频的比特率。
在某些情况下,比特率的适当缩减对视频的观看效果并不会产生太大的影响(人眼察觉的范围内)。
当然编码的选择也会对输出文件的大小产生一定的影响,示例如下:

ffmpeg -i input.webm -c:a copy -c:v vp9 -b:v 1M output.mkv

-b:v 用于指定视频的比特率。

帧率
另一种方式就是改变视频文件的帧率,也就是人们常常提到的FPS。

ffmpeg -i input.webm -c:a copy -c:v vp9 -r 30 output.mkv

-r 30 选项用于指定输出视频的帧率为 30 FPS。

分辨率
视频的分辨率也会影响文件的大小,可以使用 -s 选项指定输出文件的分辨率。当然,视频的画幅大小也会产生相应的变化:

ffmpeg -i input.mkv -c:a copy -s hd720 output.mkv

ffmpeg -i input.mkv -c:a copy -s 1280x720 output.mkv

五、提取音频
通过格式转换,FFmpeg 可以直接将视频文件转为音频文件,只需要指定输出文件的格式为 .mp3 或 .ogg 等。如:

ffmpeg -i input.mp4 output.mp3

同时,也可以在转换时指定音频的格式选项

ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3

其中:
-vn :指定输出文件中禁用视频
-ar :指定输出文件中音频的采样率
-ac:指定音频的通道数
-ab:指定音频的比特率
-f:指定输出文件的格式


六、常用实用命令集锦
调整分辨率
将某视频文件的分辨率改为 1280x720:

ffmpeg -i input.mp4 -filter:v scale=1280:720 output.mp4

或者:

ffmpeg -i input.mp4 -s 1280x720 output.mp4

压缩视频文件

ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4

-vf scale=1280:-1 表示使用视频滤镜进行缩放,将视频宽度设置为 1280,高度自动调整。
-c:v libx264 选择视频编码为 libx264
-preset veryslow 指定编码预设为非常慢,以获得更好的质量
-crf 24 设置恒定质量因子为 24,用于控制编码质量

也可以添加如下选项同时对音频流进行压缩:-c:a aac -strict -2 -b:a 128k

移除音频

ffmpeg -i input.mp4 -an output.mp4

-an 选项表示在输出文件中禁用音频

提取图片

ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png

其中各选项的含义:
-r :设置帧率,即每秒有多少帧画面被提取到图片中。默认为 25
-f :指定输出的格式。本例中为图片(image2)
-image-%2d.png :指定提取出的图片的命名方式。本例中最终的命名为 image-01.png、image-02.png 等。如使用 image-%3d.png ,则最终的命名为 image-001.png、imag-002.png 等

裁剪视频
即截取指定范围内的视频画面,裁切掉多余的部分

ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4

其中 crop=w:h:x:y 用于指定“裁剪框”的大小和位置。
w 表示裁剪部分的宽度(默认为源视频的宽度 iw);
h 表示裁剪部分的高度(默认为源视频的高度 ih;
x 表示 x 轴上裁剪的起始位置(最左边为 0,默认为源视频的中间位置);
y 表示 y 轴上裁剪的起始位置(最顶部为 0,默认为源视频的中间位置)。

改变视频比例
视频比例即视频画幅的长宽比,也就是通常所说的 4:3 和 16:9 等。

ffmpeg -i input.mp4 -aspect 16:9 output.mp4

设置音频封面
即创建以一张静止的图片为画面的视频。

ffmpeg -loop 1 -i inputimage.jpg -i inputaudio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -shortest output.mp4

其中的选项和参数可以根据需求自行修改和省略。

-loop 1:设置输入图像循环播放 1 次。
-i inputimage.jpg:指定输入的图像文件为 inputimage.jpg。
-i inputaudio.wav:指定输入的音频文件为 inputaudio.wav。
-c:v libx264:使用 libx264 进行视频编码。
-tune stillimage:针对静态图像进行优化。
-c:a aac:音频编码使用 aac。
-b:a 192k:音频比特率设置为 192k。
-shortest:以最短的输入(音频或图像)结束输出

截取视频片段

ffmpeg -i input.mp4 -ss 00:00:50 -codec copy -t 60 output.mp4

截取视频中从第 50 秒开始,持续时间为一分钟的视频片段。

-ss 用于指定视频片段的开始时间;
-t 指定视频片段的持续时间,单位都为秒。

也可以使用如下方式:

ffmpeg -i audio.mp3 -ss 00:01:54 -to 00:06:53 -c copy output.mp3

以上命令也适用于音频文件。

视频分割

ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4

将输入的视频文件分割为两段,第一段为从最开始到第 30 秒;第二段为第 30 秒到视频结束。

-t 00:00:30 前面省略了 -ss 00:00:00;
-ss 00:00:30 后面省略了 -t 剩余时间。
有点类似于截取多个连续的视频片段。

视频合并
首先创建包含各媒体文件路径列表的文本文件 join.txt :
file '~/myvideos/part1.mp4'
file '~/myvideos/part2.mp4'
file '~/myvideos/part3.mp4'
使用 -f concat 选项对多个视频进行合并:

ffmpeg -f concat -i join.txt -c copy output.mp4

添加字幕文件

ffmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4

-map 0:将输入视频的所有流映射到输出。
-map 1:将输入字幕的所有流映射到输出。
-c copy:复制音频和视频的编码格式。
-c:v libx264:视频编码使用 libx264。
-crf 23:设置恒定质量因子为 23。
-preset veryfast:编码预设模式为非常快。

改变视频播放速度(音频不受影响)

ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4

上述命令会加快视频画面的播放速度,音频播放速度不变。
如果想放慢视频画面的切换速度,可以相应地将 setpts=0.5*PTS 中的 0.5 改为大于 1 的数值。

Padding
即宽银幕视频中上下的两道“黑边”,可以使用 FFmpeg 命令添加类似的效果:

ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black" output.mp4

该效果由 -vf 选项的 pad 参数指定,可以根据情况自行修改。

-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black":使用视频滤镜进行处理,将视频缩放为 1920x1080 的尺寸,并且保持原始宽高比缩小,同时进行填充,填充的颜色为黑色

从图片创建视频

ffmpeg -framerate 1 -i img%02d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4

把当前目录下的多张图片(名字为 img01.jpg、img02.jpg 的形式)组合为一个视频文件,效果类似于自动播放的 PPT。
每秒切换一张图片。

ffmpeg -framerate 30 -i img%02d.jpg -c:v libx264 -pix_fmt yuv420p output.mp4

也是将当前目录下的多张图片组合成一个完整的视频,该视频帧率为 30 FPS。
每帧切换一张图片。


调整码率
调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。

ffmpeg -i input.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output.mp4


见的容器格式有以下几种。一般来说,视频文件的后缀名反映了它的容器格式。

MP4
MKV
WebM
AVI

常用的视频编码格式如下。

H.262
H.264
H.265

还有几种无版权的视频编码格式。

VP8
VP9
AV1

常用的音频编码格式如下。

MP3
AAC

FFmpeg 内置的视频编码器。

libx264:最流行的开源 H.264 编码器
NVENC:基于 NVIDIA GPU 的 H.264 编码器
libx265:开源的 HEVC 编码器
libvpx:谷歌的 VP8 和 VP9 编码器
libaom:AV1 编码器

音频编码器如下。

libfdk-aac
aac

FFmpeg 常用的命令行参数如下。

-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。

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

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

相关文章

佛山南海区桂城珠宝玉石电商协会举办2023年度电商企业颁奖典礼

4月24日&#xff0c;佛山市南海区桂城珠宝玉石电商协会隆重举办第一届三次会员大会暨2023年度电商企业颁奖典礼&#xff0c;广邀各级政府领导、行业组织、珠宝商场、电商企业、珠宝直播达人以及新闻媒体嘉宾&#xff0c;共见璀璨&#xff0c;共话新发展、新机遇。这是平洲玉器珠…

Java-GUI-AWT-组件-TextComponent类

1 需求 2 接口 java.lang.Object java.awt.Component java.awt.TextComponent Method Detail public void setText(String t)public String getText()public String getSelectedText()public boolean isEditable()public void setEditable(boole…

docker 启动时报错

docker 启动时报如下错误 Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details 因为安装docker时添加了镜像源 解决方案&#xff1a; mv /etc/…

汉译英早操练-(十八)

hello大家好&#xff0c;文接上回&#xff1a;https://blog.csdn.net/weixin_41953346/article/details/138184776 继续学习政府工作报告。 财政政策加力提 效&#xff0c;加强重点领域支出保障&#xff0c;全年新增税费优惠超过2.2万亿元&#xff0c;增发 1 万亿元国债支持灾 …

pwn--realloc [CISCN 2019东南]PWN5

首先学习一下realloc这个函数&#xff0c;以下是文心一言的解释&#xff1a; realloc是C语言库函数之一&#xff0c;用于重新分配内存空间。它的主要功能是调整一块内存空间的大小。当需要增加内存空间时&#xff0c;realloc会分配一个新的更大的内存块&#xff0c;然后将原内…

冯唐成事心法笔记 —— 知世

系列文章目录 冯唐成事心法笔记 —— 知己 冯唐成事心法笔记 —— 知人 冯唐成事心法笔记 —— 知世 冯唐成事心法笔记 —— 知智慧 文章目录 系列文章目录PART 3 知世 成事者的自我修养怎样做一个讨人喜欢的人第一&#xff0c;诚心第二&#xff0c;虚心 如何正确看待别人的评…

C#基础|OOP学习总结、优质的OOP程序有啥特点。

哈喽&#xff0c;你好&#xff0c;我是雷工。 以下为关于学习OOP的学习笔记。 01 OOP学习与基础语法有何不同 C#基础语法需要当时记住就行&#xff1b;OOP学习需要深入理解和记忆。 02 OOP学什么&#xff1f; OOP是学习各种编程的原则、方法、技巧、经验、模式、架构等。 …

超越边界:如何ChatGPT 3.5、GPT-4、DALL·E 3和Midjourney共同重塑创意产业

KKAI&#xff08;kkai人工智能&#xff09;是一个整合了多种尖端人工智能技术的多功能助手平台&#xff0c;融合了OpenAI开发的ChatGPT3.5、GPT4.0以及DALLE 3&#xff0c;并包括了独立的图像生成AI—Midjourney。以下是这些技术的详细介绍&#xff1a; **ChatGPT3.5**&#xf…

edge浏览器新建标签页闪退怎么解决?(打不开标签页)

文章目录 问题描述方法一方法二 问题描述 昨天开始出现这个问题&#xff0c;每次点击 打开一个新的标签页&#xff0c;马上就闪退了。 既然是新建标签页的问题&#xff0c;那么就在设置里看一下新建标签页发生了什么问题。 方法一 进入设置&#xff0c;会发现&#xff0c;有…

常用的 Spring Boot 注解及其作用

1、常用注解介绍&#xff1a; Spring Boot 提供了许多注解来简化开发&#xff0c;并帮助开发者在 Spring 应用中实现各种功能。以下是一些常用的 Spring Boot 注解及其作用&#xff1a; SpringBootApplication&#xff1a; 作用&#xff1a;用于标识主启动类&#xff0c;通常位…

信号分解 | SSA(奇异谱分析)-Matlab

分解效果 SSA(奇异谱分析) 信号分解 | SSA(奇异谱分析)-Matlab 奇异谱分析(Singular Spectrum Analysis,简称SSA)是一种用于时间序列分析的方法。它可以用于数据降维、信号分解、噪声去除和预测等应用。 SSA的基本思想是将时间序列分解为若干个成分,每个成分代表着不同的…

语言模型的发展

文章目录 语言模型的发展历程大语言模型的能力特点大语言模型关键技术概览大语言模型对科技发展的影响 语言模型的发展历程 一般来说&#xff0c;语言模型旨在对于人类语言的内在规律进行建模&#xff0c;从而准确预测词序列中未来&#xff08;或缺失&#xff09;词或词元&…

Dubbo应用可观测性升级指南与踩坑记录

应用从dubbo-3.1.*升级到dubbo-*:3.2.*最新稳定版本&#xff0c;提升应用的可观测性和度量数据准确性。 1. dubbo版本发布说明(可不关注) dubbo版本发布 https://github.com/apache/dubbo/releases 【升级兼容性】3.1 升级到 3.2 2. 应用修改点 应用一般只需要升级dubbo-s…

Vue+OpenLayers7入门到实战:OpenLayers加载GeoJson格式数据并解析成多边形、线段、点和区域范围等要素叠加到地图矢量图层上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上加载GeoJson格式数据并解析成多边形、线段、点和区域范围等要素叠加到地图矢量图层上的功能。 前面两章也是可以支持多边形、线段、点和区域范围灯数据加载的,只是没…

Go 到底是哪里没有做好,我请问呢?

没有引导好并发理念 从历史背景来看&#xff0c;在 Go 诞生的那个年代&#xff0c;并发编程是一个比较新颖的理念。许多其他编程语言、论文甚至书籍都写过关于并发编程的内容。并发编程还没有成为主流思想。 Go 团队发明了 “goroutine” 这个词&#xff0c;Go 让协程的使用变…

轴承轶闻01-扎雷茨基和帕姆格伦

这个口述历史项目是NASA的一个在线资源&#xff0c;旨在记录和保留NACA时期的历史资料和相关信息。NACA成立于1915年&#xff0c;直到1958年成立NASA之前一直存在。在这段时间里&#xff0c;NACA在航空技术和航天领域做出了许多重要贡献&#xff0c;为美国的航空航天事业奠定了…

Leetcode刷题之——队列Queue|先入先出FIFO|广度优先搜索BFS|栈Stack|后入先出LIFO|深度优先搜索DFS

Leetcode刷题之——队列Queue|先入先出FIFO|广度优先搜索BFS|栈Stack|后入先出LIFO|深度优先搜索DFS 1. 队列(Queue)——FIFO&#xff0c;先入先出的数据结构1.1 循环队列1.2 内置队列的常用方法&#xff08;C&#xff09;1.3 广度优先搜索&#xff08;BFS&#xff09; 2.栈(St…

袁庭新ES系列16节|Elasticsearch客户端高级操作

前言 上一章节袁老师主要带领大家学习了Elasticsearch客户端基础部分的内容&#xff0c;Elasticsearch客户端还有很多高级相关的操作&#xff0c;这一章节主要带领大家来学习Elasticsearch客户端高级相关的操作。接下来就跟上袁老师的节奏继续探讨Elasticsearch的相关知识。 一…

Linux常用命令总结(四):文件权限及相关命令介绍

1. 文件属性信息解读 1. 文件类型和权限的表示 0首位表示类型。在Linux中第一个字符代表这个文件是目录、文件或链接文件 符号对应文件类型-代表文件dd 代表目录l链接文档(link file)&#xff1b; 1-3位确定属主&#xff08;该文件的所有者&#xff09;拥有该文件的权限。 4-6…

Flutter 之 Widget

在 Flutter 开发框架中&#xff0c;Widget&#xff08;中文&#xff1a;小部件&#xff09;是一种核心概念&#xff0c;用于描述用户界面&#xff08;UI&#xff09;的各个组成部分。它不仅是构成 Flutter 应用程序的基础单元&#xff0c;也是实现应用程序视图层的主要手段。以…