Loading... ## 简介 FFmpeg 是一个开源的跨平台多媒体处理工具,用于转换、编辑和流式传输音视频文件。它支持几乎所有常见的视频和音频格式,是视频处理领域中最强大、最常用的工具之一。 ### 功能 1. **视频/音频转码**:FFmpeg 能够将不同格式的音频和视频文件相互转换。例如,将 MP4 文件转换为 AVI 格式,或者将音频文件从 MP3 转换为 WAV。 2. **视频/音频剪辑**:FFmpeg 可以截取视频的部分片段,或者将音频文件的某一段提取出来。 3. **合并和分割文件**:它可以将多个视频或音频文件合并成一个文件,或者将一个大文件分割为多个小文件。 4. **添加字幕**:FFmpeg 支持将外部字幕文件(如 `.srt`)嵌入到视频中,或者从视频中提取字幕流。 5. **视频滤镜**:FFmpeg 提供了多种滤镜用于处理视频,像是裁剪、缩放、旋转、添加水印、调整亮度和对比度等。 6. **流式传输**:FFmpeg 支持通过网络进行视频流媒体传输,可以用于创建直播流或者实时传输音视频数据。 --- ## 下载 官方下载地址:[https://ffmpeg.org/](https://ffmpeg.org/) 点击官网的download按钮,选择对应的版本,如果是 windows 选择「Windows builds from gyan.dev」。 <div class="tip inlineBlock info"> gyan.dev版本较Btbn版本更为稳定,但是Btbn更新更快,包含实验版本和开发版本的新特性。 </div> <img src="https://cloud.nailoy.com/typecho/uploads/2024/12/2665676145.png" width=50%> 在下面选择release builds中最新版本的essentials版本 <img src="https://cloud.nailoy.com/typecho/uploads/2024/12/2857031295.png" width=50%> 下载后可以使用sha256检测文件完整性 `certutil -hashfile ffmpeg-7.1-essentials_build.7z sha256` --- ## 添加环境变量 1. win+r 键输入 `sysdm.cpl` <img src="https://cloud.nailoy.com/typecho/uploads/2024/12/4006287263.png" width=50%> 2. 找到高级->环境变量 <img src="https://cloud.nailoy.com/typecho/uploads/2024/12/1041136418.png" width=50%> 3. 双击系统变量中的Path,把ffmpeg的bin文件夹路径添加至环境变量中 <div class='album-photos'><figure> <img src="https://cloud.nailoy.com/typecho/uploads/2024/12/1363430988.png" width=50%> <figcaption></figcaption> </figure><figure> <img src="https://cloud.nailoy.com/typecho/uploads/2024/12/2794334653.png" width=50%> <figcaption></figcaption> </figure></div> 5. 在cmd中输入`ffmpeg -version`来验证环境变量是否添加成功,如果成功添加应该会返回如下信息 <img src="https://cloud.nailoy.com/typecho/uploads/2024/12/814972095.png" width=50%> --- ## ffmpeg的基础命令使用 <div class="tip inlineBlock warning"> 以下命令中的视频和音频格式只是举例,实际使用时可以是其他格式,使用 `ffmpeg -formats` 和 `ffmpeg -codecs` 以查看ffmpeg支持的格式和编码解码器 </div> ### 基础命令 <div id="excursus"></div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-56050d25e1199d38c701d52cb472089b94" aria-expanded="true"><div class="accordion-toggle"><span style="id:excursus;">点击以展开</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-56050d25e1199d38c701d52cb472089b94" class="collapse collapse-content"><p></p> <table width="800" border="1" style="border-collapse:collapse"> <tr> <th>命令</th> <th>解释</th> </tr> <tr> <td>-h</td> <td>打印基本选项</td> </tr> <tr> <td>-h long</td> <td>打印更多选项</td> </tr> <tr> <td>-h full</td> <td>打印所有选项(包括所有格式和编解码器特定的选项,内容较长)</td> </tr> <tr> <td>-h type=name</td> <td>打印指定解码器/编码器/解复用器/复用器/过滤器/比特流过滤器/协议的所有选项</td> </tr> <tr> <td>-L</td> <td>显示许可证信息</td> </tr> <tr> <td>-h <topic></td> <td>显示有关特定主题的帮助信息</td> </tr> <tr> <td>-version</td> <td>显示版本信息</td> </tr> <tr> <td>-muxers</td> <td>显示可用的复用器</td> </tr> <tr> <td>-demuxers</td> <td>显示可用的解复用器</td> </tr> <tr> <td>-devices</td> <td>显示可用的设备</td> </tr> <tr> <td>-decoders</td> <td>显示可用的解码器</td> </tr> <tr> <td>-encoders</td> <td>显示可用的编码器</td> </tr> <tr> <td>-filters</td> <td>显示可用的过滤器</td> </tr> <tr> <td>-pix_fmts</td> <td>显示可用的像素格式</td> </tr> <tr> <td>-layouts</td> <td>显示标准的音频通道布局</td> </tr> <tr> <td>-sample_fmts</td> <td>显示可用的音频采样格式</td> </tr> <tr> <td>-v <loglevel></td> <td>设置日志级别</td> </tr> <tr> <td>-y</td> <td>强制覆盖输出文件</td> </tr> <tr> <td>-n</td> <td>从不覆盖输出文件</td> </tr> <tr> <td>-stats</td> <td>显示编码进度报告</td> </tr> <tr> <td>-f <fmt></td> <td>强制使用指定的容器格式(自动检测格式时使用)</td> </tr> <tr> <td>-t <duration></td> <td>在指定时长后停止转码</td> </tr> <tr> <td>-to <time_stop></td> <td>在指定时间点停止转码</td> </tr> <tr> <td>-ss <time_off></td> <td>从指定时间点开始转码</td> </tr> <tr> <td>-metadata[:<spec>] <key=value></td> <td>添加元数据</td> </tr> <tr> <td>-c[:<stream_spec>] <codec></td> <td>选择编解码器(‘copy’表示直接复制流而不进行重新编码)</td> </tr> <tr> <td>-filter[:<stream_spec>] <filter_graph></td> <td>对音视频流应用指定的过滤器</td> </tr> <tr> <td>-r[:<stream_spec>] <rate></td> <td>重写输入的帧率或转换为指定的输出帧率(可以是频率值、分数或缩写)</td> </tr> <tr> <td>-aspect[:<stream_spec>] <aspect></td> <td>设置视频的宽高比(例如:4:3,16:9,1.3333,1.7777)</td> </tr> <tr> <td>-vn</td> <td>禁用视频</td> </tr> <tr> <td>-vcodec <codec></td> <td>视频流的编码器/解码器(等同于-c:v)</td> </tr> <tr> <td>-vf <filter_graph></td> <td>应用视频流的过滤器(等同于-filter:v)</td> </tr> <tr> <td>-b <bitrate></td> <td>设置视频比特率(请使用-b:v)</td> </tr> <tr> <td>-aq <quality></td> <td>设置音频质量(编解码器特定)</td> </tr> <tr> <td>-ar[:<stream_spec>] <rate></td> <td>设置音频采样率(单位:Hz)</td> </tr> <tr> <td>-ac[:<stream_spec>] <channels></td> <td>设置音频通道数</td> </tr> <tr> <td>-an</td> <td>禁用音频</td> </tr> <tr> <td>-acodec <codec></td> <td>音频流的编码器/解码器(等同于-c:a)</td> </tr> <tr> <td>-ab <bitrate></td> <td>设置音频比特率(等同于-b:a)</td> </tr> <tr> <td>-af <filter_graph></td> <td>应用音频流的过滤器(等同于-filter:a)</td> </tr> <tr> <td>-sn</td> <td>禁用字幕</td> </tr> <tr> <td>-scodec <codec></td> <td>字幕流的编码器/解码器(等同于-c:s)</td> </tr> </table> <p></p></div></div></div> ### 常用命令 <table width="800"> <tr> <th>命令</th> <th>解释</th> </tr> <tr> <td>ffmpeg -i input.mp4</td> <td>打印视频信息(视频,音频,字幕)</td> </tr> <tr> <td>ffmpeg -i input.mp4 output.avi</td> <td>转换视频格式</td> </tr> <tr> <td>ffmpeg -i input.mp4 -c:v libx265 output.mp4</td> <td>转换视频编码为H.265</td> </tr> <tr> <td>ffmpeg -i input.mp4 -c:v libx264 output.mp4</td> <td>转换视频编码为H.264</td> </tr> <tr> <td>ffmpeg -i input.mp4 -c:a aac -vn output.aac</td> <td>提取视频中的音频</td> </tr> </table> ### 剪切视频 `ffmpeg -ss 00:01:30 -i input.mp4 -t 00:05:00 -c copy output.mp4`:从视频的1分30秒开始,剪切5分钟,其中 `-c copy` 直接复制流,不重新对视频和音频编码,速度更快 `ffmpeg -ss 00:02:00 -i input.mp4 -c copy output.mp4`:从视频的 00:02:00 开始剪切直到视频结束 如果需要在非常精确的时间点进行剪切,可以使用`-vsync 0` 来控制帧同步 `ffmpeg -ss 00:01:30 -i input.mp4 -c copy -vsync 0 output.mp4`:从1分30秒处剪切,并强制帧同步 <div class="tip inlineBlock info"> 在使用 ffmpeg 切割视频时,可能无法达到绝对精确的时间切割,因为视频编码中的关键帧(I帧)以及它后面的 P 帧和 B 帧是紧密相连的。如果强行在这些帧之间进行切割,就需要重新编码视频,这会导致文件体积增加。因此,当切割点恰好位于两个关键帧之间时,ffmpeg 会选择向前或向后调整切割位置,导致最终输出的视频片段长度通常会比预计的略长 </div> ### 添加字幕 <div class="tip inlineBlock warning"> 小批量添加字幕推荐使用[MKVToolNix](https://mkvtoolnix.download/),有GUI操作更方便 </div> #### 硬字幕 硬字幕是将字幕直接嵌入视频画面中,用户无法关闭字幕 将 `.srt` 字幕文件添加为硬字幕: `ffmpeg -i input.mp4 -i subtitles.srt -c:v libx264 -c:a copy -c:s mov_text output.mp4` 其中 `-c:s mov_text` 将字幕转为了 `mov_text` 格式 #### 软字幕 软字幕不会嵌入视频画面,而是作为独立的字幕流存在,用户可以在播放器中选择打开或关闭字幕 将 `.srt` 字幕文件添加为软字幕: `ffmpeg -i input.mp4 -i subtitles.srt -c:v copy -c:a copy -c:s srt output.mp4 ` #### 添加字幕并转为MKV格式 MKV 相较于 MP4 有着很多优点,尤其是对多音轨和多字幕的支持,可以保留视频文件的原始信息,使得它非常适合存储番剧、电影、电视剧等视频。 | 特性 | MKV | MP4 | |---------------------|----------------------------------|----------------------------------| | 文件大小 | 较大,尤其包含多个音轨、字幕流时 | 较小,适合流媒体和移动设备 | | 兼容性 | 较差,需要特定播放器或设备 | 非常好,几乎所有设备都支持 | | 支持的编解码器 | 支持几乎所有编解码器 | 支持 H.264、H.265、AAC、MP3 等 | | 字幕支持 | 支持多种字幕流,多语言字幕 | 仅支持单个字幕流 | | 功能和灵活性 | 灵活,支持章节、菜单、封面等 | 功能简单,注重流媒体播放 | | 用途 | 存档高清电影、电视剧,家庭影院 | 流媒体、移动设备视频播放 | | 视频质量 | 高质量,支持高质量音频编码 | 高压缩,适合流媒体和移动播放 | 将 `.srt` 字幕文件添加到视频中并转为mkv格式: `ffmpeg -i input.mp4 -sub_charenc 'UTF-8' -i input.srt -map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy -c:s srt output.mkv` 其中 `-map 0:0` 的第一个 `0` 代表 `-i` 中的第一个输入文件,第二个 `0` 代表选中输入文件中的第一个流。例如这里的 `-map 0:0` 指的就是`input.mp4`中的视频流,`-map 1:0` 则指的是字幕流 最后修改:2025 年 01 月 12 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 你的支持是我最大的动力