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

FFmpeg 从入门到精通

文章目录

  • [第4章 FFmpeg 转码(重点)](#第4章 FFmpeg 转码(重点))
    • [4.1 FFmpeg 软编码 H.264 与 H.265](#4.1 FFmpeg 软编码 H.264 与 H.265)
      • [4.1.1 x264 编码参数简介](#4.1.1 x264 编码参数简介)
      • [4.1.2 H.264 编码举例](#4.1.2 H.264 编码举例)
        • [1. 编码器预设参数设置 preset](#1. 编码器预设参数设置 preset)
          • [ultrafast :最快的编码方式](#ultrafast :最快的编码方式)
          • [superfast :超级快速的编码方式](#superfast :超级快速的编码方式)
          • [veryfast :非常快速的编码方式](#veryfast :非常快速的编码方式)
          • [faster :稍微快速的编码方式](#faster :稍微快速的编码方式)
          • [fast :快速的编码方式](#fast :快速的编码方式)
          • [medium :折中的编码方式](#medium :折中的编码方式)
          • [slow :慢的编码方式](#slow :慢的编码方式)
          • [slower :更慢的编码方式](#slower :更慢的编码方式)
          • [veryslow :非常慢的编码方式](#veryslow :非常慢的编码方式)
          • placebo:最慢的编码方式
        • [2. H.264 编码优化参数 tune(场景优化)](#2. H.264 编码优化参数 tune(场景优化))
        • [3. H.264 profile(档次) 与 level(等级) 设置](#3. H.264 profile(档次) 与 level(等级) 设置)
        • [4. 控制场景切换关键帧插入参数 sc_threshold(-g参数设置GOP长度)](#4. 控制场景切换关键帧插入参数 sc_threshold(-g参数设置GOP长度))
        • [5. 设置 x264 内部参数 x264opts(设置 x264 内部私有参数)](#5. 设置 x264 内部参数 x264opts(设置 x264 内部私有参数))
        • [6.CBR 恒定码率设置参数 nal-hrd](#6.CBR 恒定码率设置参数 nal-hrd)

第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越大,允许的瞬时比特率峰值就越高,因为有更大的缓冲区可以在低比特率段中"补偿"。

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

相关推荐
lingggggaaaa10 小时前
小迪安全v2023学习笔记(八十一讲)—— 框架安全&ThinkPHP&Laravel&Struts2&SpringBoot&CVE复现
笔记·学习·struts·安全·网络安全·laravel
ooolmf12 小时前
照度传感器考虑笔记
笔记·单片机
yangzhi_emo12 小时前
ES6笔记5
前端·笔记·es6
Awesome Baron12 小时前
《Learning Langchain》阅读笔记13-Agent(1):Agent Architecture
笔记·langchain·llm
鸡哥爱技术12 小时前
Django入门笔记
笔记·python·django
yuxb7313 小时前
Docker 学习笔记(七):Docker Swarm 服务管理与 Containerd 实践
笔记·学习·docker
致***锌13 小时前
ETF期权多少钱一张?
笔记
我真的是大笨蛋14 小时前
G1 垃圾收集器深入解析
java·jvm·笔记·缓存
ホロHoro15 小时前
学习笔记:JavaScript(4)——DOM节点
javascript·笔记·学习
码畜也有梦想15 小时前
springboot响应式编程笔记
java·spring boot·笔记