ffmpeg音频视频处理软件使用笔记

ffmpeg官网下载:
http://ffmpeg.org/download.html

下载官网编译好的windows静态版本,解压后bin目录下对应ffmpeg.exe,  ffplay.exe,  ffprobe.exe,然后将这个目录加入windows的环境变量里面。

针对网上乱七八槽的命令,本文的每一个命令都亲自操作过…

ffmpeg使用语法,命令格式:

ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
ffmpeg [[options][`-i’ input_file]]… {[options] output_file}…
1、参数选项:
(1) -an: 去掉音频
(2) -acodec: 音频选项, 一般后面加copy表示拷贝
(3) -vcodec:视频选项,一般后面加copy表示拷贝
2、格式:
(1) h264: 表示输出的是h264的视频裸流
(2) mp4: 表示输出的是mp4的视频
(3)mpegts: 表示ts视频流
如果没有输入文件,那么视音频捕捉(只在Linux下有效,因为Linux下把音视频设备当作文件句柄来处理)就会起作用。作为通用的规则,选项一般用于下一个特定的文件。如果你给 –b 64选项,改选会设置下一个视频速率。对于原始输入文件,格式选项可能是需要的。缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。

主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
-y 直接覆盖目标文件

视频参数:
-b 1000k 表示处理视频的比特率,用-vcodec copy时报错,使用其他工具获取到原始视频比特率后加到这里,保持比特率基本不变,不然默认为200k,视频有损。
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-acodec copy 表示保持音频不变
-an 不处理音频

水印参数:
格式: -vf  “movie….”
movie: 添加的水印图片;
scale:水印大小,水印长度*水印的高度;
overlay:水印的位置,距离屏幕左侧的距离*距离屏幕上侧的距离;mainW主视频宽度, mainH主视频高度,overlayW水印宽度,overlayH水印高度

左上角overlay参数为 overlay=0:0
右上角为 overlay= main_w-overlay_w:0
右下角为 overlay= main_w-overlay_w:main_h-overlay_h
左下角为 overlay=0: main_h-overlay_h
上面的0可以改为5,或10像素,以便多留出一些空白。

使用实例:

ffmpeg/ffprobe查看音频视频文件信息并输出为json格式,这是一个很实用的功能,特别是外部程序调用并处理音频视频信息时,下面显示x.mp4的视频信息。

ffprobe -v quiet -print_format json -show_format -show_streams ./x.mp4

#另一方法获取视频信息 , 不输出json

ffprobe  ./x.mp4

添加水印,命令格式,下面将./x.mp4左上触目位置加上./logo.png水印文件并输入为./test.mp4:

ffmpeg -y -i ./x.mp4 -acodec copy -vf "movie=./logo.png,scale= 46:46[watermask]; [in] [watermask] overlay=30:30[out]" ./test.mp4

在右下角加上水印

ffmpeg -y -i ./x.mp4 -acodec copy -vf "movie=./logo.png[logo]; [in] [logo] overlay=main_w-overlay_w-50:main_h-overlay_h-50[out]" ./test.mp4

视频帧数裁剪

ffmpeg -ss 00:00:10 -t 00:00:03 -y -i ./x.mp4 -vcodec copy -acodec copy ./test.mp4

说明:上面的这个例子是将x.mp4视频的前3秒,重新生成一个新视频。
-ss 开始时间,如: 00:00:10,表示从10秒开始,格式也可以00:00:0
-t 时长,如: 00:00:03,表示截取3秒长的视频,格式也可以00:00:3
-vcodec copy 和 -acodec copy表示所要使用的视频和音频的编码格式,这里指定为copy表示原样拷贝;

视频画面截取

ffmpeg -y -i ./x.mp4 -vf "crop=10:10:320:240" ./test.mp4

crop里的参数依次为:源视频左边距:源视频右边距:目标视频宽度:目标视频高度

ffmpeg缩放视频

改变为源视频一半大小

ffmpeg -y -i ./x.mp4 -vf scale=iw/2:ih/2 -acodec aac -vcodec h264 ./test.mp4

改变为原视频的30%大小:

ffmpeg -y -i ./x.mp4 -vf scale=iw*0.3:ih*0.3 -acodec aac -vcodec h264 ./test.mp4

另一种用法:假设原始视频尺寸是 1080p(即 1920×1080 px,16:9),使用下面命令可以缩小到 480p,命令如下:

ffmpeg -y -i ./x.mp4 -vf scale=853:480 -acodec aac -vcodec h264 ./test.mp4

有时出现以下现种错误,可以换一种命令语法解决

width not divisible by 2 (853x480)
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height


height not divisible by 2 (288x163)
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

各个参数的含义:
-vf  scale=853:480  vf 参数用于指定视频滤镜,其中 scale 表示缩放,后面的数字表示缩放至 853×480 px,其中的 853px 是计算而得,因为原始视频的宽高比为 16:9,所以为了让目标视频的高度为 480px,则宽度 = 480 x 9 / 16 = 853, scale=853:480 当中的宽度和高度实际应用场景中通常只需指定一个,比如指定高度为 480 或者 720,至于宽度则可以传入 “-1” 表示由原始视频的宽高比自动计算而得。即参数可以写为:scale=-1:480,当然也可以 scale=480:-1

-acodec aac 指定音频使用 aac 编码。因为 ffmpeg 的内置 aac 编码。
-vcodec h264 指定视频使用 h264 编码。注:目前手机一般视频拍摄的格式(封装格式、文件格式)为 mov 或者 mp4,这两者的音频编码都是 aac,视频都是 h264。

利用ffmpeg视频切片

主要把视频源切成若干个.ts格式的视频片段然后生成一个.m3u8的切片文件索引提供给html5的video做hls直播源

ffmpeg -y -i ./x.mp4 -strict -2 -vcodec h264 -acodec aac -f hls -hls_time 30 ./m3u8/test.m3u8

ffmpeg转化成HLS时附带的指令
-hls_time n:  设置每片的长度,默认值为2。单位为秒
-hls_list_size n:  设置播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5
-hls_wrap n:  设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0.这个选项能够避免在磁盘上存储过多的片,而且能够限制写入磁盘的最多的片的数量
-hls_start_number n:  设置播放列表中sequence number的值为number,默认值为0

然后,将生成好的m3u8文件和这多份ts,布署在WEB服务器就可以了。但不论是ngnix,还是在IIS,仅仅将上面这些文件拷到磁盘目录,是不行的,还要做MIME的映射,即将 .m3u8和 .ts 指定好类型:
application/x-mpegURL m3u8;
video/MP2T ts;

音量放大

用手机录视频时,经常遇见声音太少带噪音

ffmpeg -i ./x.mp4 -vol 300 ./test.mp4

-vol 300 表示300% 也就是3倍的意思 这个参数可以根据需要随意设置

视频转换

视频的格式有很多,以mp4和flv为例子,如下,FLV转MP4

ffmpeg -i ./x.flv -copyts -strict -2 ./test.mp4

本文更新待续中…

发布者

php程序员

我一个多年从事互联网开发的程序员,一个可怜的程序员。主要从事Linux, Apache/Nginx, PHP7, MySQL , Vsftpd, WebCDN, https部署, 海量图片服务器架设, 视频流媒体服务器架设,直播服务器架设….

发表评论