目录

ffmpeg音视频处理

ffmpeg音视频处理

文章目录

一、ffmpeg的简介

FFmpeg(全称:Fast Forward Mpeg),名称来自MPEG视频编码标准。FFmpeg是一套用来处理视频和音频的开源工具库。它提供了录制、转换、流化音视频以及后期处理的完整解决方案。有很高的质量和可移植性。

https://i-blog.csdnimg.cn/blog_migrate/445bb659d200259733239e4ed92e932f.png

二、ffmpeg的安装

在Mac环境中,直接使用Homebrew (mac包管理工具)安装FFmpeg。

没安装的可以参考 。也可以 不同平台安装包。

1、在终端中输入 brew install ffmpeg 安装,最后使用命令 ffmpeg -version 查看查看版本确认是否安装成功。

https://i-blog.csdnimg.cn/blog_migrate/d96776f68ddb3ad1230e34c1fb5358b7.png

2、进入上一步的安装目录,打开目录位置:

cd /usr/local/Cellar/ffmpeg
open .

https://i-blog.csdnimg.cn/blog_migrate/01bd66a622dc9aa133c364bf4245a0f7.png

https://i-blog.csdnimg.cn/blog_migrate/4942be86a098bada9bef34e0fbcf386f.png

目录结构说明:

  • bin:有编译好的可执行程序:ffmpeg、ffplay、ffprobe等,可以直接在命令行上使用。

    eg: ffplay xx.mp4:可以直接播放某个视频

    eg:ffmpeg -version:可以查看FFmpeg的版本号

  • include:开发时需要包含的头文件

  • lib:链接时需要用到的库文件

函数库:

  • libavcodec:编解码库。
  • libavformat:音视频容器格式以及所支持的协议的封装和解析。
  • libavutil:提供了一些公共函数,工具库。
  • libavfilter:音视频的滤镜库,如视频加水印、音频变声等。
  • libavdevice:支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制。
  • libswresample, libavresample:提供音频的重采样工具库。
  • libswscale:提供对视频图像进行色彩转换、缩放以及像素格式转换,如图像的 YUV 转换。
  • libpostproc:多媒体后处理器。

基本概念:

  • 容器(Container)

    容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。

  • 流(Stream)

    是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。

  • 帧(Frame)

    帧代表一幅静止的图像,分为I帧,P帧,B帧。

  • 编解码器(Codec)

    是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)

  • 复用/解复用(mux/demux)

    把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)

    把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)

三、ffmpeg、ffplay、ffprobe区别

1、ffmpeg是用于转码的应用程序

一个简单的转码命令可以这样写:将input.avi转码成output.ts,并设置视频的码率为640kbps

ffmpeg -i input.avi -b:v 640k output.ts

2、ffplay是用于播放的应用程序

一个简单的播放命令可以这样写:播放test.avi

ffplay test.avi

3、ffprobe是用于查看文件格式的应用程序

ffmpeg - h 帮助命令可以查看更多参数

四、常见的文件格式、编码

1、常见的视频格式、文件格式

https://i-blog.csdnimg.cn/blog_migrate/b12119e2408e6f0b54c9c005dda9523b.jpeg

eg: ffmpeg -i test.mp4 output.mov 将test视频文件输出为mov文件:

https://i-blog.csdnimg.cn/blog_migrate/5b7ec5f81519e7c242af28a90dfd44f5.png

2、常见的编码音频转码

执行命令 ffmpeg -codecs 查看编解码方式,一般的视频网站用的是

  • MP4封装:H264视频编码+AAC音频编码(比较成熟)
  • WebM封装:VP8视频编码+Vorbis音频编码(谷歌方案)
  • OGG封装:Theora视频编码+Vorbis音频编码(开源)

以上适合1080p及其之下分辨率的编码方案

https://i-blog.csdnimg.cn/blog_migrate/4615f4caca0124a22525189dd66e4d20.png

eg:执行命令 ffmpeg -i test2.m4a -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3 ,参数说明:

  • acodec 指定音频编码器
  • libmp3lame 指定mp3编码器
  • ar 音频采样率 。不输入默认采用原音频的采样率:48khz、44.1hz
  • ab 指定音频比特率 。不输入默认128k
  • ac 设置声道数目,1单声道,2双声道

五、视频压制

eg:执行命令 ffmpeg -i test.mp4 -s 1920x1080 -pix_fmt yuv420p -vcodec libx264 -preset medium -profile:v high -level:v 4.1 -crf 23 -acodec aac -ar 44100 -ac 2 -b:a 128k out.mp4 ,参数说明:

  • s 缩放视频尺寸
  • pix_fmt 设置视频颜色空间。 网络视频通常用:yuv420p
  • vcodec 网络视频编码器指令。libx264 软件编码器 通用稳定
  • preset 编码器预设(共10个参数可选),一般录制时选用veryfast,压制时一般采用veryslow

https://i-blog.csdnimg.cn/blog_migrate/162ad7dc3baea93a0e1bf083c20766ed.jpeg

  • profile:v 指定编码器配置(和压缩比有关),压缩都狠,体积占用小,画面损失多。

通讯领域一般用baseline,流媒体一般main,超清视频high

https://i-blog.csdnimg.cn/blog_migrate/2aff7b64cb0da22c8fd8275270033faa.jpeg

  • level:v 编码器的具体规范和限制(1~5.2) 一般1080p的用4.1

  • crf 码率控制模式。

    0-51数值越小,质量越高,0就是无损,默认值23,一般在10-28间选择(适用于画质有要求,文件大小无要求的场景)

  • b:a 音频比特率一般128k 或192

ffmpeg码率控制模式:

  • -qp 恒定量化器模式(每一帧都可以不同量化处理,没必要,一般不使用)

  • -crf Constant Rate Factor 恒定速率因子模式 (常用)

  • -b 固定目标码率模式(一般不使用,适用于对码率和体积有限制的情况)

    这三种默认都是单遍编码

    vbr 动态码率

    abr 平均比特率(目前视频经常用)

    cbr恒定比特率(没人用)

六、合并,提取音视频

ffmpeg -i test.mp4 -vcodec copy -an v.mp4 将音频剔除,获取视频

ffmpeg -i test.mp4 -acodec copy -vn v.m4a 将视频剔除,获取音频

将音频视频合并回去,由于刚刚从一个视频中分离的合并回去也不需要特殊处理,执行 ffmpeg -i v.mp4 -i v.m4a -c copy hebing.mp4 即可,如果对不上的需要用其他命令处理。

七、截取、连接音视频

1、截取视频音频

  • 截取视频10s:

    ffmpeg -i test.mp4 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp4 截取铃声

    ffmpeg -i test.mp4 -ss 00:01:00 -t 10 -acodec copy out.mp4 截取铃声,也可以这样写

    ffmpeg -ss 00:01:00 -i test.mp4 -to 00:01:10 -c copy -copyts out.mp4 截取视频,会启用关键帧技术,copyts保留时间戳

  • 截取视频后10s: ffmpeg -sseof -10 -i test.mp4 out.mp4

  • ffmpeg -ss 00:01:00 -i test.mp4 -to 00:01:10 -c copy -y -threads 4 -preset ultrafast -strict -2 out.mp4 截取视频

参数解析

  • -codec-c 是等价的,可以为指定的流设置编码器。 -vcodec-c:v 是等价的,指定视频解码器。
  • 设定音频比特率: -ab bitrate(audio bitrate ),推荐改为使用 -b:a 。设定视频比特率:-b bitrate(video bitrate),推荐改为使用 -b:v
  • 使用 -i 选项选择网络源地址,
  • -c 参数表示选择编码器类型
  • -ss 指定开始时间,然后用 -to 指定结束时间
  • copy 模式将原视频文件编码格式直接拷贝为新格式的视频
  • -y 表示如果存在与指定的文件名相同的文件就覆盖掉原有的文件
  • -threads 5 -preset ultrafast 多线程转码。ffmpeg配线程数只针对解码,不针对编码。 设置 preset 预设参数为 ultrafast 进行转码。
  • -strict -2 之前是实验参数表示 aac音频编码 如果不使用aac音频编码使用使其的编码好像还需要导入第三方的音频编码库 比较麻烦 使用FFmpeg自带的aac音频编码要带上-strict -2 参数就可以了。带这个参数是为了使用aac音频编码。

2、音频视频的连接

音频视频的连接有多种方法,常用的有如下两种,推荐使用第二种:FFmpeg concat 分离器。

方法一 :FFmpeg concat 协议

对于 MPEG 格式的视频,可以直接连接: ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg

对于非 MPEG 格式容器,但是是 MPEG 编码器(H.264、DivX、XviD、MPEG4、MPEG2、AAC、MP2、MP3 等),可以包装进 TS 格式的容器再合并。在新浪视频,有很多视频使用 H.264 编码器,可以采用这个方法

ffmpeg -i input1.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts
ffmpeg -i input2.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
ffmpeg -i input3.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input3.ts
ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4

保存 QuickTime/MP4 格式容器的时候,建议加上 -movflags +faststart。这样分享文件给别人的时候可以边下边看。

方法二 :FFmpeg concat 分离器

这种方法成功率很高,也是最好的,但是需要 FFmpeg 1.1 以上版本。先创建一个文本文件 filelist.txt,然后执行命令: ffmpeg -f concat -i filelist.txt -c copy output.mp4

https://i-blog.csdnimg.cn/blog_migrate/9366a7d0e6f4652d605429b0638d87b9.png

注意:使用 FFmpeg concat 分离器时,如果文件名有奇怪的字符,要在 filelist.txt 中转义。

八、截图、水印、动图、相框

ffmpeg -i test.mp4 -ss 5 -vframes 1 img.jpg 截取第几秒第几帧图片

ffmpeg -i test.mp4 -i logo.jpg -filter_complex "overlay=20:20" out.mp4 给视频加水印logo

ffmpeg -i test.mp4 -ss 10 -to 10.5 -s 640x320 -r 15 out.gif 处理一下帧率和大小,生成动图

九、滤镜

滤镜 指的是在编码之前针对解码器解码出来的原始数据(即音视频帧)进行处理的动作,我们还可以称它为过滤器。

ffmpeg内置了大概近400种滤镜,我们可以用 ffmpeg -filters 命令查看所有的滤镜 ,也可以用命令 ffmpeg -h filter=xxx 或者查看官方文档了解每一种滤镜。

scale滤镜用于调整视频的大小,比如等比例缩放、等比例放大

in_w in_h 或者 iw ih 表示输入视频的宽高

out_w out_h 或者 ow oh 表示输出视频的宽高

复杂滤镜用命令 -filter_complex 表示,它还有一个别名 -lavfi。

  • -filter_complex
    相比-vf(-vf 是 -filter:v 的简写), filter_complex适合开发复杂的滤镜功能,如同时对视频进行裁剪并旋转。参数之间使用逗号(,)隔开即可
  • main_w :视频宽度
  • overlay_w
    要添加的图片水印宽度
  • main_h
    视频高度
  • overlay_h :要添加的图片水印宽度

十、直播录屏

ffmpeg -f gdgrab -i desktop rec.mp4 只能单存的录屏

说明:-f 格式化 gdgrab组件是视频捕获工具,不能捕获音频,不同操作系统视频捕获工具不同,window目前用gdgrab。

推荐组件:OBS Studio免费稳定强大,window下限制太多。

十一、添加字幕

字幕操作分为软字幕(推荐)和硬字幕,软字幕即给视频流添加字幕流的方式,可分离,硬字幕(不推荐)将字幕嵌入到视频帧中,这个过程需要重新编解码,所以速度比较慢。而且不可逆.

创建一个txt,重命名为字幕文件格式zm.srt,修改内容如下(注意需要空行):

https://i-blog.csdnimg.cn/blog_migrate/273b15a8f8801778fbd577a9cb16b2aa.png

执行命令: ffmpeg -i test.mp4 -vf subtitles=zm.srt out.mp4 即可。

https://i-blog.csdnimg.cn/blog_migrate/238d2c70e1e8705a4bd5bb8fa1ad452f.png

更多字幕操作请参考 学习