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

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

相关推荐
深圳卢先生4 小时前
CentOS 安装jenkins笔记
笔记·centos·jenkins
u_topian5 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
WarPigs10 小时前
游戏框架笔记
笔记·游戏·架构
金心靖晨10 小时前
redis汇总笔记
数据库·redis·笔记
遇见尚硅谷11 小时前
C语言:20250714笔记
c语言·开发语言·数据结构·笔记·算法
Norvyn_711 小时前
LeetCode|Day11|557. 反转字符串中的单词 III|Python刷题笔记
笔记·python·leetcode
逼子格12 小时前
权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记
笔记·嵌入式硬件·硬件工程·硬件工程师·adc·硬件工程师真题·权电阻网络dac
Jyywww12112 小时前
慕尚花坊项目笔记
笔记
xd0000212 小时前
ethers.js-5–和solidity的关系
笔记
星辰大海141213 小时前
AI Linux 运维笔记
运维·笔记