ffmpeg

Ling Yu
Ling Yu

FFmpeg安装使用指南

1.安装

1.1 Windows下安装FFmpeg

访问FFmpegguan官网下载,完成安装


2.使用

2.1 识别视频信息,通过ffprobe命令识别并输出视频信息

$ ffprobe -v error -show_streams -print_format json 'xxx.mp4'

2.2 视频压缩

$ ffmpeg -i 'xxx.mp4' -s 1920x1080 -b:v 8500k 'out.mp4'

注意:

我们主要关注的部分: -s (输出视频分辨率,尺寸) ; -b(输出视频的清晰度)

-i :后面跟着一个xxx.mp4,是我们即将要压缩的源视频文件当然也可以用绝对路径或者相对路径。

-s :后面写的是1920x1080,对应的是我们目标视频文件分辨率,注意中间的是字母 x(艾克斯),不是乘号(✖)。一般分辨率可以按照自己想法设置。

-b:v : 码率,数据传输时单位时间传送的数据位数,这个参数影响着视频的清晰度,我这里使用的分辨率是1920x1080,码率设置为 8500k,具体大小主要根据所选视频的分辨率自行选择, 参考这位大佬的分辨率与码率的对照表 ,然后可以根据自己的需要调整自己的码率大小 。

有一些没有用到的参数:

-r : 视频每秒的帧数,虽然说减少每秒视频的帧数也可以起到压缩视频的大小,但我不用他的原因是因为在一些切换画面比较快速和频繁的情况下,减少帧数会导致视频卡顿的视觉感受,一般我不会少于25帧/s。

-qscale: 质量为基础的VBR,网上说取值0.01-255。(但好像导出默认就是VBR,我试着调节了一下参数,对文件大小影响并不是很大,所以也没有去选择这一个,还是用的 -b:v 这个参数)

-sameq 使用和源同样的质量(没试过,用不到)

示例:1920x1080 25帧/s的视频压缩,使用的命令:

$ ffmpeg -i 'xxx.mp4' -r 25 -s 1920x1080 -b:v 8500k 'x.mp4'

ffmpeg添加字幕文件

1 字幕格式转换

ffmpeg -i "test_x.srt" "test_x.vtt"
ffmpeg -i "test_x.srt' 'test_x.ass"

3.1. 查询命令 查询所下载的ffmpeg是否支持cuda,若是不支持(我下载的是支持的),那从新下载一下或者自行编译。bash

ffmpeg -hwaccels

查看支持 cuda 的编码器 执行 ffmpeg -codecs | findstr cuvid or ffmpeg -codecs | grep cuvid(linux) 所有带有"cuvid"或"nvenc"的,都是CUDA提供的GPU编解码器

开始转码 执行ffmpeg -i -vcodec h264_nvenc -vcodec 表示指定 视频编码器,只要指定了支持 GPU 加速的编码器,FFMPEG 就会自动使用 GPU

使用GPU进行视频转码 用GPU进行转码的命令和软转码命令不太一样,CPU转码的时候,我们可以依赖ffmpeg识别输入视频的编码格式并选择对应的解码器,但ffmpeg只会自动选择CPU解码器,要让ffmpeg使用GPU解码器,必须先用ffprobe识别出输入视频的编码格式,然后在命令行中指定对应的GPU解码器。

例如,将h264编码的源视频转码为指定尺寸和码率的h264编码视频:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y -hwaccel cuvid:指定使用cuvid硬件加速 -c:v h264_cuvid:使用h264_cuvid进行视频解码 -c:v h264_nvenc:使用h264_nvenc进行视频编码 -vf scale_npp=1280:-1:指定输出视频的宽高,注意,这里和软解码时使用的-vf scale=x:x不一样 转码期间使用nvidia-smi查看显卡状态,能够看到ffmpeg确实是在使用GPU进行转码: 作者:kelgon 链接:https://www.jianshu.com/p/59da3d350488

ffmpeg并不具备自动向不同GPU分配转码任务的能力,但经过一番调查后,发现可以通过-hwaccel_device参数指定转码任务使用的GPU!

向不同GPU提交转码任务 ffmpeg -hwaccel cuvid -hwaccel_device 0 -c:v h264_cuvid -i -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y ffmpeg -hwaccel cuvid -hwaccel_device 1 -c:v h264_cuvid -i -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y -hwaccel_device N:指定某颗GPU执行转码任务,N为数字

ffmpeg添加字幕文件

1 字幕格式转换

ffmpeg -i "test_x.srt" "test_x.vtt"
ffmpeg -i "test_x.srt' 'test_x.ass"

2 添加软字幕

2.1 添加软字幕

ffmpeg -i 'xxx.mkv' -vf subtitles='xxx.srt' -c copy output.mkv

tips:软字幕只有部分容器格式比如(mkv)才支持,MP4/MOV等不支持,而且也只有部分播放器支持软字>幕或者外挂字幕(如VLC播放器)

2.2 添加硬字幕

ffmpeg -i 'xx.mp4' -vf subtitles='xx.srt' output.mp4 //有解码过程

添加字幕 理论上这样就ok了,可以加src lrc ass等字幕文件

但是,实际运用当中,下面这种就会报错

ffmpeg -i input.mp4 -vf subtitles= D:/字幕文件/subtitle.srt output.mp4 因为路径中出现了盘符 即D:这种,所以正确(能用)的写法应该是下面这样

ffmpeg -i input.mp4 -vf subtitles= /字幕文件/subtitle.srt output.mp4 但这种写法也只是勉强能用 需要字幕文件在同一硬盘中

所以最终方案如下

ffmpeg -i D:\项目\视频处理\mix\拼接\侧脸-于果.mp4 -i F:\音乐mv\歌曲\侧脸-于果.mp3 -vf subtitles='F:/音乐mv/歌曲/侧脸-于果.lrc' -y D:\项目\视频处理\mix\成品\侧脸-于果.mp4 可以看到视频路径 音频路径都是正常的路径 但是字幕路径需要是正斜杠/,而且必须用单引号引起来,而且要用反斜杠转义\

这个命令在cmd下就可以正常跑了,但在其他语音环境下,如python 需要再加一层反斜杠,即

cmdLine="ffmpeg -i D:\项目\视频处理\mix\拼接\侧脸-于果.mp4 -i F:\音乐mv\歌曲\侧脸-于果.mp3 -vf subtitles=\'F:/音乐mv/歌曲/侧脸-于果.lrc\' -y D:\项目\视频处理\mix/成品/侧脸-于果.mp4" subprocess.call(cmdLine, shell=True)