从百度百科中来看,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
官网:https://www.ffmpeg.org/
github地址:https://github.com/FFmpeg/FFmpeg
音/视频流
在音视频领域,我们把一路音/视频称为一路流。如我们小时候经常使用VCD看港片,在里边可以选择粤语或国语声音,其实就是CD视频文件中存放了两路音频流,用户可以选择其中一路进行播放。
容器
我们一般把 MP4、 FLV、MOV等文件格式称之为容器。也就是在这些常用格式文件中,可以存放多路音视频文件。以 MP4 为例,就可以存放一路视频流,多路音频流,多路字幕流。
channel
channel是音频中的概念,称之为声道。在一路音频流中,可以有单声道,双声道或立体声。
构成FFmpeg主要有三个部分。
第一部分
第一部分是三个作用不同的工具软件,分别是:ffmpeg.exe,ffplay.exe,ffprobe.exe
第二部分
第二部分是可以供开发者使用的SDK,为各个不同平台编译完成的库。如果说上面的四个工具软件都是完整成品形式的玩具,那么这些库就相当于乐高积木一样,我们可以根据自己的需求使用这些库开发自己的应用程序。这些库有:
第三部分
第三部分是整个工程的源代码,无论是编译出来的可执行程序还是SDK,都是由这些源代码编译出来的。FFmpeg的源代码由C语言实现,主要在Linux平台上进行开发。FFmpeg不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。在当前这一系列的博文/视频中,我们暂时不会涉及太多源代码相关的内容,主要以FFmpeg的工具和SDK的调用为主。
Linux安装的方式,请看博客 https://blog.csdn.net/Mind_programmonkey/article/details/104584444.
windows安装方式:
在官网上我们可以找到"Download"页面,该页上可以下载FFmpeg的工具、库和源代码等。在选择"Windows Packages"下的Windows Builds后,会跳转到Windows版本的下载页面:
在下载页面上,我们可以看到,对于32位和64位版本,分别提供了三种不同的模式:static
、shared
和dev
static
: 该版本提供了静态版本的FFmpeg工具,将依赖的库生成在了最终的可执行文件中;作为工具而言此版本就可以满足我们的需求;share
: 该版本的工具包括可执行文件和dll,程序运行过程必须依赖于提供的dll文件;dev
: 提供了库的头文件和dll的引导库;一般下载static
版本即可,下载之后,配置好环境变量即可。
但在windows和ubuntu上录屏的话,还需要 screen capture recorder 官网
安装完之后,在命令行输入:
ffmpeg -list_devices true -f dshow -i dummy
查看到如上图红圈中的内容,则安装正确
a.只录制音频
ffmpeg -f dshow -i audio="virtual-audio-capturer" -acodec libmp3lame window.mp3
上图所示即在正常录制。需要停止时按字母键“q”。
b.只录制视频
ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mp4
上图所示即在正常录制。需要停止时按字母键“q”。
c.录制音视频
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -acodec libmp3lame -s 1280x720 -r 15 temp.mkv
首先查看一下FFmpeg处理音视频的流程:
参数 | 说明 |
---|---|
-version | 显示版本 |
-formats | 显示可用的格式(包括设备) |
-demuxers | 显示可用的demuxers |
-muxers | 显示可用的muxers |
-devices | 显示可用的设备 |
-codecs | 显示libavcodec已知的所有编解码器 |
-decoders | 显示可用的解码器 |
-encoders | 显示所有可用的编码器 |
-bsfs | 显示可用的比特流filter |
-protocols | 显示可用的协议 |
-filters | 显示可用的libavfilter过滤器 |
-pix_fmts | 显示可用的像素格式 |
-sample_fmts | 显示可用的采样格式 |
-layouts | 显示channel名称和标准channel布局 |
-colors | 显示识别的颜色名称 |
a.抽取音频流
ffmpeg -i input.mp4 -acodec copy -vn out.aac
b.抽取视频流
ffmpeg -i input.mp4 -vcodec copy -an out.h264
c.合并音视频流
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4
d.转格式
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
上面的命令表式的是音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。
a.添加水印
ffmpeg -i out.mp4 -vf "movie=icon.jpg,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4
b.删除水印
先通过 ffplay 找到要删除 LOGO 的位置
ffplay -i test.flv -vf delogo=x=806:y=20:w=70:h=80:show=1
使用 delogo 滤镜删除 LOGO
ffmpeg -i test.flv -vf delogo=x=806:y=20:w=70:h=80 output.flv
c.视频缩放
ffmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4
d.视频裁剪
ffmpeg -i VR.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 vr_new.mp4
crop 格式:crop=out_w:out_h❌y
e.倍速播放
ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" speed2.0.mp4
f.对称视频
ffmpeg -i out.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4
g.画中画
ffmpeg -i out.mp4 -i out1.mp4 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart new.mp4
a.裁剪
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4
b.合并
首先创建一个 inputs.txt 文件,文件内容如下:
file '1.flv'
file '2.flv'
file '3.flv'
然后执行下面的命令:
ffmpeg -f concat -i inputs.txt -c copy output.flv
a.视频转图片
ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg
b.视频转gif
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif
c.图片转视频
ffmpeg -f image2 -i image-%3d.jpeg images.mp4
RTMP协议直播源:
a.推流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName
b.拉流保存
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
c.转流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream
播放YUV 数据
ffplay -pix_fmt nv12 -s 192x144 1.yuv
播放YUV中的 Y平面
ffplay -pix_fmt nv21 -s 640x480 -vf extractplanes='y' 1.yuv