惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
月光博客
月光博客
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
IT之家
IT之家
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
S
SegmentFault 最新的问题
宝玉的分享
宝玉的分享
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
爱范儿
爱范儿

博客园 - 飘杨......

为ZLMediaKit在windows10编译srtp Windows10安装部署ZLMediaKit SurfaceView+EGL+OpenGL ES+ffmpeg播放视频并解决黑屏不显示画面的问题 SurfaceView+ANativeWindow+ffmpeg播放视频并解决花屏问题 SDL播放音频工具类封装 Qt QWidget中dropEvent(QDropEvent* e)拖拽放开不接收事件/不执行,且拖拽到目标后鼠标显示禁用符号 ffmpeg视频转码遇到H264黑屏问题 ffmpeg根据输入的参数截取视频 ffmpeg将视频流录制下来并保存到本地 ffmpeg解封装mp4并解码渲染(SDL2) Qt+ffmpeg+SDL硬件解码并渲染 ffmpeg+sdl播放H264/H265文件 FFmpeg实战:录制Windows屏幕并用FFmpeg压缩成H.264/H.265并保存 ffmpeg SwsContext像素格式转换BGRA转YUV420P H264/H265 NALU的nalu_unit_type解析 ffmpeg-H264/H265常用编解码预设参数 Qt+FFmpeg+SDL 实现多路多格式原始视频播放工具:从像素处理到实时渲染 Qt+SDL 实战:多格式视频播放工具开发 —— 支持 RGBA/ARGB/RGB24/YUV420P 的完整实现 SDL将YUV视频渲染到Qt窗口播放
ffmpeg码率控制模式详解
飘杨...... · 2025-05-20 · via 博客园 - 飘杨......

一、概述

  在视频编码中,码率控制是决定输出视频质量和文件大小的核心环节。不同的场景对码率和视频质量有不同的要求。所以非常有必要了解一下编码器是如何控制码率。

以便应对不同的应用场景。

二、码率控制模式说明

    • 原理:编码器在整个视频中维持平均码率,但允许帧间波动(复杂场景高码率,简单场景低码率)。
    • 作用:平衡画质与文件大小,适合带宽稳定的场景。
      第一种方式:
      AVCodecContext *c;
      int br = 400000;  //400kb
      c->bit_rate = br;
      
      第二种方式:
      // FFmpeg示例(H.264)
      av_opt_set(c->priv_data, "b:v", "2000k", 0);  // 平均2Mbps
      av_opt_set(c->priv_data, "maxrate", "3000k", 0);  // 峰值3Mbps
      av_opt_set(c->priv_data, "bufsize", "4000k", 0);  // 缓冲区大小
    • 应用场景:流媒体、本地存储。
    • 原理:固定量化参数(QP),复杂场景自动分配更多比特,简单场景更少。
    • 作用:保证视觉一致性,但文件大小波动大。
      // FFmpeg示例(H.264)
      av_opt_set(c->priv_data, "qp", "23", 0);  // QP范围:0(无损)-51(最差)
    • 应用场景:直播(如 Twitch)、网络带宽有限且波动小的场景。
    • 原理:动态调整码率以维持目标画质,结合了 CQP 和 ABR 的优点。
    • 作用:在文件大小和画质间取得最优平衡,推荐优先使用。
      // FFmpeg示例(H.264)
      av_opt_set(c->priv_data, "crf", "23", 0);  // 默认值,范围18-28
      // H.265(HEVC)推荐+2:
      av_opt_set(c->priv_data, "crf", "25", 0);
    • 应用场景:离线转码(如压制电影)、存储容量有限的场景。
    • 原理:限制瞬时码率,确保解码器缓冲区不会溢出(通过maxratebufsize)。
    • 作用:防止播放器卡顿,适合网络传输。
      // FFmpeg示例(H.264)
      av_opt_set(c->priv_data, "maxrate", "4000k", 0);  // 最大4Mbps
      av_opt_set(c->priv_data, "bufsize", "8000k", 0);  // 2秒缓冲区
    • 应用场景:流媒体(需适应不同带宽)、蓝光 / DVD 制作。
    • 定义:GOP(Group of Pictures)是一组连续的视频帧,以 I 帧开始,包含 P 帧和 B 帧。
    • gop_size越大视频质量越高,反之视频质量越差。
      • 参数:
        • gop_size:GOP 的长度(帧数)。
        • keyint_min:最小 I 帧间隔(避免场景切换时延迟插入 I 帧)。
        • bframes:两个参考帧之间的 B 帧数(影响编码延迟)。
      • 作用:
        • 随机访问:I 帧是解码起点,小 GOP(如 30)支持快速跳转。
        • 压缩效率:大 GOP(如 120)允许更多 B/P 帧,提高压缩比。
          // FFmpeg示例(H.264)
          av_opt_set(c->priv_data, "gop_size", "120", 0);  // 每120帧一个I帧
          av_opt_set(c->priv_data, "keyint_min", "30", 0);  // 场景切换时至少30帧
          av_opt_set(c->priv_data, "bframes", "3", 0);  // 两个参考帧间插入3个B帧
  • 场景推荐模式参数配置
    直播(低延迟) CBR + VBV b:v=目标码率maxrate=峰值bufsize=小
    流媒体(适应性) ABR + VBV b:v=平均码率maxrate=2×平均bufsize=大
    离线存储(画质优先) CRF crf=18-20preset=slow
    实时监控(保留细节) CQP qp=20-25
    蓝光 / DVD 制作 CRF + VBV crf=18maxrate=无bufsize=大
  • 性能对比
    模式画质稳定性文件大小编码速度延迟带宽要求
    CQP 波动大 不稳定
    CBR 稳定 恒定
    ABR 较稳定 波动小
    CRF 较稳定 波动中