ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第四章:Fmpeg转码——ffmpeg软编解码(软件编解码、Software Codec)

发布时间:2024年01月13日

FFmpeg 从入门到精通

第4章 FFmpeg 转码(重点)

4.1 FFmpeg 软编码 H.264 与 H.265

支持 H.264 的封装格式有很多,如 FLV MP4 HLS(M3U8) MKV TS 等格式;

使用 x264 进行 H.264 编码时,所支持的像素格式主要包括:yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p nv12 nv16 nv21,通过 ffmpeg -h encoder=libx264 可以查看到;

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

4.1.1 x264 编码参数简介

在这里插入图片描述

在这里插入图片描述

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

4.1.2 H.264 编码举例

在这里插入图片描述

1. 编码器预设参数设置 preset

查看 x264 preset 设置的详细说明: x264 --full help

在这里插入图片描述

ultrafast :最快的编码方式

在这里插入图片描述

superfast :超级快速的编码方式

在这里插入图片描述

veryfast :非常快速的编码方式

在这里插入图片描述

faster :稍微快速的编码方式

在这里插入图片描述

fast :快速的编码方式

在这里插入图片描述

medium :折中的编码方式

参数全部为默认设置。

slow :慢的编码方式

在这里插入图片描述

slower :更慢的编码方式

在这里插入图片描述

veryslow :非常慢的编码方式

在这里插入图片描述

placebo:最慢的编码方式

在这里插入图片描述


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

2. H.264 编码优化参数 tune(场景优化)

在这里插入图片描述

film

在这里插入图片描述

animation

在这里插入图片描述

grain

在这里插入图片描述

stillimage

在这里插入图片描述

psnr

在这里插入图片描述

ssim

在这里插入图片描述

fastdecode

在这里插入图片描述

zerolatency

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


在这里插入图片描述

3. H.264 profile(档次) 与 level(等级) 设置

在这里插入图片描述

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

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

4. 控制场景切换关键帧插入参数 sc_threshold(-g参数设置GOP长度)

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

为什么关键帧均匀分布在视频切片时更加方便?

关键帧(I帧)均匀分布在视频切片中的好处主要体现在两个方面:

  1. 随机访问和搜索性能:每一个关键帧都是完全自我包含的,可以独立于其他帧进行解码。这意味着,如果你想跳转到视频中的某个特定时间点(例如,用户拖动进度条进行快进或者快退),播放器可以直接找到最近的关键帧开始播放,而无需从视频开头一路解码过来。因此,如果关键帧均匀地分布在视频中,将会提高视频的随机访问性能。

  2. 错误恢复:如果视频流在传输过程中出现错误,丢失了一部分数据,那么从下一个关键帧开始的内容仍然可以正常解码播放,因为关键帧不依赖于其他帧。因此,关键帧的存在有助于从错误中恢复。

总的来说,关键帧均匀分布可以改善用户体验,提高视频播放的灵活性,并增强系统的健壮性。但请注意,更多的关键帧也意味着更大的文件大小,因为关键帧通常比P帧和B帧需要更多的数据来存储。因此,在实际应用中,需要在这些因素之间找到一个平衡。

5. 设置 x264 内部参数 x264opts(设置 x264 内部私有参数)

视频中的 b 帧越多,同等码率时的清晰度将会越高,但是 b 帧越多,编码与解码所带来的复杂度也就越高,所以合理地使用 b 帧非常重要,尤其是在进行清晰度与码率衡量时。

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

6.CBR 恒定码率设置参数 nal-hrd

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

-bufsize参数的作用

-bufsize参数在ffmpeg中用于指定码率控制缓冲区的大小。具体来说,它影响了视频编码时的平均位率(average bitrate)的测量窗口。

在编码过程中,每个视频/音频帧不一定需要相同数量的数据。有些帧可能更复杂,需要更多的数据来保持质量,而其他帧可能比较简单,需要的数据较少。因此,编码器会尝试在复杂和简单的帧之间分配比特率,以达到设置的平均比特率。

-bufsize参数定义了这个"平均"是如何计算的。如果你设置的-bufsize较大,那么比特率的平均值将基于更长的时间段进行计算,反之亦然。换句话说,-bufsize越大,允许的瞬时比特率峰值就越高,因为有更大的缓冲区可以在低比特率段中"补偿"。

请注意,这个参数并非在所有编码器中都有同样的效果,部分编码器可能会忽略这个设置,或者对其解释可能有所不同。

文章来源:https://blog.csdn.net/Dontla/article/details/135568310
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。