FFmpeg命令行转码

article/2025/11/10 22:29:58

本文主要了解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带数值代表的码率信息进行转换


http://chatgpt.dhexx.cn/article/TVhap7MO.shtml

相关文章

ffmpeg命令行使用

查看视频信息 ffmpeg -i 视频名字视频名字这里输入前几个字符按 tab 键可以自动补全 返回结果: 红框之内的内容没什么用 编码器 :encoder : Lavf57.25.100 持续时间:Duration: 00:14:20.58, start: 0.000000, bitrate: 381 kb/s Duratio…

ffmpeg录屏命令

1.gdigrab抓屏 ffmpeg -f gdigrab -i desktop -q:v 0.01 -vcodec mpeg4 -f mp4 out.mp4-i 输入设备 -vcodec 视频编码格式 -f 视频封装格式 缺点只能录制视频,不能录制音频 2.dshow 下载安装screen capture recorder https://sourceforge.net/projects/screencap…

FFMPEG常用命令行

目录 命令格式: 1.获取视频信息 2.转视频/音频格式 视频格式转换 音频格式转换 3.音视频分离 4.图像处理 5.视频旋转 6.视频倒放&视频加速&视频减速 7.视频合并(两个10秒的视频合并为20秒): 8.视频拼接&…

FFmpeg命令介绍

FFmpeg 简介轶闻常用命令视频相关音频相关录制命令 简介 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。使用C语言进行开发,采用LGPL或GPL许可证,可前往Github下载其源码。它提供了录制、转换以及流化音…

ffmpeg命令大全

ffmpeg命令大全 FFMPEG 目录及作用FFMPEG基本概念FFMPEG 命令基本信息查询命令主要参数视频参数音频参数录制录屏 分解与复用滤镜简单滤镜复杂滤镜 直播相关 前言 FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它…

音视频ffmpeg——ffmpeg 命令大全

ffmpeg 命令参数 ffmpeg信息查询命令 ffmpeg 控制命令 主要参数: ◼ -i 设定输入流 ◼ -f 设定输出格式(format) ◼ -ss 开始时间 ◼ -t 时间长度 音频参数: ◼ -aframes 设置要输出的音频帧数 ◼ -b:a 音频码率 ◼ -ar 设定采样率 ◼ -ac 设定…

常见FFmpeg命令行全面分析

FFmpeg多媒体库支持的命令行调用分为三个模块:ffmpeg、ffprobe、ffplay。其中ffmpeg命令行常用于音视频剪切、转码、滤镜、拼接、混音、截图等;ffprobe用于检测多媒体流格式;ffplay用于播放视频。详情可查阅FFmpeg官方文档:ffmpeg…

ffmpeg 常用命令汇总

​​​​​​经常用到ffmpeg做一些视频数据的处理转换等,用来做测试,今天总结了一下,参考了网上部分朋友的经验,一起在这里汇总了一下。 1、ffmpeg使用语法 命令格式: ffmpeg -i [输入文件名] [参数选项] -f [格…

FFmpeg常用基本命令行

本文收集记录了笔者使用过的FFmpeg命令,亲测可用,并不是简单的copy别人的FFmpeg大全,下面的命令大部分都是本人测试成功过的,大家可以放心使用。 音视频技术是程序员日常生活中经常用到的,比如转码需求,同事…

Eclipse启动Tomcat逐渐变慢

现象 1、Eclipse用着用着发现启动Tomcat特别慢 原因 断点打多了,之前调试的断点没有取消,导致启动时加载断点,拖慢启动 解决方案 1、点击debug按钮 2、选择breakpoint选项 清空所有断点 3、重新启动

eclipse 解决启动慢、运行慢的方法总结(最全)

由于 CSDN 的目录只在固定地方显示,并不是很方便阅读,又占空间,所以本文章已同步更新到个人博客上,在个人博客上的文章,有滑动侧边目录栏,阅读体验更加,而且文章的样式也更为丰富,推…

eclipse卡慢解决办法

1.设置JVM运行内存 1.1编辑eclipse.ini 1.2 编辑eclipse.ini,设置jvm运行内存参数,最小内存:物理内存*0.2, 最大内存: 物理内存*0.6; 其中-vmargs为必须添加参数(-vmargs的意思是设置JVM参数),…

eclipse启动很慢调优

前几天装了个eclipse,发现真的启动很慢,而且运行程序也慢,检查了不是网络问题,jsp修改一下,一保存就卡死,要等十几秒,感觉不能忍,所以就上网找资料,但是都不全面,小编接下…

Eclipse 解决启动慢

般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善。 加快启动速度 1.在eclipse启动的时候,它总是会搜索让其运行的jre&…

Eclipse如何解决启动慢

一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善。 加快启动速度 1.在eclipse启动的时候,它总是会搜索让其运行的jre&a…

eclipse启动tomcat慢

eclipse的oxygen.3(4.7)版本和Photon(4.8)版本,在启动tomcat时会启动内部安全检测机制,因而在启动tomcat时会消耗很多时间。 查看eclipse版本方法: 解决办法: 用eclipse的idea(4.9)或者neon.3(4.6)以及之前的版本 这里提供 neon…

Eclipse如何解决启动慢?

一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善。 加快启动速度 1.在eclipse启动的时候,它总是会搜索让其运行的jre&am…

解决eclipse启动太慢的问题

我用的是eclipse for javaee(2017版) 电脑i5-4210u,内存4G,硬盘机械7200转,启动eclilpse至少要一分钟 百度上找了优化教程,试了很多,例如修改了启动项,但效果微乎其微,但试了下面这…

如何解决Eclipse启动慢?多图、Eclipse详细配置说明

一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善。 加快启动速度 1.在eclipse启动的时候,它总是会搜索让其运行的jre&am…

Eclipse解决启动慢

一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善。 一、加快启动速度 1.在eclipse启动的时候,它总是会搜索让其运行的…