一、FFmpeg的故事
1.FFmpeg是什么?
从百度百科中来看,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
官网:https://www.ffmpeg.org/
github地址:https://github.com/FFmpeg/FFmpeg
补充知识:音视频格式的基本概念
音/视频流
在音视频领域,我们把一路音/视频称为一路流。如我们小时候经常使用VCD看港片,在里边可以选择粤语或国语声音,其实就是CD视频文件中存放了两路音频流,用户可以选择其中一路进行播放。
容器
我们一般把 MP4、 FLV、MOV等文件格式称之为容器。也就是在这些常用格式文件中,可以存放多路音视频文件。以 MP4 为例,就可以存放一路视频流,多路音频流,多路字幕流。
channel
channel是音频中的概念,称之为声道。在一路音频流中,可以有单声道,双声道或立体声。
2.FFmpeg的组成
构成FFmpeg主要有三个部分。
第一部分
第一部分是三个作用不同的工具软件,分别是:ffmpeg.exe,ffplay.exe,ffprobe.exe
- ffmpeg.exe:音视频转码、转换器
- ffplay.exe:简单的音视频播放器
- ffprobe.exe:简单的多媒体码流分析器
第二部分
第二部分是可以供开发者使用的SDK,为各个不同平台编译完成的库。如果说上面的四个工具软件都是完整成品形式的玩具,那么这些库就相当于乐高积木一样,我们可以根据自己的需求使用这些库开发自己的应用程序。这些库有:
- libavcodec:包含音视频编码器和解码器
- libavutil:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等功能
- libavformat:包含多种多媒体容器格式的封装、解封装工具
- libavfilter:包含多媒体处理常用的滤镜功能
- libavdevice:用于音视频数据采集和渲染等功能的设备相关
- libswscale:用于图像缩放和色彩空间和像素格式转换功能
- libswresample:用于音频重采样和格式转换等功能
第三部分
第三部分是整个工程的源代码,无论是编译出来的可执行程序还是SDK,都是由这些源代码编译出来的。FFmpeg的源代码由C语言实现,主要在Linux平台上进行开发。FFmpeg不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。在当前这一系列的博文/视频中,我们暂时不会涉及太多源代码相关的内容,主要以FFmpeg的工具和SDK的调用为主。
3.下载安装FFmpeg
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文件;
两者的区别主要是在bin文件里面,在share文件里面的bin还有dll文件dev
: 提供了库的头文件和dll的引导库;
一般下载static
版本即可,下载之后,配置好环境变量即可。
但在windows和ubuntu上录屏的话,还需要 screen capture recorder 官网
安装完之后,在命令行输入:
ffmpeg -list_devices true -f dshow -i dummy
查看到如上图红圈中的内容,则安装正确
4.FFmpeg录制音视频
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常用命令
首先查看一下FFmpeg处理音视频的流程:
1.基本信息查询命令
参数 | 说明 |
---|---|
-version | 显示版本 |
-formats | 显示可用的格式(包括设备) |
-demuxers | 显示可用的demuxers |
-muxers | 显示可用的muxers |
-devices | 显示可用的设备 |
-codecs | 显示libavcodec已知的所有编解码器 |
-decoders | 显示可用的解码器 |
-encoders | 显示所有可用的编码器 |
-bsfs | 显示可用的比特流filter |
-protocols | 显示可用的协议 |
-filters | 显示可用的libavfilter过滤器 |
-pix_fmts | 显示可用的像素格式 |
-sample_fmts | 显示可用的采样格式 |
-layouts | 显示channel名称和标准channel布局 |
-colors | 显示识别的颜色名称 |
2.抽取音视频流并转取视频格式
a.抽取音频流
ffmpeg -i input.mp4 -acodec copy -vn out.aac
- acodec: 指定音频编码器,copy 指明只拷贝,不做编解码。
- vn: v 代表视频,n 代表 no 也就是无视频的意思。
b.抽取视频流
ffmpeg -i input.mp4 -vcodec copy -an out.h264
- vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。
- an: a 代表视频,n 代表 no 也就是无音频的意思。
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。
3.视频水印以及缩放,裁剪,倍速
a.添加水印
ffmpeg -i out.mp4 -vf "movie=icon.jpg,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4
- -vf中的 movie 指定logo位置。scale 指定 logo 大小。overlay 指定 logo 摆放的位置。
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
- -vf scale 指定使用简单过滤器 scale,
- iw/2:-1 中的 iw 指定按整型取视频的宽度。
- -1 表示高度随宽度一起变化。
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
- out_w: 输出的宽度。可以使用 in_w 表式输入视频的宽度。
- out_h: 输出的高度。可以使用 in_h 表式输入视频的高度。
- x : X坐标
- y : Y坐标
如果 x和y 设置为 0,说明从左上角开始裁剪。如果不写是从中心点裁剪。
倍速播放
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
- -filter_complex 复杂滤镜,[0:v]表示第一个(文件索引号是0)文件的视频作为输入。setpts=0.5*PTS表示每帧视频的pts时间戳都乘0.5 ,也就是差少一半。[v]表示输出的别名。音频同理就不详述了。
- map 可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。"[v]" 复杂滤镜输出的别名作为输出文件的一路流。上面 map的用法是将复杂滤镜输出的视频和音频输出到指定文件中。
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
- hflip 水平翻转
如果要修改为垂直翻转可以用vflip。
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
4.音视频的拼接与裁剪
a.裁剪
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4
- -ss 指定裁剪的开始时间,精确到秒
- -t 被裁剪后的时长。
b.合并
首先创建一个 inputs.txt 文件,文件内容如下:
file '1.flv'
file '2.flv'
file '3.flv'
然后执行下面的命令:
ffmpeg -f concat -i inputs.txt -c copy output.flv
5.视频图片互转
a.视频转图片
ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg
- -r表示一秒选一帧图片
b.视频转gif
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif
c.图片转视频
ffmpeg -f image2 -i image-%3d.jpeg images.mp4
6.直播相关
RTMP协议直播源:
- 湖南卫视 rtmp://58.200.131.2:1935/livetv/hunantv
- rtmp://cyberplayerplay.kaywang.cn/cyberplayer/demo201711-L1
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
7.ffplay播放YUV数据
播放YUV 数据
ffplay -pix_fmt nv12 -s 192x144 1.yuv
播放YUV中的 Y平面
ffplay -pix_fmt nv21 -s 640x480 -vf extractplanes='y' 1.yuv
来源:CSDN
作者:mind_programmonkey
链接:https://blog.csdn.net/Mind_programmonkey/article/details/104641734