Android MediaCodec设置H264 Profile到High
H264 High Profile压缩率高,能降低码率,这里记录下MediaCodec Profile设置到High遇到的一些问题。
Android 4.1 就引入了MediaCodecInfo.CodecProfileLevel类,下面截取H264(AVC)的Profile和Level定义:
/** Copyright (C) 2012 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package android.media;public final class MediaCodecInfo {/*** Encapsulates the profiles available for a codec component.*/public static final class CodecProfileLevel {// These constants were originally in-line with OMX values, but this// correspondence is no longer maintained.// Profiles and levels for AVC Codec, corresponding to the definitions in// "SERIES H: AUDIOVISUAL AND MULTIMEDIA SYSTEMS,// Infrastructure of audiovisual services – Coding of moving video// Advanced video coding for generic audiovisual services"// found at// https://www.itu.int/rec/T-REC-H.264-201704-I/*** AVC Baseline profile.* See definition in* <a href="https://www.itu.int/rec/T-REC-H.264-201704-I">H.264 recommendation</a>,* Annex A.*/public static final int AVCProfileBaseline = 0x01;/*** AVC Main profile.* See definition in* <a href="https://www.itu.int/rec/T-REC-H.264-201704-I">H.264 recommendation</a>,* Annex A.*/public static final int AVCProfileMain = 0x02;/*** AVC Extended profile.* See definition in* <a href="https://www.itu.int/rec/T-REC-H.264-201704-I">H.264 recommendation</a>,* Annex A.*/public static final int AVCProfileExtended = 0x04;/*** AVC High profile.* See definition in* <a href="https://www.itu.int/rec/T-REC-H.264-201704-I">H.264 recommendation</a>,* Annex A.*/public static final int AVCProfileHigh = 0x08;/*** AVC High 10 profile.* See definition in* <a href="https://www.itu.int/rec/T-REC-H.264-201704-I">H.264 recommendation</a>,* Annex A.*/public static final int AVCProfileHigh10 = 0x10;/*** AVC High 4:2:2 profile.* See definition in* <a href="https://www.itu.int/rec/T-REC-H.264-201704-I">H.264 recommendation</a>,* Annex A.*/public static final int AVCProfileHigh422 = 0x20;/*** AVC High 4:4:4 profile.* See definition in* <a href="https://www.itu.int/rec/T-REC-H.264-201704-I">H.264 recommendation</a>,* Annex A.*/public static final int AVCProfileHigh444 = 0x40;/*** AVC Constrained Baseline profile.* See definition in* <a href="https://www.itu.int/rec/T-REC-H.264-201704-I">H.264 recommendation</a>,* Annex A.*/public static final int AVCProfileConstrainedBaseline = 0x10000;/*** AVC Constrained High profile.* See definition in* <a href="https://www.itu.int/rec/T-REC-H.264-201704-I">H.264 recommendation</a>,* Annex A.*/public static final int AVCProfileConstrainedHigh = 0x80000;public static final int AVCLevel1 = 0x01;public static final int AVCLevel1b = 0x02;public static final int AVCLevel11 = 0x04;public static final int AVCLevel12 = 0x08;public static final int AVCLevel13 = 0x10;public static final int AVCLevel2 = 0x20;public static final int AVCLevel21 = 0x40;public static final int AVCLevel22 = 0x80;public static final int AVCLevel3 = 0x100;public static final int AVCLevel31 = 0x200;public static final int AVCLevel32 = 0x400;public static final int AVCLevel4 = 0x800;public static final int AVCLevel41 = 0x1000;public static final int AVCLevel42 = 0x2000;public static final int AVCLevel5 = 0x4000;public static final int AVCLevel51 = 0x8000;public static final int AVCLevel52 = 0x10000;public static final int AVCLevel6 = 0x20000;public static final int AVCLevel61 = 0x40000;public static final int AVCLevel62 = 0x80000;}
}
其中AVCProfileConstrainedBaseline 和 AVCProfileConstrainedHigh 是安卓8.1 引入的; AVCLevel52 是安卓5.0 引入的; AVCLevel6, AVCLevel61, AVCLevel62 是安卓10 引入的;
AVC High profile 和 AVC Constrained High profile的区别: 1. 从名字就可以看出Constrained High是High的子集; 2. Constrained High 不支持B slice(B帧); 3. Constrained High 只支持帧编码,不支持场编码和帧场自适应编码;
另外Level也要选择合适的, GB28181-2016要求本地录像帧率不低于25fps, 网络传输时重要图像帧率宜25fps. GB28181-2022要求一类视频监控点、二类视频监控点的本地录像和网络传输的最大视频帧率应不低于25fps. 这里以视频30fps为例, 安卓摄像头常用的几个分辨率最小支持的Level如下:
| 分辨率 | 最小支持的Level |
| 640*480 | 3 |
| 1280*720(720p) | 3.1 |
| 1920*1280(1080p) | 4 |
| 3840*2160(4k) | 5.1 |
虽然安卓5.0已引入android.media.MediaFormat.KEY_PROFILE, 安卓6.0 引入android.media.MediaFormat.KEY_LEVEL. 但安卓7.0及以上AVC Profile设置才有效, 并且要求Profile和Level必须一起设置.
我的代码也提供了Mediacode编码参数设置接口, Java 和 NDK 两种MediaCodec接口方式都支持:
// Copyright (C) 1130758427@qq.com/*** 设置视频硬编码是否使用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);/** 设置视频硬编码质量, 安卓9及以上支持, 仅当硬编码器码率控制模式(BitrateMode)是CQ(constant-quality mode)时才有效* @param hw_quality: -1表示不设置, 请参考: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);/** 设置视频硬编码最大码率, 安卓没有相关文档说明, 所以不建议设置,* @param hw_max_bitrate: 每秒最大码率, 单位bps* @return {0} if successful*/public native int SetVideoHWEncoderMaxBitrate(long handle, long hw_max_bitrate);
经测试MTK、 海思(鸿蒙系统)、 三星、全志、晶晨、瑞芯微等编码器AVC Profile设置都可以成功。
相关文章:
Android MediaCodec设置H264 Profile到High
H264 High Profile压缩率高,能降低码率,这里记录下MediaCodec Profile设置到High遇到的一些问题。 Android 4.1 就引入了MediaCodecInfo.CodecProfileLevel类,下面截取H264(AVC)的Profile和Level定义: /** Copyright (C) 2012 The Android O…...
QT之QSysInfo(查看电脑信息)
文章目录前言一、API使用总结前言 QSysInfo是Qt中用于获取有关运行应用程序的系统信息的类。 我们可以获取以下信息: 返回系统产品类型,如ios,windows,Linux等 返回当前系统的产品版本。 返回当前系统的内核类型。 返回当前系统的…...
中国塑料编织袋产业竞争状况及投资前景预测报告2023-2029年
中国塑料编织袋产业竞争状况及投资前景预测报告2023-2029年 KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 《报告编号》: BG451639 《出版时间》: 2023年4月 《出版机构》: 中智正业研究院 免费售后 服务一年,具体内容及订购流程欢迎咨询客服人员 内容简介&…...
从头用脚分析FFmpeg源码 - av_read_frame
av_read_frame作用 /*** Return the next frame of a stream.* This function returns what is stored in the file, and does not validate* that what is there are valid frames for the decoder. It will split what is* stored in the file into frames and return one f…...
第17章_触发器
第17章_触发器 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公…...
3956. 截断数组
3956. 截断数组 - AcWing题库 3956. 截断数组 【题目描述】 给定一个长度为 nn 的数组 a1,a2,…,ana1,a2,…,an。 现在,要将该数组从中间截断,得到三个非空子数组。 要求,三个子数组内各元素之和都相等。 请问,共有多少种不同…...
React Labs: 我们最近在做什么——2023 年 3 月
原文:https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023 React Server Components React Server Components(下文简称 RSC) 是由 React 团队设计的新应用程序架构。 我们首先在一个介绍性演讲和一个RFC中分享了我们对 RSC 的…...
文件系统设计详解
抽象的文件系统以目录的形式来组织文件,我们可以利用该文件系统来读取某个文件的内容,也可以对目录或者文件实施监控并及时获取变化的通知。 IChangeToken IChangeToken对象就是一个与某组监控数据相关联的“令牌”(Token)&#x…...
好看~立马启动python实现美女通通下
人生苦短,我用python一、环境版本使用二、代码实现思路三、代码展示:导入模块伪装(请求头)四、部分好看截图,更多的就自己去采集噜~吃饭放松的时候哇一不小心看见了很多好看的东西 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 独乐乐不如众乐乐…...
Git 安装设置
1、安装 安装以下三个软件: Git-2.13.3-64-bit.exe TortoiseGit-2.4.0.2-64bit.msi TortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN.msi 安装过程中不用填写、不用选择,全部点"下一步",完成后需要重启机器。 2、基本设…...
Python-闭包
介绍 Python的闭包是一种高级的编程技巧,它可以在函数内部定义另一个函数,并返回该函数的引用。这个内部函数可以访问外部函数的变量和参数,即使外部函数已经执行完毕 好处 1)闭包可以避免全局变量的污染,使得代码更…...
Gitlab中Pipeline语法四
Gitlab中Pipeline语法 cache cache:paths 在job build中定义缓存,将会缓存target目录下的所有*.jar文件当全局定义了cache:paths会被job中覆盖.以下实例将缓存target目录 buld:script: buildcache:paths:- target/*.jar#设置key可以解决cache被覆盖 cache:paths:- my/files…...
Go语言精修(尚硅谷笔记)第五章
五、程序流程控制 5.1 单分支控制 package main import ("fmt" )func main() {//请大家看个案例[ifDemo.go]://编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,则输出 "你年龄大//于18,要对自己的行为负责!"//分析 //1.年龄 > var age int…...
三、MySQL 高级(DML 增删改)
三、MySQL 高级(DML 增删改) 3.1 DML 数据操纵语言 DML(Data Manipulation Language)DML对数据库中表记录的执行操作 插入(INSERT) 插入单行数据 插入多行数据 将查询结果插入到新表 更新(…...
面向AI编程的本质是什么?
面向AI编程的本质是什么? 面向AI编程的本质是编程的第五代编程语言,与自然语言非常相似,但是是有区别的。 因此出现了针对与AI通话的提示工程。 简单地回顾一下编程语言的发展史, 第一代编程语言是机器语言,它直接使…...
深入浅出——深度学习训练中的warmup
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
你知道如何用C语言将格式化数据和字符串相互转换吗?
今天重点介绍2个函数,分别是sprintf和sscanf,用来将格式化数据和字符串相互转换。它们的作用分别是: sprintf函数用于将格式化数据转换成字符串。sscanf函数用于将字符串转换成格式化数据。 接下来是第一个大问题:我怎么记忆呢&…...
免费一键生成原创文章-原创文章批量生成
免费使用一键生成原创文章,轻松解决写作难题! 您是否因为写作枯竭、文章档次不高,而感到烦恼?现在,我们有一个免费的文章创作工具,帮助您无需付出太多的努力就能高效地创造原创文章。 一键生成࿱…...
【数据库管理】④重做日志Redo Log
1. Redo log(重做日志)的功能 重做日志(Redo log)是数据库管理系统中的一种机制,主要作用包括: 提供事务的持久性支持:重做日志记录了每个事务对数据库所做的修改操作,以便在系统故障或崩溃时,通…...
5-python文件操作
文章目录1.打开文件2.文件读取3.文件关闭4.文件写入/追加1.打开文件 当传参顺序不一致时,不能使用位置传参,应使用关键字传参 open(file, mode‘r’, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone) 通常使用…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
