小结
音视频流的分离开与合并
多媒体文件的裁剪与拼接
多媒体格式互转
FFmpeg filter
-------------------------------
avfilter
视频画中画
音频混音/视频混屏
视频转场
增加/删除水印
音视频倍速播放
学习音视频的难点
基础不牢地动山摇
I/P/B帧,GOP
采样率,采样大小,通道数
以上这些是学习音视频的必由之路
音视频重要的库
FFmpeg 音视频必须的库
WebRTC 网络传输
音视频的未来
音视频开发特别有意思
具有广阔的未来
与人工智能会紧密结合
ffmpeg -i new_5.mp4 -i new_5.mp4 -filter_complex "[0:a][1:a]amix=inputs=2:duration=shortest:weights='0.1 0.9'" amixer.aac
视频速度加倍
ffplay -i h.mp4 -an -vf "setpts=PTS*0.5"
音频速度加倍
ffplay -i h.mp4 -vn -af "atempo=2.0"
音频速度减半
ffplay -i h.mp4 -vn -af "atempo=0.5"
音视频同步增速
ffmpeg -i h.mp4 -filter_complex "[0:v]setpts=PTS*0.5[vo];[0:a]atempo=2.0[ao]" -map "[vo]" -map "[ao]" speed2.mp4
前提条件:把各个视频的分辨率搞成一样的
ffmpeg -i new_5.mp4 -i new_5.mp4 -i new_5.mp4 -filter_complex "[0:v]fade=t=out:st=18:d=3[v0];[1:v]fade=t=in:st=0:d=3[tmp];[tmp]fade=t=out:st=18:d=3[v1];[2:v]fade=t=in:st=0:d=3[v2];[v0][v1][v2]concat=n=3:v=1:a=0[vo];[0:a][1:a][2:a]concat=n=3:v=0:a=1[ao]" -map "[vo]" -map "[ao]" r.mp4
三个多媒体文件的渐进渐出
四个视频合在一起的命令
ffmpeg -i new_5.mp4 -i new_5.mp4 -i new_5.mp4 -i new_5.mp4 -filter_complex "nullsrc=size=640*480[base];[0:v]setpts=PTS-STARTPTS,scale=320:240[a];[1:v]setpts=PTS-STARTPTS,scale=320:240[b];[2:v]setpts=PTS-STARTPTS,scale=320:240[c];[3:v]setpts=PTS-STARTPTS,scale=320:240[d];[base][a]overlay=shortest=1[tmp1];[tmp1][b]overlay=shortest=1:x=320[tmp2];[tmp2][c]overlay=shortest=1:y=240[tmp3];[tmp3][d]overlay=shortest=1:x=320:y=240" new.mp4
实现画中画
ffmpeg -i killer_d.mp4 -i video.mpt -fliter_complex "[1:v]scale=160:90[out];[0:v][out]overlay=W-w-30:10" new.mp4
1代表第2个输入,v代表视频部分
FFmpeg滤镜种类
简单滤镜 -vf
复杂滤镜 -filter_complex
Overlay滤镜
最常使用的滤镜
以第一个输入为背景,后面的叠加到背景上
滤镜描述符规则
逗号表示前一个输出是后一个输入
分号表示两个滤镜是并列关系
冒号用于区分不同的参数
例子
直接播放
ffplay -i new_5.mp4 -vf "movie=1.jpeg,scale=64:48[water];[in][water]overlay=30:10"
movie是一个关键字, water代表水印,in代表背景,离左边30像素,离上面10个像素。
先转换成文件,再播放文件
ffmpeg -i new_5.mp4 -vf "movie=1.jpeg,scale=64:48[water];[in][water]overlay=30:10" video_w.mp4
ffplay video_w.mp4
ffmpeg -f image2 -r 1 -i i-%03d.jpg -r 1 video.mp4
-f:指图片格式,一般为image2或image1
ffprobe output-003.jpg
转换图片为相同大小,再把图片转换为视频
l
ffmpeg -f image2 -r 2 -i i-%03d.jpg -r 24 video3.mp4
ffprobe video3.mp4
如果每秒输入两张,如果已存在20张图片,那么就会变为10s的视频。24fps, 每秒采用12张图片。
视频生成图片
ffmpeg -i new_5.mp4 -r 1 -f image2 output-%03d.jpg
生成缩略图
ffmpeg -i new_5.mp4 -r 1 -s 160*90 -f image2 output-%03d.jpg
查看图片
open output-001.jpg
每秒生成0.5帧,即两秒生成一帧
ffmpeg -i new_5.mp4 -r 0.5 -s 160*90 -f image2 output-%03d.jpg
音视频裁剪
理论基础
I帧
P帧
相对于前一帧的增量,依赖I帧
B帧
相对于前面的I帧和后面的P帧,。。。依赖I帧和P帧
裁剪方式:
第一种:
重新解码编码来进行裁剪
第二种:
在原有的data上直接定位到某一点,然后把数据拿出来
裁剪时如果不幸定位到B帧上了,就找前一个I帧和后一个I帧开始
裁剪命令
ffmpeg -ss 00:00:00 -t 10 10 -i test.mp4 new_3.mp4 修饰输入文件在没有处理的时候怎么做
一般从第一秒开始都没有问题,因为一般都是从I帧开始的
ffmpeg -i test.mp4 -ss 00:00:00 -t 10 10 new_5.mp4 修饰的是输出文件
想裁剪得更准确,一般先解码再重新编码会好点
GOP
GOP即Group of picture(图像组)
媒体格式互转
MP4转FLV
ffmpeg -i test.mp4 testflv.flv
ffplay testflv.flv 会比原视频更模糊,如果不加copy,它采用的策略是向比较小的码率去转化
ffmpeg -i test.mp4 -c copy testflv2.flv
ffplay testflv2.flv 相当于复制一次源文件
FLV转TS
ffmpeg -i test.mp4 -c copy testflv2.ts
MP4转MOV
ffmpeg -i test.mp4 -c copy testflv2.mov
ffmpeg 一般把高清的转化为低清的,一般不能把低清的转变为高清的,当然通过一些算法来实现的方式就另说了
抽取视频流
ffmpeg -i out.mp4 -an -c:v copy new.mp4
ffplay new.mp4
抽取音频流
ffmpeg -i out.mp4 -vn -c:a copy out.aac
ffplay out.aac
查看一个音视频属性
ffprobe out.mp4
抽取音视频流
多媒体文件
音视频轨
安装Ffmpeg的方式
命令安装
mac: brew install ffmpeg
unbuntu: apt install ffmpeg
源码安装
方法详见:http://avdancedu.com
ffmpeg
音视频编辑
播放器
音视频转码
-------------------------------------------
WebRTC
音视频实时通信
3A处理
网络传输质量
--------------------------------------------
Ffmpeg与WebRTC比较
Ffmpeg是基础,webRTC也使用它
Ffmpeg更多的用于音视频编辑与播放器
WebRTC更多的用于音视频实时通信
命令安装
重新编解码裁剪
时间参数放在前面,是对没有编解码的文件设定的。
ffmpeg -ss 00:00:00 -t 10 -i output.mp4 new_3.mp4
时间参数放在后面是对解码后的数据按时间剪裁,更为准确
ffmpeg -i output.mp4 -ss 00:00:05 -t 10 new_4.mp4
不重新编解码裁剪
ffmpeg -i output.mp4 -ss 00:00:05 -t 10 -c copy new_4.mp4
裁剪音视频
I帧:表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)。又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象
P帧:即Predictive-coded Picture(前向预测编码图像帧)。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
B帧:即Bidirectionally predicted picture(双向预测编码图像帧)。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。
多媒体格式转换
MP4--->FLV
ffmpeg -i output.mp4 output.flv
不对文件里面的视频和音频内容更改,直接拷贝,速度快,只是将文件的外衣mp4改为flv而已
ffmpeg -i output.mp4 -c copy output.flv
音频与视频合流:
ffmpeg -i new.mp4 -i happy.aac new_1.mp4
此时如果音频和视频的时长不一致,比如视频时长短,则视频停留最后一帧,音频继续播放,反之亦然。
为了视频和音频同时同时停止,需要加入shortest参数
ffmpeg -i new.mp4 -i happy.aac -shortest new_1.mp4
即合并后的时长等于音频与视频中时长较短的保持一致。
提取音频命令:
ffmpeg -i output.mp4 -vn -c:a copy output.aac
-i 表示input输入
-vn v表示video n表示no 不要视频
-ca 对音频编码
copy 不对编码器处理,直接拷贝
命令完整的含义:对输入的output.mp4 文件进行操作,不要视频,对音频的数据不做修改,直接拷贝输出到output.aac文件中。
查看文件信息:
ffprobe output.mp4
播放文件:
ffplay output.aac
同理提取视频命令:
ffmpeg -i output.mp4 -an -c:v copy new.mp4
ffplay new.mp4
ffmpeg与WebRTC的比较
WebRTC的主要用途:
音视频实时通信
3A处理(混音消除、降噪、自动增益)
网络传输质量(一系列解决方案)
ffmpeg的主要用途