压缩视频之前,我们要了解原视频的详细信息,利用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
一般来说音频影响不大,重点说视频压缩:
压缩用到的参数: -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
ffmpeg -pix_fmts
可以打印出所有支持的选项。我就知道两个YUV和RGB,YUV表示明亮度,色度和浓度,因为人的色觉对亮度的敏感程度要高一些,所以网络视频通常会对色度层面进行压缩。也就是所谓的yuv420p。Y保留全部UV进行压缩如下图所示,越往左支持的选项越少,质量越低
实时通信领域采用baseline
流媒体领域 使用 main
超清视频 使用high
-level:v 对编码器配置的限制,如下表
一般情况下1080P及以下视频选用4.1即可
-crf Constant Rate Factor 恒定速率因子模式,每一帧的画面都按照要求的视频质量计算需要的比特数,画质均衡,但是无法控制码率,也无法控制最终生成文件的大小。 适用于对于画质有要求,文件大小没有要求的情况,范围0-51,默认值就是23,数字越小质量越高
码率控制模式
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像素
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
联系客服