FFmpeg音视频处理

一、ffmpeg的简介

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

二、ffmpeg的安装

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

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双声道

【学习地址】: FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 1079654574加群领取哦~

五、视频压制

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 即可。

原文链接:ffmpeg音视频处理 - 简书

猜你喜欢

转载自blog.csdn.net/irainsa/article/details/130566713