压缩视频之前,我们要了解原视频的详细信息,利用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
一般来说音频影响不大,重点说视频压缩: 压缩用到的参数: -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,而且还是很清楚!比市面上成品的压缩软件强太多!!!
如下图所示,越往左支持的选项越少,质量越低 实时通信领域采用baseline 流媒体领域 使用 main 超清视频 使用high -level:v 对编码器配置的限制,如下表 一般情况下1080P及以下视频选用4.1即可 -crf Constant Rate Factor 恒定速率因子模式,每一帧的画面都按照要求的视频质量计算需要的比特数,画质均衡,但是无法控制码率,也无法控制最终生成文件的大小。 适用于对于画质有要求,文件大小没有要求的情况,范围0-51,默认值就是23,数字越小质量越高
码率控制模式 fmmpeg支持3种码率控制模式 1. 体积最大 一般不使用这种模式,除非你想无损压制视频 无损压制视频的例子(快速编码)
无损压制视频的例子(高压缩比) 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 恒定比特率, 通常没有人使用 输入 其余还有-maxrate -minrate 选项,设置这两个选项就能达到ABR的效果 合并,提取视频提取视频流,假设我们提取mp4视频中的视频流
-an选项是 audio no 也就是忽略音频 提取音频
同理 -vn 即忽略音频 如果提取多个音轨的视频: 比如我们用ffprobe看到如下 提取第二条 只需加上-map 0:3 合并音视频
瞬间就能完成合并,因为音频和视频都是现成的,不用重新编码 -c 就是 -codec的简写 截取、连接音视频截取音视频
-ss 设置起始时间位移 -to 设置结束时间位移 也可以使用下面的方式
-t 设置截取时长 还有-sseof 选项 是以媒体末尾作为起点,可以配合-t截取末尾多少秒 看下面2条命令
调换-ss和-i的位置对结果的影响? -ss在前面会调用关键帧技术,可能导致截取的时间并不准确
我们可以加上 -copyts选项,作用是保留时间戳,这样就能正确截取了。 合并音视频方法一
当合并的几个视频参数一致时,很快就合并完成了。 合并不同参数的视频,操作会比较麻烦。 方法二上面的方法其实相当于把两个文件直接拼在一起,适用于mp2之类的视频,如果是flv连接处会有卡顿现象
下面的方法,先在一个txt文本中把要拼接的文件列出来。
这条命令只要是相同格式的视频均可以拼接
可以使用开源软件Avidemux,图形化界面,操作方便 截图、水印、动图截图
-vframe 指定截取的帧 加水印
制作GIF动图
录屏
默认录屏参数是下面这样的 清晰度相当不错,字符都很清楚,但是没有声音 -f 格式化 gdigrab 是ffmpeg的一个组件,用来捕获视频。 在windows系统中,ffmpeg自带的就是和默认使用的gdigrab,只能录制屏幕,不能录制声音 直播推荐使用OBS Studio,开源免费,功能强大 直播推流
作者:泥之天空 链接: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
其实还有-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以上吧。
|
|