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

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

相关推荐
❀͜͡傀儡师18 分钟前
移动端 360° 商品展示方案:从 20MB 雪碧图到 800KB 丝滑视频
ffmpeg·webgl·sprite
LuminousCPP2 小时前
数据结构-排序(三):快速排序进阶|挖坑法、双指针交换与手动栈非递归实现
c语言·数据结构·笔记·算法·排序算法
chushiyunen2 小时前
mockito笔记
java·开发语言·笔记
蒸蒸yyyyzwd5 小时前
cpp 选手备战秋招学习笔记 day32
c++·笔记·面试
stormeryang5 小时前
简单商城、在线客服管理系统
笔记
my_daling5 小时前
紫光FPGA远程升级注意事项(关于GTP_CFGCLK原语使用问题)
笔记·学习·fpga开发
库玛西5 小时前
深度解构高并发利器:纯事件驱动 Reactor 模式的设计哲学与工程实践
服务器·开发语言·c++·笔记·tcp/ip
泰晶科技6 小时前
【晶振相位噪声对通信系统的影响:如何降低5G光模块信号误码率】
笔记·5g
糖炒栗子03266 小时前
PostgreSQL 使用 ctid 修改完全重复的行
笔记
老当益壮梁奶奶6 小时前
51单片机入门总结(一):基本概念、最小系统、流水灯与按键实验(附完整代码)
笔记·stm32·单片机·嵌入式硬件·51单片机