音视频基础扫盲之视频码率控制策略(CBR、VBR还是ABR)

news2024/11/26 10:13:01

视频码率控制策略

CBR(Constant Bit Rate)、VBR(Variable Bit Rate)和ABR(Average Bit Rate)是三种常见的比特率控制方式,以视频码率控制为例,视频码率控制策略主要是在保证视频质量的前提下,尽可能地降低码率以减少存储和传输成本。

一、固定码率(CBR)

  1. 原理:

    • 固定码率控制策略使视频在整个编码过程中保持恒定的码率。无论视频内容的复杂程度如何变化,编码器都会努力将输出码率控制在一个固定的值。
    • 编码器通过调整量化参数(QP)等参数来实现码率的稳定。当视频画面比较复杂时,可能会牺牲一定的图像质量以保持码率不超过设定值;当画面相对简单时,也不会降低码率以提高图像质量。
  2. 应用场景:

    • 适用于对带宽要求严格的场景,如网络直播、视频会议等。在这些场景中,稳定的码率可以确保视频流的流畅传输,避免因码率波动导致的卡顿和缓冲。
    • 例如,在网络直播中,如果码率波动过大,可能会导致观众端的播放卡顿,影响观看体验。使用 CBR 可以保证直播流的码率稳定,让观众能够流畅地观看直播。

二、可变码率(VBR)

  1. 原理:

    • 可变码率控制策略允许码率根据视频内容的复杂程度动态变化。编码器会分析视频的每一帧,对于复杂的帧分配较高的码率以保证图像质量,对于简单的帧分配较低的码率以节省空间。
    • VBR 通常有不同的质量模式可供选择,如高质量模式、中等质量模式和低质量模式等。高质量模式会在保证图像质量的前提下尽量提高码率,而低质量模式则会更严格地控制码率以降低文件大小。
  2. 应用场景:

    • 适用于对视频质量要求较高的场景,如视频制作、电影存储等。在这些场景中,可以根据视频内容的复杂程度自动调整码率,以在保证图像质量的同时尽可能地减少文件大小。
    • 例如,在制作高清电影时,使用 VBR 可以在保证画面质量的前提下,对于一些静态场景或简单画面降低码率,从而减少存储成本。

三、平均码率(ABR)

  1. 原理:

    • 平均码率控制策略是一种介于 CBR 和 VBR 之间的方法。它设定一个平均码率目标,编码器在编码过程中会尽量使整个视频的平均码率接近这个目标值。
    • 与 CBR 不同的是,ABR 允许码率在一定范围内波动;与 VBR 不同的是,ABR 会更加注重整体的平均码率控制,而不是完全根据每一帧的复杂程度来调整码率。
  2. 应用场景:

    • 适用于一些对码率稳定性和视频质量都有一定要求的场景,如在线视频播放、视频点播等。在这些场景中,既需要保证视频流的相对稳定,又希望能够在一定程度上根据视频内容调整码率以提高图像质量。
    • 例如,在在线视频播放平台上,使用 ABR 可以在保证视频流基本稳定的前提下,对于一些精彩的画面或复杂场景适当提高码率,以提升用户的观看体验。

四、基于内容感知的码率控制

  1. 原理:

    • 这种码率控制策略利用人工智能和机器学习技术,对视频内容进行分析和理解。编码器会根据视频的场景、物体、运动等特征来动态调整码率分配。
    • 例如,对于画面中的重要物体或人物,可以分配较高的码率以保证清晰显示;对于背景或不太重要的区域,可以分配较低的码率以节省空间。
  2. 应用场景:

    • 适用于对视频质量和用户体验要求较高的场景,如智能监控、虚拟现实等。在这些场景中,通过对视频内容的智能分析,可以更好地满足用户的需求,提高视频的观看效果。
    • 例如,在智能监控系统中,基于内容感知的码率控制可以对监控画面中的关键区域(如入口、重要设备等)分配较高的码率,以便在需要时能够清晰地查看这些区域的情况。

应用举例

以大牛直播SDK的Android平台RTMP推送模块为例,我们在视频软、硬编码设计接口设计的时候,也做了相应的支持。

以硬编码为例,接口设计如下:

/*
 * SmartPublisherJniV2.java
 * Copyright © 2014~2024 daniusdk.com All rights reserved.
 * WeChat: xinsheng120
 */
 /**
  * Set Video H.264 HW Encoder, if support HW encoder, it will return 0(设置H.264硬编码)
  * 
  * @param kbps: the kbps of different resolution.
  * 
  * @return {0} if successful
  */
public native int SetSmartPublisherVideoHWEncoder(long handle, int kbps);

/**
 * Set Video H.265(hevc) hardware encoder, if support H.265(hevc) hardware encoder, it will return 0(设置H.265硬编码)
 *
 * @param kbps: the kbps of different resolution.
 *
 * @return {0} if successful
 */
public native int SetSmartPublisherVideoHevcHWEncoder(long handle, int kbps);

/**
 * 设置视频硬编码是否使用 Native Media NDK, 默认是不使用, 安卓5.0以下设备不支持
 * @param handle
 * @param is_native: 0表示不使用, 1表示使用, sdk默认是0.
 * @return {0} if successful
 */
public native int SetNativeMediaNDK(long handle, int is_native);

/*
* 设置视频硬编码码率控制模式
* @param hw_bitrate_mode: -1表示使用默认值, 不设置也会使用默认值, 0:CQ, 1:VBR, 2:CBR, 3:CBR_FD, 请参考:android.media.MediaCodecInfo.EncoderCapabilities
* 注意硬编码和手机硬件有关,多数手机只支持部分码率模式, 另外硬编码设备差异很大,不同设备同一码率控制模式效果可能不一样
* @return {0} if successful
*/
public native int SetVideoHWEncoderBitrateMode(long handle, int hw_bitrate_mode);


/*
 * 设置视频硬编码复杂度, 安卓5.0及以上支持
 * @param hw_complexity: -1表示不设置, 请参考:android.media.MediaCodecInfo.EncoderCapabilities.getComplexityRange() 和 android.media.MediaFormat.KEY_COMPLEXITY
 * 注意硬编码和手机硬件有关,部分手机可能不支持此设置
 * @return {0} if successful
 */
public native int SetVideoHWEncoderComplexity(long handle, int hw_complexity);

/*
 * 设置视频硬编码质量, 安卓9及以上支持, 仅当硬编码器码率控制模式(BitrateMode)是CQ(constant-quality mode)时才有效
 * @param hw_quality: -1表示不设置, 请参考:android.media.MediaCodecInfo.EncoderCapabilities.getQualityRange() 和 android.media.MediaFormat.KEY_QUALITY
 * 注意硬编码和手机硬件有关,部分手机可能不支持此设置
 * @return {0} if successful
 */
public native int SetVideoHWEncoderQuality(long handle, int hw_quality);

/*
 * 设置H.264硬编码Profile, 安卓7及以上支持
 * @param hw_avc_profile: 0表示使用默认值, 0x01: Baseline, 0x02: Main, 0x08: High, 0x10000: ConstrainedBaseline, 0x80000: ConstrainedHigh;
 * 注意: ConstrainedBaseline 和 ConstrainedHigh 可能多数设备不支持,
 * H.264推荐使用 High 或者 ConstrainedHigh, 如果您使用的手机硬解码解不了,那还是设置Baseline
 * 如果设置的Profile硬编码器不支持,应编码器会使用默认值
 * 具体参考:android.media.MediaCodecInfo.CodecProfileLevel
 * @return {0} if successful
 */
public native int SetAVCHWEncoderProfile(long handle, int hw_avc_profile);

/*
 * 设置H.264硬编码Level, 这个只有在设置了Profile的情况下才有效, 安卓7及以上支持
 * @param hw_avc_level: 0表示使用默认值, 0x100: Level3, 0x200: Level3.1, 0x400: Level3.2,
 * 0x800: Level4, 0x1000: Level4.1, 0x2000: Level4.2,
 * 0x4000: Level5, 0x8000: Level5.1,  0x10000: Level5.2,
 * 0x20000: Level6, 0x40000: Level6.1,  0x80000: Level6.2,
 * 如果设置的level太高硬编码器不支持,SDK内部会做相应调整
 * 注意: 640*480@25fps最小支持的是Level3, 720p最小支持的是Level3.1, 1080p最小支持的是Level4
 * 具体参考:android.media.MediaCodecInfo.CodecProfileLevel
 * @return {0} if successful
 */
public native int SetAVCHWEncoderLevel(long handle, int hw_avc_level);

感兴趣的开发者,可以酌情参考,有问题可以单独跟我探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】传值调用与传址调用:深度解析与实现

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯什么是传值调用和传址调用?1. 传值调用(Call by Value)2. 传址调用(Call by Reference) 💯传值调…

C++《二叉搜索树》

在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现,那么接下来我们将进一步的学习二叉树,在此会先后学习到二叉搜索树、AVL树、红黑树;通过这些的学习将让我们更易于理解后面set、map、哈希等…

Leetcode647. 回文子串(HOT100)

链接 代码&#xff1a; class Solution { public:int countSubstrings(string s) {int res 0;for(int i 0;i<s.size();i){for(int j i,k i;j>0&&k<s.size();j--,k){if(s[j]!s[k])break;else res;}for(int j i,k i1;j>0&&k<s.size();j--…

ubuntu, 安装部署comfyui,记录2:下载模型GGuf及测试

0.清除工作流 1.安装manager 2024年最新ComfyUI汉化及manager插件安装详解&#xff01;_comfyui-manager-CSDN博客 ComfyUI Manager安装 转到ComfyUI的安装目录ComfyUI/custom_nodes; 使用git拉取ComfyUI Manager&#xff0c;git clone https://github.com/ltdrdata/Comf…

【Y20030006】基于php+mysql的课程学习网站的设计与实现(附源码 配置 文档)

网络购物商城的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着互联网的普及和在线教育的兴起&#xff0c;课程学习网站已经成为越来越多人获取知识和提升技能的重要途径。在这样的背景下&#xff0c;开发一个基于Laravel框架的课程学习…

O2O: (BOORL) Bayesian Design Principles for Offline-to-Online RL

ICML 2024 paper code Intro O2O如何避免悲观学习导致sample efficiency较低&#xff0c;亦或者乐观估计导致的performance drop。本文提出贝叶斯准则&#xff0c;指导在线学习过程中的探索和利用。通过构建一个Q值相关的信念分布&#xff0c;agent可以对不同策略的优劣有一个…

Hyper-V配置-cnblog

启用Hyper-V以在 Windows 10上创建虚拟机 &#xff08;1&#xff09;控制面板检查系统要求&#xff1a; 确保您的计算机符合 Hyper-V 的系统要求。通常情况下&#xff0c;您的计算机需要运行 Windows 10 专业版、企业版或教育版&#xff0c;并且具有启用了虚拟化技术的处理器。…

基础免杀 从.rsrc加载shellcode上线

.rsrc 段是PE文件中的一个特定部分&#xff0c;专门用来存储资源数据。这些资源通常包括图标、位图、字符串表、对话框、菜单、版本信息、字体等 具体的shellcode加载方式不在此探讨 在这使用传统的指针执行 WindowsAPI 需要用到如下API FindResource 获取指定资源的信息块…

Excel把其中一张工作表导出成一个新的文件

excel导出一张工作表 一个Excel表里有多个工作表&#xff0c;怎么才能导出一个工作表&#xff0c;让其生成新的Excel文件呢&#xff1f; 第一步&#xff1a;首先打开Excel表格&#xff0c;然后选择要导出的工作表的名字&#xff0c;比如“Sheet1”&#xff0c;把鼠标放到“She…

第四期书生大模型实战营——基础岛第4关-L1G4000-InternLM + LlamaIndex RAG 实践

Tutorial 基础任务 任务要求1&#xff08;必做&#xff0c;参考readme_api.md&#xff09;&#xff1a;基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前 浦语 API 不会回答&#xff0c;借助 LlamaIndex 后 浦语 API 具备回答 A 的能…

搭建文件服务器并使用Qt实现文件上传和下载(带账号和密码)

文章目录 0 背景1 搭建文件服务器2 代码实现文件上传和下载2.1 在pro文件中添加网络支持2.2 创建网络管理类2.3 文件上传2.4 文件下载 3 扩展&#xff08;其他方法实现文件上传和下载&#xff09;3.1 python3.2 npm3.3 ftp服务器 4 完整的代码 0 背景 因为需要使程序具备在远程…

【初阶数据结构和算法】leetcode刷题之设计循环队列

文章目录 一、实现循环队列1.大致思路分析2.循环队列的结构定义和初始化结构定义初始化 3.循环队列的判空和判满判空和判满难点分析判空判满 4.循环队列的入队列和出队列入队列出队列 5.循环队列取队头和队尾元素取队头元素取队尾元素 6.循环队列的销毁7.最后题解源码 一、实现…

llama-factory 系列教程 (七),Qwen2.5-7B-Instruct 模型微调与vllm部署详细流程实战

文章目录 介绍llama-factory 安装装包下载模型 微调模型数据集训练模型 微调后的模型推理 介绍 时隔已久的 llama-factory 系列教程更新了。本篇文章是第七篇&#xff0c;之前的六篇&#xff0c;大家酌情选看即可。 因为llama-factory进行了更新&#xff0c;我前面几篇文章的实…

矩阵的重复

重复时自身也算一次重复 r e p m a t ( r e p e a t repmat(repeat repmat(repeat m a t l a b ) matlab) matlab)重复矩阵函数 ( ( ( 对矩阵整体 ) ) ) r e p m a t ( a , m , n ) repmat(a,m,n) repmat(a,m,n)将矩阵纵向重复 m m m次&#xff0c;横向重复 n n n次 r e …

【三维重建】windows10环境配置tiny-cuda-nn详细教程

1. 前言 本人在复现water-splatting时&#xff0c;需要配置tiny-cuda-nn&#xff0c;与此同时&#xff0c;出现了很多问题&#xff0c;在此进行简单概述。 2.安装Pytorch 环境版本要求保持一致&#xff1a;CUDA(物理机)&#xff0c;Pytorch&#xff0c;CUDA Toolkit 注意这里…

Js-函数-03

函数定义 在java中我们为了提高代码的复用性&#xff0c;可以使用方法。同样&#xff0c;在JavaScript中可以使用函数来完成相同的事情。JavaScript中的函数被设计为执行特定任务的代码块&#xff0c;通过关键字function来定义。 <!DOCTYPE html> <html lang"en…

MySQL45讲 第29讲 如何判断一个数据库是不是出问题了?——阅读总结

文章目录 MySQL45讲 第二十九讲 如何判断一个数据库是不是出问题了&#xff1f;——阅读总结一、检测数据库实例健康状态的重要性二、常见检测方法及问题分析&#xff08;一&#xff09;select 1 判断法&#xff08;二&#xff09;查表判断法&#xff08;三&#xff09;更新判断…

IO多路复用(Linux epoll)

文章目录 一、IO多路复用介绍1. 缓存 I/O (各种IO模型缘起) 二、目前有哪些IO多路复用的方案三、关联基础知识1. 用户空间和内核空间2. 文件描述符fd 四、Linux IO多路复用 select五、Linux IO多路复用 epoll1. epoll 介绍2. epoll只提供三个函数ET模式与LT模式 3. demo验证 六…

【数据结构与算法】相交链表、环形链表(判断是否有环)、环形链表(返回入环节点)

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 1.相交链表 题目&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表…

Move 合约部署踩坑笔记:如何解决 Sui 客户端发布错误Committing lock file

Move 共学活动&#xff1a;快速上手 Move 开发 为了帮助更多开发者快速了解和掌握 Move 编程语言&#xff0c;Move 共学活动由 HOH 社区、HackQuest、OpenBuild、KeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台&#xff0c;带领大家一步步熟悉 Move 语言&#…