《FFmpeg从入门到精通》读书笔记(六)

写在前面

2019.06.25

第六章 FFmpeg滤镜使用( 6.6 至结束)


FFmpeg音频音量探测
音频音量获得

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

在这里插入图片描述
在这里插入图片描述


FFmpeg为视频加字幕

添加字幕方式大致分为两种:

将字幕编码进视频流中,与视频加水印相似
在封装容器中加入视频流

知识点:ASS字幕和SRT字幕的区别
1、功能不同
SRT字幕是简单的纯文本字幕,无法使用其他高级功能如特效字体。
ASS字幕则属于高级字幕,可以制作出华丽的特效字幕。
2、制作方法不同
SRT字幕的制作方法较简单,一行字幕序号,一行时间代码和一行字幕数据就能完成了。
ASS字幕由于功能更加高级,因此需要采用SSA V4+脚本语言编写。
3、存储空间不同
同样一部电影,SRT字幕是纯文本字幕,所以体积较小,不用占用很多存储空间。
ASS字幕由于添加了特效等功能,体积自然也就大,所需存储空间也就比SRT多。

ASS字幕
在这里插入图片描述

SRT字幕
在这里插入图片描述

ASS字幕流写入视频流

将视频流解码,通过ASS滤镜将ASS字幕写入视频流,编码压缩后进行封装

ffmpeg -i input1.mp4 -vf ass=zimuass.ass -strict -2 -f mp4 output21.mp4

在这里插入图片描述
在这里插入图片描述

ASS字幕流写入封装容器
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视频抠图合并

FFmpeg可以通过chromakey操作,进行视频抠图与背景视频的合并

chromakey参数(书 P205)

参数类型说明
colorcolor设置chromakey颜色值,默认为黑色
similarityfloat设置chromakey相似值
blendfloat设置chromakey融合值
yuvbooleanyuv替代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为主。
在这里插入图片描述

在这里插入图片描述


FFmpeg 3D视频处理

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定时视频截图

视频播放时,将鼠标移动到进度条上时,播放器中会弹出一个与进度条的进度相对应的缩略图,这就用到了截图的功能。
使用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

FFmpeg对音视频的倍速处理

对音视频的倍速处理包含跳帧播放和不跳帧播放,但是跳帧播放的用户体验稍差一些

atempo音频倍速处理

该滤镜只有一个参数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

在这里插入图片描述

setpts视频倍速处理

该滤镜只有一个参数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。

### FFmpeg入门教程 #### 学习资源推荐 对于想要学习FFmpeg使用的用户来说,官方提供的各种命令示例和使用场景是非常宝贵的资料[^1]。这些例子能够帮助新手快速理解如何运用这个强大的工具来完成日常任务。 另外,FreeCodeCamp提供了详尽的FFmpeg教程,不仅适合初学者也适用于那些希望通过实例加深理解的人士。此平台上的文章通常会从基础概念讲起,并逐步引导读者掌握更多复杂的操作。 #### 命令行工具简介 FFmpeg作为一个大型项目确实包含了多个组件与库文件,而其核心之一就是易于使用的命令行界面[^2]。通过简单的指令组合即可实现对多媒体数据的有效管理和转换工作,这使得它成为处理音频/视频素材的理想选择。 ### 高级用法展示 #### 实现流媒体传输 当涉及到实时广播或网络直播时,可以利用RTMP协议来进行推流: ```bash ffmpeg -i input.mp4 -c copy -f flv rtmp://server/live/stream ``` 而对于按需播放服务,则可采用HLS标准创建适应不同带宽条件下的分段文件列表: ```bash ffmpeg -i input.mp4 -c:v h264 -flags +cgop -g 30 -hls_time 5 playlist.m3u8 ``` 上述两条语句分别展示了两种常见的应用场景——即时推送以及延迟观看模式下所需执行的具体步骤[^3]。 #### 调整参数优化质量 为了满足特定需求如减小文件尺寸而不显著影响画质表现,在转码过程中适当调节比特率范围不失为一种有效手段: ```bash ffmpeg \ -i input.mp4 \ -minrate 964K -maxrate 3856K -bufsize 2000K \ output.mp4 ``` 这里设置了一个较为合理的上下限值区间用于控制最终输出物的数据量大小,从而达到预期效果的同时保持良好的视觉体验[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值