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

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

相关推荐
ersaijun3 小时前
【Obsidian】当笔记接入AI,Copilot插件推荐
人工智能·笔记·copilot
结衣结衣.4 小时前
Linux——进程状态
linux·运维·服务器·c语言·笔记·学习
云边有个稻草人4 小时前
【刷题】Day4--密码检查
开发语言·数据结构·笔记·算法
居安思危_Ho5 小时前
【Android笔记】Android Studio打包 提示Invalid keystore format
android·笔记·gradle·android studio·android 打包
sml_54215 小时前
【笔记】1.2 弹性变形
笔记
~在杰难逃~5 小时前
Day15笔记-函数返回值&函数的封装&匿名函数
开发语言·笔记·python·pycharm·数据分析
少杰是小白5 小时前
计算机二级自学笔记(程序题1部分)
c语言·笔记
WPG大大通6 小时前
新能源汽车BMS 学习笔记篇—AFE 菊花链通信中电容隔离 & 电感隔离的使用
网络·经验分享·笔记·汽车·新能源·bms
Peterpan000007 小时前
CTF——简单的《WEB》
linux·经验分享·笔记·安全·网络安全
刘心奶黄包qaq8 小时前
Git学习笔记
笔记·git·学习