赞
踩
2019.06.25
第六章 FFmpeg滤镜使用( 6.6 至结束)
FFmpeg可以获取到音频的音量分贝、音频相关信息等,使用滤镜volumedetect获得
ffmpeg -i output.wav -filter_complex volumedetect -c:v copy -f null /dev/null
上图中,获得的音频的平均大小mean_volume: -55.5 dB
声音分贝增大,波形波动越强烈,可以通过showwavespic滤镜来绘制音频的波形图
ffmpeg -i output.wav -filter_complex "showwavespic=s=640*120" -frames:v 1 output.png
如果希望看到每个声道的音频的波形图,可以使用showwavepic和split_channels滤镜配合
ffmpeg -i test.wav -filter_complex "showwavespic=s=640*120:split_channels=1" -frames:v 1 output2.png
添加字幕方式大致分为两种:
将字幕编码进视频流中,与视频加水印相似
在封装容器中加入视频流
知识点:ASS字幕和SRT字幕的区别
1、功能不同
SRT字幕是简单的纯文本字幕,无法使用其他高级功能如特效字体。
ASS字幕则属于高级字幕,可以制作出华丽的特效字幕。
2、制作方法不同
SRT字幕的制作方法较简单,一行字幕序号,一行时间代码和一行字幕数据就能完成了。
ASS字幕由于功能更加高级,因此需要采用SSA V4+脚本语言编写。
3、存储空间不同
同样一部电影,SRT字幕是纯文本字幕,所以体积较小,不用占用很多存储空间。
ASS字幕由于添加了特效等功能,体积自然也就大,所需存储空间也就比SRT多。
ASS字幕
SRT字幕
将视频流解码,通过ASS滤镜将ASS字幕写入视频流,编码压缩后进行封装
ffmpeg -i input1.mp4 -vf ass=zimuass.ass -strict -2 -f mp4 output21.mp4
ffmpeg -i intput1.mp4 -i zimuass.ass -acodec copy -vcodec copy -acodec copy output.mkv
命令执行后,会将input1.mp4中的音频流、视频流、zimuass.ass中的字幕流在不改变编码的情况下封装入output.mkv。如果输入视频文件中原文带有字幕流,而我想使用自己的字幕流时,可以通过map功能,例如:
// 将第一个输入文件的第一个流和第二个流,与第二个输入文件的第一个流,写入output2.mkv
ffmpeg -i output.mkv -i zimu2.ass -map 0:0 -map 0:1 -map 1:0 -acodec copy -vcodec copy -acodec copy output2.mkv
FFmpeg可以通过chromakey操作,进行视频抠图与背景视频的合并
chromakey参数(书 P205)
参数 | 类型 | 说明 |
---|---|---|
color | color | 设置chromakey颜色值,默认为黑色 |
similarity | float | 设置chromakey相似值 |
blend | float | 设置chromakey融合值 |
yuv | boolean | yuv替代rgb,默认为false |
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[1:v]chromakey=Green:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output22.mp4
Note:这部分需要FFmpeg版本为3.0及以上,因为chromakey的支持在3.0才加进去,否则会报“No such filter: ‘chromakey’”错误。chromakey filter #388
FFmpeg中除了有chromakey滤镜外,还有一个colorkey参数。chromakey滤镜主要处理YUV数据,做绿幕更加有优势;colorkey处理纯色均可以,因为主要以RGB为主。
VR推出,需要对视频进行处理,调整为左右眼状态; 如果是红蓝眼镜3D视频,同样可以调整为左右眼视频,或是将左右眼视频调整为红蓝眼镜视频
stereo3d处理3D视频 参数(书 P206-207)
// 将左右排列效果合并为黄蓝合并排列效果
ffplay -vf "stereo3d=sbs1:aybd" input.mp4
// 左右转换为红蓝排列效果
ffplay -vf "stereo3d=sbs1:arbd" input.mp4
因为我没有这种3D的视频,所以就把命令贴出来了。。我想用我之前操作的input1.mp4试一下,结果报出Error initializing filter ‘stereo3d’ with args ‘sbs1:aybd’,感兴趣的同学可以自行试一下~
视频播放时,将鼠标移动到进度条上时,播放器中会弹出一个与进度条的进度相对应的缩略图,这就用到了截图的功能。
使用FFmpeg截图的方法有很多种,常用的是使用vframe参数与fps滤镜。
vframe参数截图
ffmpeg -i input1.mp4 -ss 00:00:3.345 -vframes 1 out.png
fps滤镜定时获得图片
在直播场景中,需要定义每隔一段事件就从视频中截取图像生成图片来作为缩略图等
// 每隔一秒生成一张png图片
ffmpeg -i input.flv -vf fps=1 out%d.png
// 每隔一分钟生成一张png图片
ffmpeg -i input.flv -vf fps=1/60 out%d.png
// 每隔十分钟生成一张png图片
ffmpeg -i input.flv -vf fps=1/600 out%d.png
// 使用select,按照关键帧截图图片
ffmpeg -i input.flv -vf "select='eq(pict_type,PICT_TYPE_I)' " -vsync vfr thumb%04d.png
对音视频的倍速处理包含跳帧播放和不跳帧播放,但是跳帧播放的用户体验稍差一些
该滤镜只有一个参数tempo,float型,取值范围为0.5到2。
// 半速处理
ffmpeg -i input.wav -filter_complex "atempo=tempo=0.5" -acodec aac output.aac
// 2倍速处理
ffmpeg -i input.wav -filter_complex "atempo=tempo=2" -acodec aac output.aac
该滤镜只有一个参数expr,用来描述视频的每一帧的时间戳
值 | 说明 |
---|---|
FRAME_RATE | 根据帧率设置帧率值,只用于固定帧率 |
PTS | 输入的pts时间戳 |
RTCTIME | 使用RTC的时间作为时间戳 |
TB | 输入的时间戳的时间基 |
// 半速处理
ffmpeg -re -i input1.mp4 -filter_complex "setpts=PTS*2" output23.mp4
// 2倍速处理
ffmpeg -re -i input1.mp4 -filter_complex "setpts=PTS/2" output23.mp4
如上图,时长从15s变成了30s。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。