本文主要了解FFmpeg进行音视频编码转换。主要学习如下几个知识点:

  • FFmpeg使用libx264进行H,264(AVC)软编码,使用libx265进行H.265(HEVC)软编码
  • 使用FFmpeg在MacOS环境下硬编码
  • 了解音频编码,MP3,AAC的参数设置编码

FFmpeg软编码H.264和H.265

支持H.264的封装格式的文件格式有很多,例如FLV,MP4,HLS,TS等。FFmpeg本身不支持H.264的编码器,通过第三方库x264或者OpenH264来支持,但是OpenH264开源较晚,所以多数使用的还是x264,可以通过命令行ffmpeg -h encoder=libx264来查看x264编码的一些基本信息和参数情况。

H.264编码实例

通过上面的-h命令查看x264支持的参数真的很多,我们在要用到优化的时候可以仔细了解其参数的含义,下面的几个实例列出了一些参数的使用,简单的了解参数的含义以及使用方法。每一个参数都可以带很多不同的配置,在使用的时候查看文档

编码器预设参数preset

这个参数主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢。

使用H.264转码文件

ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4

输出关键速度信息

多了一个参数-preset ultrafast 中的ultrafast表示使用最快的编码方式,默认的编码速度是medium模式的,来查看这两种模式生成的输出信息差异。

ffmpeg -i input.mp4 -vcodec libx264 -preset medium -b:v 2000k output.mp4

上面的ultrafast速度是41.1倍,使用medium速度是6。24倍但是生成的视频的画质速度低的会好一些,

编码优化参数tune

这个参数配合视频类型和视觉优化的参数。可选项

  • film:电影真人类型
  • animation:动画
  • grain:需要保留大量的grain
  • stillimage:静态图像编码时使用
  • psnr:提高psnr做了优化的参数
  • ssim:提高ssim做了优化参数
  • fastdecode:可以快速解码的参数
  • zerolatency:零延迟,用在需要非常低的延迟的情况,比如电视电话会议编码。
ffmpeg -i input.mp4 -vcodec libx264 -tune zerolatency -b:v 2000k output.mp4

profile和level设置

profile和level的设置和H.264标准文档ISO-14496-Part10描述的profile和level信息基本相同。profile有如下选项:

  • Baseline
  • Extented
  • Main
  • High
  • High10
  • High422
  • High444
    profile设置信息不同会影响编码出来的视频的很多参数不同。例如是否支持I与P分片。level也会影响很多参数,例如最大解码速度不同。

下面使用baseline profile和high profile编码一个H.264视频,分析两个编码出来的文件的区别。有一个知识我们提取了解一下baseline profile编码出来额视频不会包含B帧,而high profile包含B帧,下面就看它们B帧的差别

ffmpeg -i input.mp4 -vcodec libx264 -profile:v baseline -level 3.1 -s 352x288 -an -y -t 10 ouput_baseline.ts
ffmpeg -i input.mp4 -vcodec libx264 -profile:v high -level 3.1 -s 352x288 -an -y -t 10 ouput_high.ts

生成了两个文件,通过ffprobe来查看包含B帧的信息

ffprobe -v quiet -show_frames -select_streams v output_baseline.ts |grep "pict_type=B"|wc -l

输出0

ffprobe -v quiet -show_frames -select_streams v output_high.ts |grep "pict_type=B"|wc -l

输出161
验证了我们的理论baseline profile包含0个B帧,而high profile包含B帧。在进行实时流媒体直播时,使用包含B帧的编码更可靠些;适当加入B帧可以有效降低码率

sc_threshold

FFmpeg可以通过参数-g设置帧数间隔为GOP的长度,但是遇到场景切换的时候,从一个画面突然变为另一个画面时,会强行插入一个关键帧,这时GOP的长度会重新开始。可以通过参数sc_threshold决定是否在场景切换的时候插入关键帧。
执行命令控制编码时GOP的大小。

ffmpeg -i input.mp4 -c:v libx264 -g 50 -t 60 output.mp4

执行完毕后生成的文件每50帧被设置为一个GOP间隔。
通过软件Elecrd StreamEye查看帧信息如下:

可以看到红色框框框起来的两个I帧间隔很短,因为插入的I帧和前面的画面完全不同

看到有些GOP的间距很短,这是因为强行插入了GOP导致的,为了使GOP的插入更加均匀,使用sc_threshold设置一下:

ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 -t 60 output.mp4

再看GOP的帧信息如下:

拖动下面的滚动条没有发现和上面一样相隔很近的两个I帧了。

x264opts

由于FFmpeg设置x264参数时增加的参数比较多,FFmpeg开放了x264opts,可以通过这个参数设置x264的内部私有参数,如设置IBP帧的顺序以及规律。下面列举在上面生成的GOP文件数据分析基础上控制生成的文件不出现B帧,只要设置x264内部参数bframes=0即可:

ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=0" -g 50 -sc_threshold 0 -t 60 output.mp4

通过StreamEye查看Stream信息没有出现B帧

如果希望控制I帧P帧B帧的频率和规律,可以通过控制GOP中B帧的帧数来实现,P帧的频率可以通过x264的参数b-adapt进行设置。
例如设置GOP中,每2个P帧之间存放3个B帧:

ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=3:b-adapt=0" -g 50 -sc_threshold 0 -t 60 output.mp4

看看分析:

nal-hrd

编码可以设置VBR,CBR的编码模式,VBR为可变码率,CBR为恒定码率。互联网上VBR居多,但是我们可以使用FFmpeg制作CBR码率视频。

ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=10:b-adapt=0" -b:v 1000k -maxrate 1000k -minrate 1000k -bufsize 50k -nal-hrd cbr -g 50 -sc_threshold 0 -t 60 output.ts

命令执行参数介绍

  • 设置B帧个数,每两个P帧之间包含10个B帧
  • 设置视频码率为1000kbit/s
  • 设置最大码率为1000kbit/s
  • 设置最小码率为1000kbit/s
  • 设置编码的buffer大小为50KB
  • 设置H.264的编码HRD信号为CBR
  • 设置每50帧一个GOP
  • 设置场景切换不强行插入关键帧
  • 设置视频输出时间为60s

可以通过工具Bitrate Viewer查看码率波动,我就没试了,通过Elecard StreamEye查看流信息的bitrate type为CBR。

FFmpeg硬编解码

以前都不知道FFmpeg可以硬编解码,以为它就只能软编解码,它真的强大。FFmpeg可以在Nvidia GPU,Intel QSV,树莓派,OS X系统下硬编解码。我使用的是OS X系统,所以下面来实验一个在该系统的硬编解码。

OS X系统硬编解码

直接看一个硬转码的实例,先把一个视频通过h264_vda硬解码,然后通过h264_videotoolbox硬编码视频文件。

ffmpeg -vcodec h264_vda -i input.mp4 -vcodec h264_videotoolbox -b:v 2000k output.mp4

结果出现错误如下:

这个错误可清楚的知道是没有安装h264_vda工具库,在前面的文章我们知道如何重新给本机的FFmpeg带参数安装一些我们要使用的库了。但是我找了可以带的–with参数,不知道解码器h264_vda属于哪个库里面的。//todo

FFmpeg输出MP3

编码MP3使用编码器libmp3lame这个库,通过命令ffmpeg -h encoder=libmp3lame可以查看它的一些参数信息。
先来看最简单的一条命令使用libmp3lame来进行音频文件编码为MP3文件。

ffmpeg -i input -acodec libmp3lame output.mp3

输出的码率类型参数设置

  • VBR:编码码率不断变化,通过参数-q:a设置
  • CBR:码率几乎不变,通过参数-b设置
  • ABR:平均码率是上面两个的结合体,使用它的参数编码速度比VBR高,质量比VBR差一点,比CBR质量好点,通过参数-abr来设置

控制码率的参数为-q:a后面带数字

FFmpeg输出AAC

AAC是一种比MP3的编码效率更高,编码音质更好的音频编码格式,常见的使用AAC编码后的文件存储格式为m4a。FFmpeg可以使用如下三种编码器

  • aac:FFmpeg自带的AAC编码
  • libfaac:第三方AAC编码器
  • libfdk_aac:第三方AAC编码器

FFmpeg使用AAC编码器

看下面最简单的例子:

ffmpeg -i input.mp4 -c:a aac -b:a 160k output.aac

同样可以使用-q:a带数值代表的码率信息进行转换

FFmpeg命令行转码相关推荐

  1. FFmpeg命令行工具系列二---转码流程及过滤器

    一.概述 在FFmpeg命令行工具系列一中,对FFmpeg的命令行工具FFmpeg.exe进行了简单的介绍,并举出了几个简单的例子.在这一章中,将进行一次详细的介绍,主要是对转码过程和过滤器进行介绍. ...

  2. FFmpeg命令行(ffmpeg、ffplay、ffprobe)

    ffmpeg命令行 A command line tool to convert multimedia files between formats. 名称 命令 解释 查看当前设备输入信息 ffmpe ...

  3. FFmpeg命令行解析

    目录标题 一.引言(Introduction) 1.1 FFmpeg简介(Overview of FFmpeg) 1.2 FFmpeg命令行的应用场景(Application Scenarios of ...

  4. Android 下使用 FFmpeg 命令行工具与问题排查

    目录 FFmpeg 命令行工具 将相关文件加入到项目中 修改 ffmpeg 源码 问题排查 上一篇文章 中,我们已经成功编译了 FFmpeg 的主要库并集成到了我们的 Android 应用中.我们暂时 ...

  5. [总结]FFMPEG命令行工具之ffmpeg详解

    目录 0 前言 1 语法 Synopsis 2 描述 Description 3 详细描述 Detailed description 3.1 滤镜 Filtering 3.1.1 简单滤镜图 Simp ...

  6. FFmpeg命令行,从小白入门到收藏吃灰——基础归纳

    1.查看版本号和功能支持 到官网 http://ffmpeg.org/download.html 下载已经编译好的ffmpeg,选用的是Windows环境下.的BtbN/FFmpeg-Builds/A ...

  7. [总结]FFMPEG命令行工具之ffplay详解

    目录 0 前言 1 语法 Synopsis 2 描述 Description 3 选项 Options 3.1 流指定器 Stream specifiers 3.2 通用选项 Generic opti ...

  8. [总结]FFMPEG命令行工具之ffprobe详解

    目录 0 前言 1 语法 Synopsis 2  描述 Description 3 选项 Options 3.1 流指定器 Stream specifiers 3.2 通用选项 Generic opt ...

  9. 【FFmpeg】Windows 搭建 FFmpeg 命令行运行环境

    文章目录 前言 一.下载 FFMPEG 二.拷贝可执行文件 三.拷贝动态库文件 四.运行 ffmpeg 命令 总结 前言 Android 中需要使用到 FFMPEG , 先在 Windows 中搭建一 ...

最新文章

  1. IEEE史上首位华人主席,马里兰大学终身教授刘国瑞当选
  2. JVM - 剖析Java对象头Object Header之指针压缩
  3. android ------- TCP/IP
  4. python三元运算符怎么使用_Python的三元运算符使用方法
  5. membercache java_Java开发中的Memcache原理及实现
  6. mysql 逗号 join_mysql – sql join表,其中1列有逗号
  7. 安装教程之JDK下载与安装_更新2022
  8. Java拦截器限制IP访问次数
  9. Unity 查找重复图片资源以及引用 工具
  10. 分页的时候pageSize没有效果
  11. 稀土铕Eu-ps微球|聚苯乙烯荧光微球-红色荧光100nm~500nm
  12. 无纸化考试系统(CS)
  13. 基于springboot的校园食堂订餐系统
  14. 使用Landsat系列数据来检测喜马拉雅地区的冰湖溃决(Georg Veha等人,RSE,2018)
  15. CleanMyMac X4.20最新mac电脑优化工具好用吗?
  16. DOP Dilution Of Precision;多点定位 Multilateration;测向交叉定位 三角定位;DAE;无人机
  17. 骁龙778G+和骁龙778G区别
  18. Ajax创建步骤内含兼容
  19. 基于PHP下的大学生校园交流论坛的设计与实现毕业设计源码101634
  20. <span>的宽高到底是多少?

热门文章

  1. 矩阵求导公式(引自维基百科)
  2. 前端背景图放置_html 多张背景图片并存
  3. jQuery使用ajaxSubmit()提交表单以及AjaxSubmit的一些用法
  4. 欢迎使用Windows安装MySQL(安装版)教程,全网最细
  5. 《跟我学习AI量化投资》通过chatgpt进行选股,简单易懂,降低人为操作风险
  6. SAP MM 物料扩充MRP范围
  7. 网页滚动条样式修改 html+css
  8. python的静态局部变量怎么定义
  9. 使用UnblockNeteaseMusic播放网易云音乐客户端无版权歌曲
  10. c语言程序设计结论,C语言程序设计报告.docx