https://ffmpeg.org/ffmpeg-all.html

window下ffmpeg的安装

  • 官网:http://ffmpeg.zeranoe.com/builds/ 下载完后把ffmpeg/bin/目录加入环境变量。
  • 打开cmd/cmder输入ffmpeg,有输出版本配置信息,说明安装成功

开始转码

文件输入输出

  • 首先我们需要了解ffmpeg的文件输入选项和输出选项是什么,这时我们可以选择一个短视频作为例子,比如博主喜欢的 百元之恋.mp4

  • 下载到本地目录并且使用命令行进入到对应目录后,就可以使用-i来指定ffmpeg的输入文件了(可以使用-h查看帮助),当然也需要指定一个输出文件
//我想将视频转为Matroska 格式(俗称 MKV 格式),那输出文件的后缀名就是 .mkv
ffmpeg -i 百元之恋.mp4 百円の恋.mkv

执行命令后,ffmpeg就开始了转码,如果电脑性能好点,视频不长,那么转码很快(废话)(好吧,例子视频169M转了15分钟,有点大,自行选择再小的视频),只要没出现红色的 ERROR ,一般就是没有问题地完成了。

指定编码器

FFmpeg 会自动判断输入文件的封装格式以及编码,并且根据输出文件的后缀名来判断其封装格式。同时, FFmpeg 也会根据该种封装格式的默认编码来决定输出文件的编码。

例如 mkv:
比如上小节中输出的视频为百円の恋.mkv,我们用ffmpeg -help muxer=matroska看看matroska(mkv)格式的默认编码:

Matroska 封装格式,通常的后缀名为 mkv ,MIME 为 video/x-matroska ,默认视频编码为 h264 ,默认音频编码为 vorbis ,默认字幕编码为 ass。

  • 使用 -vcodec 选项,可以指定视频编码
    如果需要把mkv的视频编码改为HEVC,高效率视频编码(High Efficiency Video Coding,简称HEVC),又称为H.265。

    ffmpeg -i 百元之恋.mp4 -vcodec hevc 百円の恋.mkv

    这回的等待时间可能就长一些了,因为 HEVC 是一个压缩比更高的编码,需要的时间也长

  • 使用 -acodec 选项,可以指定音频编码
    如果我想要以 Matroska 作为封装格式, HEVC 作为视频编码, Opus 作为音频编码

    ffmpeg -i 百元之恋.mp4 -vcodec hevc -acodec opus 百円の恋.mkv
  • 使用copy拷贝媒体流到输出文件
    也就是只转换一下封装格式,在编码器的位置上写 copy即可
    ffmpeg -i 百元之恋.mp4 -vcodec copy -acodec copy 百円の恋.mkv
    或者
    ffmpeg -i 百元之恋.mp4 -c:v copy -c:a copy 百円の恋.mkv
    或者
    ffmpeg -i 百元之恋.mp4 -c 百円の恋.mkv

-vcodec 有一个缩写叫做 -c:v , -acodec 有一个缩写叫做 -c:a

说说编码

AAC

是一种被十分广泛使用的音频编码,也是 MP4 封装格式的默认音频编码

HEVC/H.265

高效率视频编码(High Efficiency Video Coding,简称HEVC),又称为H.265

AVC/H.264

从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准里称为H.264,在MPEG的标准里是MPEG-4的一个组成部分–MPEG-4 Part 10,又叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC

YUV

YUV是一种颜色空间,基于YUV的颜色编码是流媒体的常用编码方式。Y表示流明,U、V表示色度、浓度,这种表达方式起初是为了彩色电视与黑白电视之间的信号兼容。 对于图像每一点,Y确定其亮度,UV确认其彩度。
YUV颜色编码解析

查看ffmpeg运行过程中的输出信息

转码输出信息

frame=22433 fps= 32 q=-1.0 Lsize=  212201kB time=00:15:35.65 bitrate=1857.9kbits/s speed=1.34x
  • frame= 22433 是转码所进行到的帧数,显示 22433 就表示现在已经转到了第 22433 帧
  • fps=32 中的 FPS 就是 Frame per Second ,也就是现在电脑每秒所处理的帧的数量
  • q 质量因子
  • size= 212201kB 表示现在已经转换出来的视频的体积
  • time 转换时间
  • bitrate 码率即失真度,也叫比特率,码率越高越清晰,反之则画面粗糙而多马赛克
  • speed 编码速度

oneindex视频例子

前面原理都讲差不多了,结合前一章oneindex视频编码问题,看看怎么转码:

要求

视频编码H264,且音频编码AAC、MP3,正常播放

转码

//查看视频信息
ffmpeg -i xxxx.xxx
//按要求转码
ffmpeg -i 输入视频 -c:v h264 -c:a AAC xxx.mp4

烧字幕

ffmpeg -i 输入视频 -i 字幕文件 -c:v h264 -c:a copy -c:s srt xxx.mkv
或者
ffmpeg -i 输入视频 -c:v h264 -c:a copy -vf subtitles=字幕文件  xxx.mkv

切换视频音轨

//0:v 视频通常是第0个
//0:a:2 声音第三个,从0开头
//0:s:2 字幕第三个,从0开头
ffmpeg -i 输入视频 -map 0:v -map 0:a:2 -map 0:s:2 xxxx.mkv

参考:
https://blog.csdn.net/qq_34771252/article/details/90207617
https://github.com/FiveYellowMice/how-to-convert-videos-with-ffmpeg-zh/blob/master/05-start-converting.md
https://github.com/phoboslab/jsmpeg