分享

如何用ffmpeg压缩视频

 不知道3333e 2023-07-10 发布于广东

 压缩视频之前,我们要了解原视频的详细信息,利用MediaInfo可以查看视频的详细信息; 也可运行 ffmpeg -i video.mp4 -hide_banner

视频尺寸:指的就是视频的分辨率,常见的分辨率有4096*2304,1920*1080,720*576等。

视频编码:视频编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式。视频编码格式常见到的有:MPEG-2 TS、Divx、Xvid、H.264、WMV-HD和VC-1。

音频编码:音频编码方式指通过特定的压缩技术对音频数据进行处理的方法。

帧率:帧率(即视频更新率)是用于测量显示帧数的量度。测量单位为“每秒显示帧数”(Frame Per Second,FPS,帧率)或“赫兹”,单位用FPS用来描述视频每秒播放多少帧,而单位用赫兹用来描述显示器的画面每秒更新多少次。 一般帧率越高,视频画面越流畅。

比特率:指每秒传送的比特(bit)数,即每秒传输的文件大小。比特率规定使用“比特每秒”(bit/s 或 bps)为单位。比特率越高,每秒传送的数据越大。

采样率:采样率的单位是Hz,表示每秒采样的次数。单位时间内取样率越大,精度就越高,处理过的视频文件就越接近没有处理过的视频文件。

码率:码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。码率与体积成正比:码率越大,体积越大;码率越小,体积越小。由于文件体积与取样率是成正比的,所以几乎所有的编码格式都想用最低的码率达到最少的失真,“码率”就是失真度,码率越高越清晰,反之则画面粗糙而且马赛克多。

视频部分的位深度:用于指定图像中的每个像素可以使用的颜色信息数量,用“位即bit”为单位。

音频部分的位深度:单个声道的采样数据大小

可选视频编码方案

1. MP4封装:H264视频编码+AAC音频编码(最通用)

2. WebM封装: VP8视频编码+Vorbis音频编码(Google为了避开专利开发,无明显优势)

3. OGG封装: Theora视频编码 +Vorvis音频编码(完全开源的编码方式,无专利,HTML5可用)

音频转码

例子 flac转mp3

ffmpeg -i input.flac -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3

  • -acodec 输入编码器,不输入也可以,ffmpeg会自动根据后缀名选择编码器
  • -ar rate 指定采样频率,不指定采样频率会根据输入音视频的采样频率
  • -ab audio byte rates 指定比特率,如果不输入默认是128K,这点就有点坑了。128K作为视频的音轨比较合适,但是这个音质作为单纯的音频来说还是基本上是最低音质,平时我们在手机里听听的水平。
  • -ac audio channel 指定声道数

一般来说音频影响不大,重点说视频压缩:

压缩用到的参数: -i 输入文件的路径或者url; -s 设置输出文件的分辨率,wxh; -b:v 输出文件的码率,一般500k左右即可,人眼看不到明显的闪烁,这个是与视频大小最直接相关的;

ffmpeg -i target.m4v -b:v 400k -s 960x540 dst.mp4

将一个叫target.m4v的视频转换成mp4格式,设置输出视频的分辨率为960x540,码率为400k。

这就是最基本的用法了,这个软件是非常强大的,视频频也是可以转换,剪切、截图的,音频也一样,而且还可以分离音视频。

压缩完成之后,视频大小变为原来的1/4,而且还是很清楚!比市面上成品的压缩软件强太多!!!

ffmpeg -i in.webm -s 1920*1080 -pix_format yuv420p -vcodec libx264 -preset medium -profile:v high -level:v -crf 23

  • -s size 指定视频尺寸进行缩放
  • -pix_format 指定视频使用的颜色空间 ,输入ffmpeg -pix_fmts可以打印出所有支持的选项。我就知道两个YUV和RGB,YUV表示明亮度,色度和浓度,因为人的色觉对亮度的敏感程度要高一些,所以网络视频通常会对色度层面进行压缩。也就是所谓的yuv420p。Y保留全部UV进行压缩
  • -vcodex 指定视频编码器,建议使用libx264
  • -preset 对编码器的预设,精度越高编码速度越慢,占用cpu性能越高,默认是medium 有以下几个选项 1. ultrafast 2. superfast 3. veryfast 4. faster 5. fast 6. medium 7. slow 8. slower 9. veryslow 10. placebo 通常我们在网络上发布视频,会使用veryfast选项。较快,消耗性能少,对播放器的要求也低,缺点是生成的视频会大一些 压制视频的时候,一般采用veryslow选项。
  • -profile:v 指定编码器配置,主要和压缩比有关。

如下图所示,越往左支持的选项越少,质量越低

实时通信领域采用baseline

流媒体领域 使用 main

超清视频 使用high

-level:v 对编码器配置的限制,如下表

一般情况下1080P及以下视频选用4.1即可

-crf Constant Rate Factor 恒定速率因子模式,每一帧的画面都按照要求的视频质量计算需要的比特数,画质均衡,但是无法控制码率,也无法控制最终生成文件的大小。 适用于对于画质有要求,文件大小没有要求的情况,范围0-51,默认值就是23,数字越小质量越高

  • -r 设置视频帧率
  • -b:a 同 -ab 设置音频比特率,大多数视频网站的音频比特率都是128K或者192K

码率控制模式

fmmpeg支持3种码率控制模式

1. -qp 恒定量化器模式,量化器就是用算法将每一帧的质量转化为数字,可以设置,建议让软件自动设置。

体积最大

一般不使用这种模式,除非你想无损压制视频

无损压制视频的例子(快速编码)

ffmpeg -i input -vcodec libx264 -preset ultrafast -qp 0 output.mkv

无损压制视频的例子(高压缩比)

ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 output.mkv

尝试了用这种无损压缩方式压缩dvd镜像中提取的vob文件,发现这种方式压制出来的文件体积竟然是原来的两倍。所以说还是使用crf 18,这样就比较接近无损了。

2. -crf 恒定速率因子模式,相当于浮动值的qp模式,会给每个画面不同的量化值,比如说把人眼不敏感的部分码率调低。一般压制视频使用这个选项。但是不懂不推荐乱设置,让软件自动配置即可 值的范围是0-51,默认值是23,通常认为crf值18压制出来的视频视觉上是无损的。18-23之间的变化不明显。

3. -b 固定目标码率模式,当上传视频网站有码率限制时,可以使用这个选项。但是不推荐。crf也可以获得合适的体积和画质。没必要

使用上面3个选项压制,都是单遍编码,最好加上-preset veryslow 选项,这样软件对参数的控制会更精准

比特率模式

VBR 动态比特率,ffmpeg默认采用,简单的内容少给码率,复杂内容多给码率。

ABR 平均比特率,网络视频会采用这一格式,因为VBR码率变化太大,不适用网络传输

CBR 恒定比特率, 通常没有人使用

输入 ffmpeg -h encoder=libx264 查看最常用的x264编码器的使用方式 -nal-hrd 可以指定VBR和CBR两种,但是CBR在.mp4不支持?

其余还有-maxrate -minrate 选项,设置这两个选项就能达到ABR的效果

合并,提取视频

提取视频流,

假设我们提取mp4视频中的视频流

ffmpeg -i in.mp4 -vcodec copy -an v.mp4

-an选项是 audio no 也就是忽略音频

提取音频

ffmpeg -i in.mp4 -acodec copy -vn a.m4a

同理 -vn 即忽略音频

如果提取多个音轨的视频:

比如我们用ffprobe看到如下

提取第二条 只需加上-map 0:3

合并音视频

ffmpeg -i a.m4a -i v.mp4 -c copy out.mp4

瞬间就能完成合并,因为音频和视频都是现成的,不用重新编码

-c 就是 -codec的简写

截取、连接音视频

截取音视频

ffmpeg -i in.mp3 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp3

-ss 设置起始时间位移

-to 设置结束时间位移

也可以使用下面的方式

ffmpeg -i in.mp3 -ss 00:01:00 -t 10 -acodec copy out.mp3

-t 设置截取时长

还有-sseof 选项 是以媒体末尾作为起点,可以配合-t截取末尾多少秒

看下面2条命令

ffmpeg -i in.mp4 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp4

ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -acodec copy out.mp4

调换-ss和-i的位置对结果的影响?

-ss在前面会调用关键帧技术,可能导致截取的时间并不准确

ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -acodec copy -copyts out.mp4

我们可以加上 -copyts选项,作用是保留时间戳,这样就能正确截取了。

合并音视频

方法一

ffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy out.mp4

当合并的几个视频参数一致时,很快就合并完成了。

合并不同参数的视频,操作会比较麻烦。

方法二

上面的方法其实相当于把两个文件直接拼在一起,适用于mp2之类的视频,如果是flv连接处会有卡顿现象 下面的方法,先在一个txt文本中把要拼接的文件列出来。 这条命令只要是相同格式的视频均可以拼接 ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4 -safe 命令是让ffmpeg无视安全问题报错 在txt文件中的格式需要是这样子

file 'file1.mp4' file 'file2.mp4'

可以使用开源软件Avidemux,图形化界面,操作方便

截图、水印、动图

截图

ffmpeg -i in.mp4 -ss 5 -vframes 1 img.jpg

-vframe 指定截取的帧

加水印

ffmpeg -i in.mp4 -i logo.png -filter_complex "overlay=20:20"

-filter_complex 添加滤镜 overlay20:20 指的是,离左边20像素,离上边20像素

制作GIF动图

ffmpeg -i in.mp4 -ss 4.5 -to 8.5 -s 640*320 -r 15 out.gif

录屏

ffmpeg -f gdigrab -i desktop rec.mp4

默认录屏参数是下面这样的

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\rec.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf58.24.101 Duration: 00:00:04.11, start: 0.000000, bitrate: 676 kb/s Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 2560x1440, 672 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default) Metadata: handler_name : VideoHandler

清晰度相当不错,字符都很清楚,但是没有声音

-f 格式化 gdigrab 是ffmpeg的一个组件,用来捕获视频。 在windows系统中,ffmpeg自带的就是和默认使用的gdigrab,只能录制屏幕,不能录制声音

直播推荐使用OBS Studio,开源免费,功能强大

直播推流

ffmpeg -re -i rec.mp4 按网站要求输入想要的编码 -f flv rtmp地址

作者:泥之天空 链接:https://www.jianshu.com/p/fa857f004409 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

详细参数:

Print help / information / capabilities:

-h -- print basic options

-h long -- print more options

-h full -- print all options (including all format and codec specific options, very long)

-h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter

See man ffmpeg for detailed description of the options.

-L show license

-h topic show help

-? topic show help

-help topic show help

--help topic show help

-version show version

-buildconf show build configuration

-formats show available formats

-muxers show available muxers

-demuxers show available demuxers

-devices show available devices

-codecs show available codecs

-decoders show available decoders

-encoders show available encoders

-bsfs show available bit stream filters

-protocols show available protocols

-filters show available filters

-pix_fmts show available pixel formats

-layouts show standard channel layouts

-sample_fmts show available audio sample formats

-colors show available color names

-sources device list sources of the input device

-sinks device list sinks of the output device

-hwaccels show available HW acceleration methods

Global options (affect whole program instead of just one file:

-loglevel loglevel set logging level

-v loglevel set logging level

-report generate a report

-max_alloc bytes set maximum size of a single allocated block

-y overwrite output files

-n never overwrite output files

-ignore_unknown Ignore unknown stream types

-filter_threads number of non-complex filter threads

-filter_complex_threads number of threads for -filter_complex

-stats print progress report during encoding

-max_error_rate maximum error rate ratio of errors (0.0: no errors, 1.0: 100% e rrors) above which ffmpeg returns an error instead of success.

-bits_per_raw_sample number set the number of bits per raw sample

-vol volume change audio volume (256=normal)

Per-file main options:

-f fmt force format

-c codec codec name

-codec codec codec name

-pre preset preset name

-map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile

-t duration record or transcode "duration" seconds of audio/video

-to time_stop record or transcode stop time

-fs limit_size set the limit file size in bytes

-ss time_off set the start time offset

-sseof time_off set the start time offset relative to EOF

-seek_timestamp enable/disable seeking by timestamp with -ss

-timestamp time set the recording timestamp ('now' to set the current time)

-metadata string=string add metadata

-program title=string:st=number... add program with specified streams

-target type specify target file type ("vcd", "svcd", "dvd", "dv" or "dv5 0" with optional prefixes "pal-", "ntsc-" or "film-")

-apad audio pad

-frames number set the number of frames to output

-filter filter_graph set stream filtergraph

-filter_script filename read stream filtergraph description from a file

-reinit_filter reinit filtergraph on input parameter changes

-discard discard

-disposition disposition

Video options:

-vframes number set the number of video frames to output

-r rate set frame rate (Hz value, fraction or abbreviation)

-s size set frame size (WxH or abbreviation)

-aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)

-bits_per_raw_sample number set the number of bits per raw sample

-vn disable video

-vcodec codec force video codec ('copy' to copy stream)

-timecode hh:mm:ss[:;.]ff set initial TimeCode value.

-pass n select the pass number (1 to 3)

-vf filter_graph set video filters

-ab bitrate audio bitrate (please use -b:a)

-b bitrate video bitrate (please use -b:v)

-dn disable data

Audio options:

-aframes number set the number of audio frames to output

-aq quality set audio quality (codec-specific)

-ar rate set audio sampling rate (in Hz)

-ac channels set number of audio channels

-an disable audio

-acodec codec force audio codec ('copy' to copy stream)

-vol volume change audio volume (256=normal)

-af filter_graph set audio filters

Subtitle options:

-s size set frame size (WxH or abbreviation)

-sn disable subtitle

-scodec codec force subtitle codec ('copy' to copy stream)

-stag fourcc/tag force subtitle tag/fourcc

-fix_sub_duration fix subtitles duration

-canvas_size size set canvas size (WxH or abbreviation)

-spre preset set the subtitle options to the indicated preset

————————————————

版权声明:本文为CSDN博主「SHUIPING_YANG」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zhezhebie/java/article/details/79263492

https://segmentfault.com/a/1190000002502526

ffmpeg -i MVI_7274.MOV -vcodec libx264 -preset fast -crf 20 -y -vf "scale=1920:-1" -acodec libmp3lame -ab 128k a.mp4

-preset:指定编码的配置。x264编码算法有很多可供配置的参数,不同的参数值会导致编码的速度大相径庭,甚至可能影响质量。为了免去用户了解算法,然后手工配置参数的麻烦。x264提供了一些预设值,而这些预设值可以通过preset指定。这些预设值有包括:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast编码速度最快,但压缩率低,生成的文件更大,placebo则正好相反。x264所取的默认值为medium。需要说明的是,preset主要是影响编码的速度,并不会很大的影响编码出来的结果的质量。压缩高清电影时,我一般用slow或者slower,当你的机器性能很好时也可以使用veryslow,不过一般并不会带来很大的好处。

-crf:这是最重要的一个选项,用于指定输出视频的质量,取值范围是0-51,默认值为23,数字越小输出视频的质量越高。这个选项会直接影响到输出视频的码率。一般来说,压制480p我会用20左右,压制720p我会用16-18,1080p我没尝试过。个人觉得,一般情况下没有必要低于16。最好的办法是大家可以多尝试几个值,每个都压几分钟,看看最后的输出质量和文件大小,自己再按需选择。

其实还有-b 1024k这样的参数,但是我发现-crf设置上后-b就不管用了。根据我自己的简单尝试,压制5D2拍摄的一段18秒1920x1080的视频(下午自然光、图像简单、大面积白墙、只有一扇黑门)crf和压出来的文件大小关系如下:

crf 文件大小

16 54M

18 39M

20 25M

22 17M

24 11M

26 7.3M

28 5.0M

30 3.6M

32 2.7M

默认 14M(crf为23)

又比较了一下crf在20、28、32时的视频质量,发现32还是能看出质量下降的,20的确非常精细,但28跟20之间的差别并不是那么大,crf值设置在26-28之间比较好。如果对尺寸有要求,什么都不设,用默认的也行(可能是31)。

另外,关于preset,slow和fast只跟运行时间有关,slow跑的时间比fast长不少,slow出来的mp4文件会小一些(12M),fast出来的文件会大一些(14M),但视频质量的差距并不明显。

如果把原视频尺寸从1920x1080缩小到960x540,则视频尺寸变为了:

crf 文件大小

16 11M

18 6.7M

20 4.4M

22 3.0M

24 2.1M

26 1.6M

28 1.3M

30 1.1M

32 893K

默认 2.5M(crf为23)

综上,对质量要求较高时,选22以下;对尺寸要求非常高时,选26(但质量确实是会稍差一些),否则选24的性价比比较高(或者默认的23也行),如果对尺寸实在要求非常非常高,那就28以上吧。

后记补充(来自@gghyoo) 可以用-threads n 来实施多线程的运算,充分利用多核cpu 例子如下: ffmpeg -threads 2 -crf 20 -y -i ML-02.avi -strict experimental ML-02.mp4

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多