ffmpeg音视频处理

一、ffmpeg的简介

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

二、ffmpeg的安装

在Mac环境中,直接使用Homebrew (mac包管理工具)安装FFmpeg。
没安装的可以参考mac安装Homebrew。也可以官网下载不同平台安装包。

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

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

cd /usr/local/Cellar/ffmpeg
open .

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

目录结构说明:

  • 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、常见的视频格式、文件格式

在这里插入图片描述
eg: ffmpeg -i test.mp4 output.mov 将test视频文件输出为mov文件:
在这里插入图片描述

2、常见的编码音频转码

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

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

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

在这里插入图片描述

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

在这里插入图片描述- profile:v 指定编码器配置(和压缩比有关),压缩都狠,体积占用小,画面损失多。
通讯领域一般用baseline,流媒体一般main,超清视频high
在这里插入图片描述

  • 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
在这里插入图片描述

注意:使用 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,修改内容如下(注意需要空行):
在这里插入图片描述

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

在这里插入图片描述
更多字幕操作请参考https://www.cnblogs.com/sztom/p/14998032.html学习

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只IT攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值