Skip to content

Commit 4000623

Browse files
committed
update
1 parent 4aefacc commit 4000623

File tree

7 files changed

+156
-177
lines changed

7 files changed

+156
-177
lines changed
Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
1-
要使用 FFmpeg 合并多个视频文件文件,可以使用 `concat` 协议和 `concat` 过滤器。以下是合并多个视频文件的一般步骤(以 mp4 为例):
1+
# 批量视频合成
22

3-
1. 首先,创建一个文本文件,其中包含要合并的 mp4 文件的列表。每行应包含一个文件的路径,文件书写的顺序就是合并的顺序。如下所示:
3+
这个用的最多的就是合成 m3u8 视频,某些视频链接是 m3u8 格式。下载下来后会是一堆 `.ts` 视频,每个 `.ts` 视频仅仅只有几秒钟,所以我们需要将这些 `.ts` 视频按照顺序进行合成为一个大的完整视频。
4+
5+
要使用 FFmpeg 合并多个视频文件文件,主要使用 `concat` 参数。
6+
7+
1. 首先,创建一个文本文件,其中包含要合并的 mp4 文件的列表。每行应包含一个文件的路径,*文件书写的顺序就是合并的顺序*。如下所示:
48

59
```
6-
file 'file1.mp4'
7-
file 'file2.mp4'
8-
file 'file3.mp4'
10+
file /path/01.ts
11+
file 02.ts
12+
file ./../ 3.ts
913
```
1014

15+
前面为关键词 file, 后面跟上视频的地址(绝对路径或相对路径)。 **ffmpeg 将会按照 txt 文件中的顺序将视频合并**。然后在命令行中输入如下命令就可以了:
16+
1117
保存这个文本文件(例如,命名为`filelist.txt`)。
1218

1319
2. 打开终端或命令提示符,并使用以下命令合并 mp4 文件:
1420

1521
```bash
1622
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
23+
24+
# 是下面命令的简写形式
25+
26+
$ ffmpeg -f concat -safe 0 -i file.txt -acodec copy -vcodec copy -f mp4 file.mp4
1727
```
1828

1929
这个命令的各个部分解释如下:
@@ -26,4 +36,37 @@ ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
2636

2737
运行此命令后,FFmpeg 将会将列表中的 mp4 文件合并成一个名为 `output.mp4` 的文件。
2838

29-
注意,上面示例命令中的媒体文件默认具有相同的编解码格式和分辨率,因此直接使用 `-c copy` 进行流复制。如果你的文件之间有差异(如具有不同的编码),可能就需要进行重新编码以确保具有相同的规格。
39+
注意,上面示例命令中的媒体文件默认具有相同的编解码格式和分辨率,因此直接使用 `-c copy` 进行流复制。如果你的文件之间有差异(如具有不同的编码),可能就需要进行重新编码以确保具有相同的规格。
40+
41+
**特别说明:**
42+
43+
上面示例只是以 `.ts` 文件为例做说明,并不代表不能合并其他格式的视频文件。`ffmpeg` 的牛逼之处不在于能够合并视频,还可以将音视频分离的两个文件进行合并。
44+
45+
比如将视频文件(example.mp4)和音频文件(example.m4a)进行合并:
46+
47+
```bash
48+
ffmpeg -i example.mp4 -i example.m4a -c:a copy -c:v copy output.mp4
49+
```
50+
51+
# 少量视频合成
52+
53+
前面适合批量视频合成,如果只有几个视频文件就完全没必要单独写一个 txt 文件。直接在命令行中使用 `concat` 协议即可:
54+
55+
比如我当前目录下有三个 `.ts` 视频:
56+
57+
```bash
58+
$ ls
59+
01.ts 02.ts 03.ts
60+
```
61+
62+
如果将要将这三个 ts 视频按顺序合成的话可以使用下面的命令(视频合成顺序就是你指定的顺序):
63+
64+
```bash
65+
ffmpeg [-safe 0] -i "concat:1.ts|2.ts|3.ts" -c copy file.mp4
66+
```
67+
68+
`-safe 0` 是可选参数,如果出现类似如下错误,可以使用该参数解决:
69+
70+
```Prolog
71+
file.txt: Operation not permitted
72+
```

ffmpeg 命令行工具/ffmpeg 命令常用方式.md

Lines changed: 0 additions & 167 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
官网地址:http://ffmpeg.org
2+
3+
GitHub 地址:https://github.com/FFmpeg/FFmpeg
4+
5+
**ffmpeg 安装:**
6+
7+
```bash
8+
# Mac 下使用 HomeBrew 安装
9+
$ brew install -v ffmpeg
10+
11+
# CentOS/RHEL 系统可以使用 YUM 包管理工具安装
12+
$ yum install -y ffmpeg
13+
14+
# Debain/Ubuntu 系列使用 APT 包管理工具安装
15+
$ apt-get install -y ffmpeg
16+
```
17+
18+
|**Note**|
19+
|:-------|
20+
|Windows 系统的话需要去官网下载对应的安装版本,或者直接到二进制下载页面下载:[https://github.com/BtbN/FFmpeg-Builds/releases](https://github.com/BtbN/FFmpeg-Builds/releases)|
21+
22+
23+
安装完成之后在可以在终端输入 `ffmpeg -version` 命令验证是否安装成功,如果输出类似如下的信息即表示安装成功了:
24+
25+
```bash
26+
$ ffmpeg -version
27+
28+
ffmpeg version 4.3.3-0+deb11u1 Copyright (c) 2000-2021 the FFmpeg developers
29+
built with gcc 10 (Debian 10.2.1-6)
30+
configuration: --prefix=/usr --extra-version=0+deb11u1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
31+
libavutil 56. 51.100 / 56. 51.100
32+
libavcodec 58. 91.100 / 58. 91.100
33+
libavformat 58. 45.100 / 58. 45.100
34+
libavdevice 58. 10.100 / 58. 10.100
35+
libavfilter 7. 85.100 / 7. 85.100
36+
libavresample 4. 0. 0 / 4. 0. 0
37+
libswscale 5. 7.100 / 5. 7.100
38+
libswresample 3. 7.100 / 3. 7.100
39+
libpostproc 55. 7.100 / 55. 7.100
40+
```
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
语法示例:
2+
3+
```bash
4+
ffmpeg -ss 00:00:00 -to 00:00:15 -i 源文件名 -vcodec copy -acodec copy 目标文件名 -y
5+
ffmpeg -ss 00:00:00 -t 15 -i 源文件名 -vcodec copy -acodec copy 目标文件名 -y
6+
```
7+
8+
参数说明:
9+
10+
```log
11+
-i 表示源视频文件
12+
-ss time_start 设置从视频截取开始位置,如 00:00:10 表示从视频的第10s开始截取
13+
14+
-to time_end 设置视频截取的结束位置,如 00:20:00 表示从 time_start 一直截
15+
取到视频的第 20 分钟(如果省略则表示开始从 time_start 开始截
16+
取全部视频)
17+
18+
-t time_duration 与 -to 一样,不过指定的是具体的时长,单位是秒。如 -t 20 表示从
19+
time_start 开始向后截取 20 秒
20+
21+
-vcodec copy 表示使用跟原视频一样的视频编解码器(即不改变任何数据)
22+
23+
-acodec copy 表示使用跟原视频一样的音频编解码器(即不改变任何数据)
24+
25+
-y 表示如果输出文件已存在则覆盖(可以省略)
26+
```
27+
28+
在做视频截取时视频质量会通常会有一定的损失,如果想要保持原视频质量截取的话可以通过指定 `-vcodec copy -acodec copy` 两个参数。当然了,截取的目标文件的后缀最好也与原文件也保持一致。
29+
30+
|**注意**|
31+
|:-------|
32+
|参数 `-ss` 最好放在 `-i 源文件名` 的前面,如果放在后面则 `-to` 的含义就变了,变成了与 `-t` 一样的效果了。变成了截取多长视频,而不是截取到视频指定的位置。所以一定要特别注意 `-ss` 的位置。|
33+
34+
看个示例:
35+
36+
```bash
37+
$ ls -lh
38+
total 236360
39+
-rw-r--r--@ 1 mingrn97 staff 115M Nov 8 11:33 文件系统.flv
40+
```
41+
42+
视频总时长为 27 分钟,现在以十分钟进行一个切割,共切割成三个视频,之后看下三个视频的大小加起来是否与原视频大小一致:
43+
44+
```bash
45+
$ ffmpeg -ss 00:00:00 -to 00:10:00 -i 文件系统.flv -vcodec copy -acodec copy 文件系统1.flv
46+
$ ffmpeg -ss 00:10:00 -to 00:20:00 -i 文件系统.flv -vcodec copy -acodec copy 文件系统2.flv
47+
$ ffmpeg -ss 00:20:00 -i 文件系统.flv -vcodec copy -acodec copy 文件系统3.flv
48+
```
49+
50+
结果:
51+
52+
```bash
53+
$ ls -lh
54+
total 472920
55+
-rw-r--r--@ 1 mingrn97 staff 115M Nov 8 11:33 文件系统.flv
56+
-rw-r--r-- 1 mingrn97 staff 43M Mar 24 17:31 文件系统1.flv
57+
-rw-r--r-- 1 mingrn97 staff 42M Mar 24 17:33 文件系统2.flv
58+
-rw-r--r-- 1 mingrn97 staff 31M Mar 24 17:33 文件系统3.flv
59+
```
60+
61+
|**Note**|
62+
|:-------|
63+
|注意看第三次截取视频的命令,仅指定了开始截取视频时间(`-ss 00:20:00`),并没有直接截取的结束时间。像这样只有开始没有结束的用法表示的是从指定的开始时间截取到视频结尾。|

ffmpeg 命令行工具/ffmpeg 音视频倍速播放.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
21
# 前言
32

43
视频流的播放速度可以通过改变每帧的显示时间戳(PTS)来改变。有两种实现方法:
54

65
1. 通过将视频导出为 **原始比特流** 进行重新封装。
7-
86
2. 使用 filter 过滤器。
97

108
# 使用“原始比特流”实现倍速播放(专业玩家)

ffmpeg 命令行工具/readme.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@
1010

1111
- [如何确认视频文件流媒体信息](如何确认视频文件流媒体信息.md)
1212

13-
- [ffmpeg 命令常用方式](ffmpeg%20命令常用方式.md)
13+
- [ffmpeg 安装](ffmpeg%20安装.md)
1414

1515
- [ffprobe 查看媒体文件头信息](ffprobe%20查看媒体文件头信息.md)
1616

17+
- [ffmpeg 截取视频](ffmpeg%20截取视频.md)
18+
1719
- [ffmpeg 的 map 参数](ffmpeg%20的%20map%20参数.md)
1820

1921
- [ffmpeg 合并多个视频文件](ffmpeg%20合并多个视频文件.md)
2022

21-
- [ffmpeg 流媒体 Metadata](ffmpeg%20流媒体%20Metadata.md)
23+
- [ffmpeg 修改流媒体 Metadata](ffmpeg%20修改流媒体%20Metadata.md)
2224

2325
- [ffmpeg 视频添加音频](ffmpeg%20视频添加音频.md)
2426

0 commit comments

Comments
 (0)