ffmpeg

硬件编码后缀解释:

qsv:intel显卡的快速视频同步技术(quick sync video)
nvenc:nvidia显卡的硬件视频编码器(nvidia hardware video encoder)
cuvid:nvdec的旧称,只有解码端。
cuda: 同上.nvdec的旧称,只有解码端。
amf:amd显卡的amf硬件编码器(amd hardware encoder)

查看支持

1
2
3
4
5
6
7
8
9
10
# 查看支持的硬件加速方式
PS C:\Users\asus> ffmpeg -hwaccels

Hardware acceleration methods:
cuda
dxva2
qsv
d3d11va
opencl
vulkan
1
2
3
4
5
# 获取支持的编解码器选项
PS C:\Users\asus> ffmpeg -codecs | sls nvenc

DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_qsv libopenh264 h264_cuvid ) (encoders: libx264 libx264rgb libopenh264 h264_amf h264_mf h264_nvenc h264_qsv )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_cuvid ) (encoders: libx265 hevc_amf hevc_mf hevc_nvenc hevc_qsv libkvazaar )
1
2
3
4
5
6
7
# 获取支持的H264解码器选项
PS C:\Users\asus> ffmpeg -decoders | sls 264

VFS..D h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
V....D h264_qsv H264 video (Intel Quick Sync Video acceleration) (codec h264)
V....D libopenh264 OpenH264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)
1
2
3
4
5
6
7
8
9
10
# 获取支持的H264编码器选项
PS C:\Users\asus> ffmpeg -encoders |sls 264

V....D libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
V....D libx264rgb libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264)
V....D libopenh264 OpenH264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
V....D h264_amf AMD AMF H.264 Encoder (codec h264)
V....D h264_mf H264 via MediaFoundation (codec h264)
V....D h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
1
2
3
4
5
# 获取支持的H265解码器选项
ffmpeg -decoders |sls hevc

# 获取支持的H265编码器选项
ffmpeg -encoders |sls hevc

命令行及常用参数解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
ffmpeg -i inputfile1 -i inputfile2 output.mp4


-hwaccel cuvid:使用cuvid进行硬件加速
-c:a copy: 保持音频原编码格式
-c:v copy: 保持视频原编码格式
-c:v h264_cuvid:使用h264_cuvid进行解码
-c:v h264_nvenc:使用h264_nvenc进行编码(nvidia硬件加速x265)
-b:v 2000k:比特率,值越大约清晰。
-b:v 3500K :视频平均比特率为 3500K
-s 1920x1080:分辨率
-bufsize 6000K:缓存区大小 6000K,建议设定为 当前码率帧率5,也许这里的2pass是针对缓冲区的,缓存未来5s
-maxrate 5000K:最大码率为 5000K,每帧的最高码率不超过这个数值
-pix_fmt p010le:输出的像素格式是 p010le 也就10bit,只有新的硬件支持,例如:970m不支持,1070可以支持
-profile:v high:高级画质。
H.264有四种画质级别,分别是baseline, extended, main, high:
1. Baseline Profile:基本画质。
2. Extended profile:进阶画质。(用的少)
3. Main profile:主流画质。
4. High profile:高级画质。在main Profile 的基础上增加了无损视频编码和更多的YUV 格式;
在相同配置情况下,High profile(HP)可以比Main profile(MP)降低10%的码率。
根据应用领域的不同,Baseline profile多应用于实时通信领域,Main profile多应用于流媒体领域,High profile则多应用于广电和存储领域。

-preset slow:预设方案是 slow,slow已经是最好的选项了
ultrafast(转码速度最快,视频往往也最模糊)
superfast
veryfast
faster
fast
medium(default)
slow
slower
veryslow
placebo

-crf 28: 恒定速率因子模式,用来设置码率控制模式,0表示无损画质(一般18-28,18为分界线)
-qp 28: 恒定量化器模式,用来设置码率控制模式,(0-51)0表示无损画质

注意

  1. h264_qsv 解码 不能搭配 `-profile:v high``

  2. ``-qp 28不能和 -profile:v high`一起出现,不然视频 有音频 没画面

  3. qp这类的压缩,应一个输入对应一个输出,若多个输入,应先将多个输入无损编码成一个较大文件,然后再用qpcrf这类参数对较大文件进行压缩,以免出现“有音频 没画面”等异常情况

    虽然也不怎么会出现,但后者会更接近一点原来的一点

    1
    2
    3
    ffmpeg -hwaccel cuvid -i audio.mp4 -c:v h264_cuvid -i video.mp4 -profile:v high -b:v 0 -c:v h264_nvenc [-preset slow] tempfile.mp4

    ffmpeg -hwaccel cuvid -i tempfile.mp4 -qp 28 -c:v h264_nvenc output.mp4
    1
    ffmpeg -hwaccel cuvid -i audio.mp4 -c:v h264_cuvid -i video.mp4 -profile:v high [-preset slow] [-b:v 0] -qp 28 -c:v h264_nvenc output.mp4
  4. 普通情况下 Intel 卡和 NVIDIA 输出差不多,但 N卡效果好像好点

    1
    2
    3
    4
    5
    # I卡
    ffmpeg -hwaccel qsv -i audio.mp4 -c:v h264_qsv -i video.mp4 [-profile:v high] [-preset slow] -c:v qsv output.mp4

    # N卡
    ffmpeg -hwaccel cuvid -i audio.mp4 -c:v h264_cuvid -i video.mp4 [-profile:v high] [-preset slow] [-crf 10|18|28] -c:v hevc_nvenc output.mp4
  5. N卡配合 bv(非0) 效果很差

    1
    ffmpeg -hwaccel cuvid -i audio.mp4 -c:v h264_cuvid -i video.mp4 [-profile:v high] -b:v 10 -c:v hevc_nvenc output.mp4

去水印

框出水印位置

1
2
3
4
5
6
7
8
9
10
11
ffplay -i 1.mp4 -vf delogo=x=0:y=0:w=150:h=100:show=1 [-ss 5] [-t 5]

-vf 自定义滤镜
delogo
x:起始横坐标
y:起始纵坐标
w:宽度
h:高度
show:是否显示绿框 0:不显示 1:显示
--s 从第几秒开始
-t 持续几秒(-t 5:即只输出5秒)

导出去除水印的视频

1
2
3
4
5
6
7
8
# 截取前面的5s,然后去除水印
ffmpeg -i 1.mp4 -vf delogo=x=1120:y=10:w=155:h=100:show=0 -t 5 output1.mp4

# 截取中间无水印的部分
ffmpeg -i 1.mp4 -ss 5 -t 20 output2.mp4

# 去除结尾的水印
ffmpeg -i 1.mp4 -vf delogo=x=10:y=600:w=160:h=100:show=0 -ss 25 -t 剩下的时间 output3.mp4

拼接视频

1
2
3
4
5
6
ffmpeg -f concat -i t.txt -c copy output.mp4

# t.txt
file 'output1.mp4'
file 'output2.mp4'
file 'output3.mp4'