ffmpeg常用命令

ffmpeg常用命令

ffmpeg是 Fast Forward MPEG (Motion Picture Experts Group) 的缩写,见这里

视频的本质

视频的本质,是连续显示的图片。

小时候看的连环画,只要快速翻动,就会看到画面动起来
连环画.gif

快速翻动多张小黄鸭图片,就能看到小黄鸭在动

当多张图片之间的差别很小,图片够多,翻动的速度够快(即每秒钟翻动的页数够多)时,我们就能看到动起来的画面,这就是视频的原理。

而最初的电影,也是使用胶片记录,播放的时候用强光照射胶片,经放大后投影到电影幕布上,同时胶片不断的卷动,当卷动的速度够快时(一般每秒24张),这样我们在幕布上看到的画面就是连续流畅的会动的画面。
电影胶卷

现在我们说“剪片”或“剪辑”,通常都是用剪辑软件来对视频进行剪辑,而以前的胶片电影,那可是真的是拿剪刀剪的,所以为什么现在叫“剪辑”,也是这个意思。

数字时代的电影,已经不需要胶片,只需要以二进制的方式存成一个文件即可,比如我们常的mp4格式。但视频的本质没有变,它还是由一张一张的静止图片合成的,我们每一张图片,叫“一帧(frames)”,但是,如果真的把这些图片一张一张合成一个视频,那么视频的体积将会非常巨大,所以需要压缩,事实上我们看的视频都是压缩过的,因为很多时候,相邻图片大部分都是相同的,存储这么多非常类似的图片,是对硬盘空间的巨大浪费。

我们一般把前面说的“压缩”称为“编码”(比如最常见的h.264编码),而播放过程就是把编码后的视频解码还原出来。

视频的分辨率其实就是组成这个视频的图片的分辨率,比如视频分辨率是1920⨉1080,意思是组成这个视频的每张图片,横向有1920个像素,纵向有1080个像素,对于图片来说,每张图片的分辨率越大,它就越清晰,由此可见,组成一个视频的图片分辨率越高,视频就越清晰,也就是说,一个视频的分辨率越高就越清晰(但这不是绝对的,下面会说到分辨率越高,清晰度反而越低的情况)。

前面说过,胶片电影的播放是靠每秒钟卷动一定数量的胶片来让画面达到“会动”的效果,一般来说,要一秒16张就可以达到让我们看起来画面是运动的,当然再多一点,画面就会更细腻,对于胶片电影,一般一秒钟24张。我们称一个视频每秒钟播放的图片数量为该视频的“帧率(frame-rate)”。常见的帧率有24000/1001=23.976, 30000/1001=29.970, 60000/1001=59.940, 25.000, 50.000等等。这个数字是一秒钟内闪过的图像的数量。比如23.976,就是1001秒内,有24000张图像。视频的帧率是可以是恒定的(cfr:Const Frame-Rate),也可以是变化的(vfr:Variable Frame-Rate)。

帧率决定一个视频的流畅度,试想一下,我们把一本100页的连环画,每隔一页撕掉一页,那么每两页之间的画面变动就比较大,视觉上就是画面跳动大,不连贯,不流畅。

码率,即比特率(bit-rate),每秒钟播放多少比特(bit),对于生成一个视频(摄影机或者剪辑软件),表示每秒种会产生多少比特的数据。

现在我们来解释,为什么分辨率越高,视频反而越不清晰的情况。这种情况会在码率固定、帧率固定,而单独提高分辨率时发生。帧率固定,代表每秒钟要播放的图片数量是固定的(比如是24),码率固定表示生成一个视频时,每秒钟生成的文件体积是固定的,但是,如果我们提高每张图片的分辨率,很显然每秒24张分辨率更高的图片生成的文件体积更大,但现在我们却不能增加每秒钟生成的文件体积(不能增加码率),怎么办?

办法就是采样!由于每张图片分辨率变大,它本身的体积已经变大,完整保存每张图片肯定会导致码率变大,我们只能抽取每张图片里的一部分像素(这部分像素也能让你看清这个图片),这就是采样,毫无疑问,视频清晰度取决于从每张图片中抽取的像素数量(我们叫采样率),当一张图片的分辨率越高,代表它的像素越多,而我们能抽取的像素量却有限,所以,图片分辨率越高会导致采样率越低,这样的后果就是这张图片越不清晰,而我们知道,播放视频就是连续播放图片,既然你每张图片都不清晰,那表现出来就是这个视频不清晰,这就是为什么“分辨率越高,视频反而越不清晰”,因为这是被码率限制了,如果我们不限制码率,那么肯定是分辨率越高,视频就越清晰了。


一些参数解释

codeccoder-decoder的缩写,coder:编码器,decoder:解码器,合起来就是:编码解码器。

b:一般表示bitrate(比特率),v一般代表video(即视频),a代表audio(即音频),比如:

  • -codec:vv代表“video”,用于指定视频编码格式,可简写为c:v,另一种写法是-vcodec
  • -codec:aa代表“audio”,用于指定音频编码格式,可简写为c:a,另一种写法是-acodec
  • b:vb代表“bitrate”(即比特率),v代表“video”,用于指定视频编码格式;
  • b:ab代表“bitrate”(即比特率),a代表“audio”,用于指定音频编码格式;
  • -vbsf:已经弃用,现在一般写成-bsf:v,用于指定视频比特流过滤器,用ffmpeg -bsfs可查看所有支持的比特流过滤器;
  • -absf:已经弃用,现在一般写成-bsf:a,用于指定音频比特流过滤器,用ffmpeg -bsfs可查看所有支持的比特流过滤器;

比如,以下参数就是指定视频编码(-c:v)为libx264,音频编码(-c:a)为aac,音频比特率(-b:a)为64k

-c:v libx264 -c:a aac -b:a 64k

一些使用实例

把当前目录下的所有m4a文件转成mp3

for foo in *.m4a; do ffmpeg -i "foo" -acodec libmp3lame -aq 2 "{foo%.m4a}.mp3"; done

flac转320kbps音质的mp3(最高音质的mp3)

ffmpeg -i input.flac -ab 320k -map_metadata 0 -id3v2_version 3 output.mp3

压缩视频

ffmpeg -i /Users/bruce/Downloads/sample.mp4  -vcodec libx264 -preset fast -crf 28 -y -vf "scale=640:-1"  a.mp4

scale=640:-1 表示等比例缩放,宽缩放为640,高为-1表示自动根据比例缩放。


压缩当前目录下所有mp4文件

for foo in *.mp4; do ffmpeg -i "foo" "{foo%}_optimized.mp4"; done

任何格式转h.264 mp4格式

ffmpeg -i IMG_1310.MOV -vcodec libx264 -y IMG_1310.mp4

从当前目录下的所有mkv视频中提取mp3

for i in *.mkv; do ffmpeg -i "i" -b:a 320k -vn -f mp3 "{i%.mkv}.mp3"; done

切割视频并转码(-ss为截取起始时间,-t为截取的长度,-i是input)

ffmpeg -ss 00:33:45 -t 00:00:42 -i /path/to/input.mp4 -c:v libx264 -c:a aac -b:a 64k /path/to/output.mp4

只指定起始时间(格式:时时:分分:秒秒),不指定长度,表示截取到末尾,不指定编码(默认应该是用原来的编码)

ffmpeg -ss 00:33:45 -i /path/to/input.mp4 /path/to/output.mp4

把多个mp4视频合并成一个

#先进入要合并的视频所在目录,然后把所有视频按顺序,转成1.ts、2.ts、…、n.ts
ffmpeg -i 挖掘机麦克斯第1集.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 挖掘机麦克斯第2集.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 挖掘机麦克斯第3集.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 3.ts

#再合成ts文件
ffmpeg -i "concat:1.ts|2.ts|3.ts" -acodec copy -vcodec copy -absf aac_adtstoasc 挖掘机麦克斯1-3集合并.mp4

批量生成转换合并命令

<?php
    /**
     * Created by PhpStorm.
     * User: Bruce Xie
     * Date: 2021-02-09
     * Time: 14:38
     */

    mergedName = '小猪佩奇第一季52集合并';concatArr = [];
    cmdArr = [];
    for(i = 1; i <= 52;i++){
        num =i<10 ? '0'.i :i;
        cmdArr[] = 'ffmpeg -i '.num.'.小猪佩奇S01E'.num.'.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb '.num.'.ts';
        concatArr[] =num . '.ts';
    }
    cmdStr = join(" &&\n",cmdArr);
    concatStr = join('|',concatArr);
    mergeCmd = 'ffmpeg -i "concat:'.concatStr.'" -acodec copy -vcodec copy -absf aac_adtstoasc '.mergedName.'.mp4';contentToCopy = cmdStr . " &&\n" .mergeCmd;

    clipboard = PHP_OS=='Darwin' ? 'pbcopy' : (PHP_OS=='WINNT' ? 'clip' : 'xclip -selection clipboard');command = "echo '{contentToCopy}' | {clipboard}";
    shell_exec($command);
    echo 'Done! 请直接到终端中粘贴并回车运行!';

输出结果如下

ffmpeg -i 01.小猪佩奇S01E01.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 01.ts &&
ffmpeg -i 02.小猪佩奇S01E02.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 02.ts &&
ffmpeg -i 03.小猪佩奇S01E03.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 03.ts &&
ffmpeg -i 04.小猪佩奇S01E04.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 04.ts &&
ffmpeg -i 05.小猪佩奇S01E05.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 05.ts &&
ffmpeg -i 06.小猪佩奇S01E06.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 06.ts &&
ffmpeg -i 07.小猪佩奇S01E07.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 07.ts &&
ffmpeg -i 08.小猪佩奇S01E08.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 08.ts &&
ffmpeg -i 09.小猪佩奇S01E09.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 09.ts &&
ffmpeg -i 10.小猪佩奇S01E10.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 10.ts &&
ffmpeg -i 11.小猪佩奇S01E11.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 11.ts &&
ffmpeg -i 12.小猪佩奇S01E12.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 12.ts &&
ffmpeg -i 13.小猪佩奇S01E13.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 13.ts &&
ffmpeg -i 14.小猪佩奇S01E14.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 14.ts &&
ffmpeg -i 15.小猪佩奇S01E15.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 15.ts &&
ffmpeg -i 16.小猪佩奇S01E16.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 16.ts &&
ffmpeg -i 17.小猪佩奇S01E17.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 17.ts &&
ffmpeg -i 18.小猪佩奇S01E18.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 18.ts &&
ffmpeg -i 19.小猪佩奇S01E19.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 19.ts &&
ffmpeg -i 20.小猪佩奇S01E20.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 20.ts &&
ffmpeg -i 21.小猪佩奇S01E21.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 21.ts &&
ffmpeg -i 22.小猪佩奇S01E22.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 22.ts &&
ffmpeg -i 23.小猪佩奇S01E23.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 23.ts &&
ffmpeg -i 24.小猪佩奇S01E24.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 24.ts &&
ffmpeg -i 25.小猪佩奇S01E25.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 25.ts &&
ffmpeg -i 26.小猪佩奇S01E26.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 26.ts &&
ffmpeg -i 27.小猪佩奇S01E27.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 27.ts &&
ffmpeg -i 28.小猪佩奇S01E28.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 28.ts &&
ffmpeg -i 29.小猪佩奇S01E29.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 29.ts &&
ffmpeg -i 30.小猪佩奇S01E30.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 30.ts &&
ffmpeg -i 31.小猪佩奇S01E31.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 31.ts &&
ffmpeg -i 32.小猪佩奇S01E32.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 32.ts &&
ffmpeg -i 33.小猪佩奇S01E33.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 33.ts &&
ffmpeg -i 34.小猪佩奇S01E34.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 34.ts &&
ffmpeg -i 35.小猪佩奇S01E35.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 35.ts &&
ffmpeg -i 36.小猪佩奇S01E36.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 36.ts &&
ffmpeg -i 37.小猪佩奇S01E37.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 37.ts &&
ffmpeg -i 38.小猪佩奇S01E38.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 38.ts &&
ffmpeg -i 39.小猪佩奇S01E39.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 39.ts &&
ffmpeg -i 40.小猪佩奇S01E40.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 40.ts &&
ffmpeg -i 41.小猪佩奇S01E41.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 41.ts &&
ffmpeg -i 42.小猪佩奇S01E42.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 42.ts &&
ffmpeg -i 43.小猪佩奇S01E43.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 43.ts &&
ffmpeg -i 44.小猪佩奇S01E44.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 44.ts &&
ffmpeg -i 45.小猪佩奇S01E45.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 45.ts &&
ffmpeg -i 46.小猪佩奇S01E46.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 46.ts &&
ffmpeg -i 47.小猪佩奇S01E47.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 47.ts &&
ffmpeg -i 48.小猪佩奇S01E48.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 48.ts &&
ffmpeg -i 49.小猪佩奇S01E49.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 49.ts &&
ffmpeg -i 50.小猪佩奇S01E50.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 50.ts &&
ffmpeg -i 51.小猪佩奇S01E51.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 51.ts &&
ffmpeg -i 52.小猪佩奇S01E52.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 52.ts &&
ffmpeg -i "concat:01.ts|02.ts|03.ts|04.ts|05.ts|06.ts|07.ts|08.ts|09.ts|10.ts|11.ts|12.ts|13.ts|14.ts|15.ts|16.ts|17.ts|18.ts|19.ts|20.ts|21.ts|22.ts|23.ts|24.ts|25.ts|26.ts|27.ts|28.ts|29.ts|30.ts|31.ts|32.ts|33.ts|34.ts|35.ts|36.ts|37.ts|38.ts|39.ts|40.ts|41.ts|42.ts|43.ts|44.ts|45.ts|46.ts|47.ts|48.ts|49.ts|50.ts|51.ts|52.ts" -acodec copy -vcodec copy -absf aac_adtstoasc 小猪佩奇第一季52集合并.mp4

参考:ffmpeg中文文档

打赏
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

ffmpeg常用命令