当前位置: 首页 > article >正文

Android MediaCodec 编码实战:从 Camera 采集到 ByteBuffer 编码,生成 MP4 文件

1. Android Camera数据采集与YUV格式解析在Android平台上使用Camera API采集视频数据是编码流程的第一步。我遇到过不少开发者在这一步就卡壳主要问题集中在Camera2 API的复杂配置和YUV数据格式的理解上。这里分享几个实战经验Camera2 API的基本工作流程需要先创建CameraManager实例然后通过openCamera方法打开指定摄像头。记得在AndroidManifest.xml中添加相机权限uses-permission android:nameandroid.permission.CAMERA /采集到的原始数据通常是NV21或YUV_420_888格式。这里有个坑我踩过多次不同设备支持的预览格式可能不同。建议在初始化时检查支持的格式StreamConfigurationMap map characteristics.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); int[] formats map.getOutputFormats();YUV420格式的数据排列方式很关键。以NV21为例它的内存布局是先存储所有Y分量亮度然后是交错的VU分量色度。一个分辨率为640x480的帧其Y分量大小为640x480字节UV分量各为320x240字节总大小是width×height×1.5。2. MediaCodec编码器配置实战创建编码器时我强烈建议使用异步模式。同步模式虽然直观但在高帧率场景下容易阻塞主线程。以下是创建H.264编码器的标准流程MediaFormat format MediaFormat.createVideoFormat( MediaFormat.MIMETYPE_VIDEO_AVC, width, height); format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate); format.setInteger(MediaFormat.KEY_FRAME_RATE, fps); format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval); format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible); MediaCodec encoder MediaCodec.createEncoderByType( MediaFormat.MIMETYPE_VIDEO_AVC); encoder.setCallback(new MyCallback()); encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);这里有几个参数需要特别注意比特率BIT_RATE建议根据分辨率设置1080p视频通常设为4-8Mbps关键帧间隔I_FRAME_INTERVAL直播场景建议设为1-2秒录播场景可以适当增大颜色格式COLOR_FORMATCOLOR_FormatYUV420Flexible是最通用的选择3. YUV到ByteBuffer的转换技巧Camera输出的YUV数据通常需要转换后才能送入编码器。这里分享一个高效的转换方法private void convertYUV420ToNV21(Image image, byte[] output) { ByteBuffer yBuffer image.getPlanes()[0].getBuffer(); ByteBuffer uBuffer image.getPlanes()[1].getBuffer(); ByteBuffer vBuffer image.getPlanes()[2].getBuffer(); int ySize yBuffer.remaining(); int uSize uBuffer.remaining(); int vSize vBuffer.remaining(); yBuffer.get(output, 0, ySize); vBuffer.get(output, ySize, vSize); uBuffer.get(output, ySize vSize, uSize); }转换时要注意不同设备的Image对象可能有不同的padding值UV分量的采样率通常是Y分量的1/2建议使用ByteBuffer而不是byte[]处理大数据量效率更高4. 编码与MP4封装全流程完整的编码流程需要MediaCodec和MediaMuxer配合工作。以下是核心步骤启动编码器encoder.start();在onInputBufferAvailable回调中喂数据Override public void onInputBufferAvailable(MediaCodec codec, int index) { ByteBuffer buffer codec.getInputBuffer(index); // 填充YUV数据 codec.queueInputBuffer(index, 0, data.length, timestamp, 0); }处理编码输出Override public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) { ByteBuffer encodedData codec.getOutputBuffer(index); muxer.writeSampleData(trackIndex, encodedData, info); codec.releaseOutputBuffer(index, false); }封装MP4文件MediaMuxer muxer new MediaMuxer(outputPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); int trackIndex muxer.addTrack(encoder.getOutputFormat()); muxer.start();常见问题排查如果遇到Failed to add track错误检查MediaFormat是否包含csd-0和csd-1参数视频不同步问题通常是由于时间戳计算错误导致的输出文件损坏可能是没有正确发送END_OF_STREAM标志5. 性能优化与实战技巧经过多个项目的实践我总结出几个提升编码效率的方法内存优化复用ByteBuffer对象避免频繁内存分配使用Surface输入模式代替ByteBuffer模式需要API 18设置合适的缓冲区数量format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, width * height * 3 / 2);参数调优动态比特率调整Bundle params new Bundle(); params.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, newBitrate); encoder.setParameters(params);低延迟配置format.setInteger(MediaFormat.KEY_LATENCY, 1);异常处理 编码过程中常见的异常包括CodecException通常由配置错误引起IllegalStateException多线程访问导致MediaCodec.CodecError硬件资源不足建议在回调中实现健壮的错误处理Override public void onError(MediaCodec codec, MediaCodec.CodecException e) { Log.e(TAG, Encoder error: e.getDiagnosticInfo()); // 重启编码器或通知上层 }6. 音视频同步实现方案如果需要加入音频同步是关键。我常用的时间戳同步方案是使用系统时钟作为基准long startTime System.nanoTime() / 1000;计算视频时间戳long videoPts (System.nanoTime() / 1000 - startTime);音频时间戳对齐audioBufferInfo.presentationTimeUs (System.nanoTime() / 1000 - startTime);同步时要注意音频数据通常采用AAC格式采样率设为44100Hz视频关键帧间隔不宜设置过大使用MediaSync类可以实现更精确的同步在实际项目中我发现使用单独的同步线程来管理时间戳比依赖编码器内部计时更可靠特别是在处理高帧率视频时。

相关文章:

Android MediaCodec 编码实战:从 Camera 采集到 ByteBuffer 编码,生成 MP4 文件

1. Android Camera数据采集与YUV格式解析 在Android平台上使用Camera API采集视频数据是编码流程的第一步。我遇到过不少开发者在这一步就卡壳,主要问题集中在Camera2 API的复杂配置和YUV数据格式的理解上。这里分享几个实战经验: Camera2 API的基本工作…...

so-vits-svc3.0 从零到一:Windows环境下的避坑指南与实战训练

1. 环境准备:从零搭建AI语音克隆的基石 第一次接触so-vits-svc3.0时,我花了整整三天时间在环境配置上反复折腾。现在回想起来,那些踩过的坑完全可以避免。Windows环境下最让人头疼的就是CUDA和PyTorch的版本匹配问题,我见过太多新…...

这种界面和额外附加认证要求以前从来没有过

注册github账号很早就有了,但这种认证要求以前从来没有过。 自从上传了这个代码: mcp 桥接器 就多了认证要求。 发生了什么 :GitHub 现在要求所有活跃开发者都必须开启双重身份验证(2FA),以保护账号不被黑…...

DxO PureRAW中文破解版

🔥RAW图像降噪神器!DxO PureRAW中文破解版来了!🚀哈喽,各位摄影老铁们好呀!👋👋 今天给大家安利一款超级硬核的RAW图像处理工具—— ✨ DxO PureRAW ✨ 这可是 DxO Labs 旗下的行业领…...

客户月亏30万才醒悟:低价模具,才是最昂贵的选择

一、客户困境:贪小利省2万,终致月亏30万、天天停机一位专注小家电外壳生产的客户,在模具采购时,一心想压缩成本,最终选择了比常规方案便宜2万元的低价模具。初期试模阶段,产品外观、尺寸看似无异常&#xf…...

安装离线版mysql,全网最详细

CentOS7 离线安装 MySQL 5.7 完整版(一次装好、配置齐全、开机自启、远程访问、字符集、防火墙、环境变量、日志、权限全部搞定,零返工)适配你的服务器:CentOS Linux release 7.6.1810 x86_64,Java1.8 已就绪&#xff…...

为AI智能体项目选择稳定且多模型的后端API供应商

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为AI智能体项目选择稳定且多模型的后端API供应商 在开发AI智能体或自动化工作流时,工程师们面临的核心挑战之一是如何为…...

G-Helper深度解析:如何用1MB工具彻底替代华硕Armoury Crate

G-Helper深度解析:如何用1MB工具彻底替代华硕Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenboo…...

langchain4j笔记-09

RAG 1. easy rag Test void test03() {// 1. 创建模型// 2. 加载文档List<Document> documents ClassPathDocumentLoader.loadDocuments("excel");//List<Document> documents FileSystemDocumentLoader.loadDocuments("/home/langchain4j/docum…...

使用 Elcomsoft System Recovery 恢复 Windows 凭据

在传统的取证工作流程中&#xff0c;获取 Windows 系统的访问权限曾是一件比较直接的事情&#xff1a;从本地数据库中提取 NT 哈希&#xff0c;然后运行一次快速的离线攻击。如今&#xff0c;Windows 身份验证正从那些本质上不安全的 NTLM 哈希向更具弹性的机制迁移。微软正积极…...

用Python手把手复现灰狼算法GWO:从狩猎行为到代码实现(附完整源码)

用Python手把手复现灰狼算法GWO&#xff1a;从狩猎行为到代码实现&#xff08;附完整源码&#xff09; 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;作为一种新兴的群体智能算法&#xff0c;正逐渐在工程优化、机器学习参数调优等领域崭露头角。与传统的遗传…...

从 XChat 到超级 APP 生态:小程序生态为什么成为了超级APP的最佳技术选型

2026年4月17日&#xff0c;XChat 正式登陆苹果 App Store。 马斯克一直想做一个美国版的微信的目标已经实现&#xff1a;端对端加密、无广告、无追踪&#xff0c;注册只需要一个 X 账号&#xff0c;不需要手机号。马斯克给它的目标也很直接——X 要从社交平台&#xff0c;变成「…...

国产巴伦替代 Mini-Circuits TCM1‑63AX+,H3‑TCM1‑63AX+ 现货可原位替代

最近很多做射频 / 通信 / 无线项目的朋友都在找Mini TCM1‑63AX 的国产替代&#xff0c;既要性能对标、又要现货快交、还要价格友好。给大家分享一款恒利泰 H3‑TCM1‑63AX&#xff0c;完全原位替代 TCM1‑63AX&#xff0c;参数一致、脚位兼容&#xff0c;直接替换不用改板。 ✅…...

两阶段目标检测器核心原理与流程详解

两阶段目标检测器的核心思想是&#xff1a;第一阶段先找候选区域&#xff0c;第二阶段再对候选区域做分类和精修。典型代表是&#xff1a; R-CNN Fast R-CNN Faster R-CNN Mask R-CNN现在最典型的是 Faster R-CNN / Mask R-CNN&#xff0c;所以我以它为主来讲。1. 两阶段目标检…...

NotebookLM权限审计日志难追溯?手把手教你启用VPC Service Controls + Cloud Logging Query Builder构建实时越权预警看板

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM权限控制设置 NotebookLM 是 Google 推出的基于用户上传文档进行 AI 辅助理解与生成的实验性工具&#xff0c;其权限模型默认采用 Google 账户体系集成&#xff0c;但需主动配置以满足团队协…...

用于免训练手术视频分割的记忆增强SAM2(MA-SAM2)

学影像 手术视频 基础模型增强 ──────────────────────────────────────── 1. 标题 英文:Memory-Augmented SAM2 for Training-Free Surgical Video Segmentation 中文:用于免训练手术视频分割的记忆增强SAM2(MA-SAM2) 2. 作者…...

神经网络分子动力学与长程静电相互作用优化技术

1. 神经网络分子动力学与长程静电相互作用优化概述分子动力学模拟作为计算化学和材料科学的核心工具&#xff0c;其精度和效率直接决定了研究的深度和广度。传统分子动力学依赖经验力场&#xff0c;虽然计算速度快&#xff0c;但难以准确描述化学键断裂/形成等过程。而基于量子…...

2026年企业做GEO推广找哪家?推荐几家源头厂家

2026年&#xff0c;GEO赛道正在经历一场剧烈的洗牌。根据界面新闻、极客公园、IT之家及多家第三方机构近期密集发布的行业评测&#xff0c;头部服务商格局已初步成型&#xff0c;但大量贴牌套壳的“伪源头”仍在搅浑市场。企业在选型时最焦虑的问题已经从“要不要做GEO”变成了…...

前端工程化:Vite与Rollup构建优化

前端工程化&#xff1a;Vite与Rollup构建优化 大家好&#xff0c;我是欧阳瑞&#xff08;Rich Own&#xff09;。今天想和大家聊聊前端工程化这个重要话题。作为一个全栈开发者&#xff0c;构建工具是日常开发中不可或缺的一部分。今天就来分享一下Vite和Rollup的构建优化技巧…...

【信息科学与工程学】【物理/化学科学和工程技术】知识体系 第四十一篇 数据中心基础设施领域中的力学知识 01

编号:001 类别 结构力学 (静力学与动力学) 领域 计算基础设施 / 机房设施 力学模型配方 将服务器机架简化为一个底部固定、顶部自由的悬臂梁模型。在地震激励下,该模型转化为一个单自由度阻尼受迫振动系统。主要考虑水平方向的地震力作用。 数学分析 通过建立运动微分…...

GitHub本周热门项目(2026-05-18)

GitHub 本周热门项目推荐 更新时间&#xff1a;2026-05-18 数据来源&#xff1a;GitHub Trending &#x1f525; TOP 10 热门项目 1. mattpocock/skills 一句话描述&#xff1a;面向真实工程师的技能框架&#xff0c;提供Claude Code等AI编码工具的专业技能扩展。 项目信息详…...

物业临时工考勤记录管理痛点与栎偲考勤神器技术实现方案

物业行业临时工考勤一直是HR管理的“老大难”&#xff1a;人员流动性大、班次碎片化&#xff08;如早班/晚班/临时替班&#xff09;、外勤打卡场景多&#xff08;如园区巡检、设备维修&#xff09;&#xff0c;传统Excel统计不仅耗时&#xff0c;还常因数据错漏引发薪资纠纷。本…...

ChatGPT实时支付功能“不可见”的真相:不是没上线,而是被GDPR/SCA双重拦截——3分钟自查你的地区、浏览器、MFA配置是否全达标?

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ChatGPT实时支付功能在哪里 ChatGPT 本身并不原生支持实时支付功能。OpenAI 官方发布的 ChatGPT&#xff08;包括免费版、Plus 订阅版及 Team/Enterprise 版&#xff09;定位为人工智能对话助手&#xff0c;其…...

【信息科学与工程学】【物理/化学科学和工程技术】知识体系 第四十篇 低空/高空领域中的力学知识 01

低空与高空(地球大气层内/地球大气层外)领域的核心力学知识。 编号:001 类别:流体力学 / 连续介质力学 领域:低空飞行器空气动力学 力学模型配方:Navier-Stokes方程组(可压缩/不可压缩) 数学分析:求解控制流体运动的质量、动量和能量守恒偏微分方程组。 定理/算法…...

在不确定的命题环境中,如何建立稳定的考研数学备考体系

近两年&#xff0c;考研数学始终是考研备考中讨论度较高的科目。每年考试结束后&#xff0c;关于试卷难度、题型变化、计算量以及复习节奏的讨论都会迅速升温。对考生而言&#xff0c;真正需要关注的并不只是某一年试题“偏难”还是“偏易”&#xff0c;而是在变化之中建立一套…...

DNS 泄露是什么?为什么网络环境检测时要看 DNS

很多人在检查网络环境时&#xff0c;第一反应通常是看 IP。比如 IP 显示在哪个地区、运营商是谁、是不是数据中心网络。 但实际上&#xff0c;除了 IP 之外&#xff0c;DNS 也是一个很容易被忽略的关键指标。如果 DNS 查询结果和当前网络出口不一致&#xff0c;就可能出现所谓的…...

【麒麟系统-解释器错误:权限不足】

执行脚本后发现无法执行权限不足查看发现当前是有执行权限的&#xff1b;最后发现可能是有安全限制&#xff1a; 执行命令getstatus 执行这个命令即可&#xff1a;sudo setstatus softmode...

学生用户画像-利用ETL零代码构建考勤主题标签

1 实验说明 1.1 实验目的 依托 “数智教育” 大赛数据集搭建学生考勤 ETL 转换流&#xff0c;掌握 ETL 全流程&#xff0c;解决校园考勤统计低效、标准不一问题&#xff1b;优化空值处理&#xff0c;输出精准多维度考勤数据&#xff0c;支撑校园考勤管理。 1.2 实验环境 工…...

NTN 长距离通信领域亮相

核心蜂窝解决方案亮相并带来Nordic NTN 核心解决方案深度分享。环节将全面解析 nRF9151 模组的核心特性与技术优势&#xff0c;详解卫星星座生态布局及 nRFCloud 平台的应用价值&#xff0c;为参会者勾勒 NTN 技术的整体框架与商业落地前景&#xff0c;为后续内容奠定专业基础。…...

pycharm接入AI大模型测试脚本费用说明

费用说明 阿里云通义千问提供: 新用户免费额度:注册即送一定额度的免费 tokens 按量付费:用多少付多少&#xff0c;无最低消费 价格透明:详见 官方定价 示例成本(以 qwen-plus 为例) 解析-个 100页 PDF≈ 50,000 tokens ≈0.4 生成 100 个问答对≈20,000 tokens ≈0.16 下一步 …...