Android MediaCodec dump MP4实践小结

news/2024/7/16 8:06:21 标签: android, android studio, ide

1.应用背景

在一些集成了算法SDK的Android APP中,这些APP是取出摄像头实时帧,然后调用视觉算法SDK并产生检测结果。而当测试人员发现某一场景下算法效果欠佳时,需要从摄像头实时原始数据帧dump一段视频(mp4格式),因此,这些Android APP中需要提供相应的功能,而Android MediaCodec则很方便为开发人员提供应用接口去实现Android视频方面的操作。

2.Android MediaCodec简介

1.MediaCodec含义:MediaCodec是Android中提供的音视频编码、解码工具。它主要是完成上层接口的封装,提供给开发者使用,编解码功能是在native底层服务中完成的。

2.工作流程

1)缓存队列:client需要将数据放入输入队列,等待MediaCodec处理后,从输出队列获取结果数据
输入队列,接受数据(格式ByteBuffer);
输出队列,输出数据(格式ByteBuffer);
(2)使用
a.把原始数据放入输入缓冲区队列中一个空缓冲区上;

b.编/解码器从输入缓冲队列中获取缓冲区上数据,进行编码处理,结果存放到输出缓冲区上一个空缓冲区上;

c.处理完毕后,释放该输入缓冲区,它会被重新放回输入缓冲区队列,以便下次重复使用。
 

3.相关API

createDecoderByType:获取解码器对象
createEncoderBytype:获取编码器对象
configure:对编解码器进行配置,使编解码器转入配置状态
start:使编码器转入执行刷新状态
stop:结束并返回到未初始化状态
release:释放实例资源
createInputSurface:创建输入缓冲Surface
setOutputSurface:设置输出缓冲Surface
getInputBuffers:获取需要编码数据的输入流队列,返回的是一个ByteBuffer数组
queueInputBuffer:输入流入队列
dequeueInputBuffer:从输入流队列中取数据进行编码操作
getOutputBuffers:获取编解码之后的数据输出流队列,返回的是一个ByteBuffer数组
dequeueOutputBuffer:从输出队列中取出编码操作之后的数据
releaseOutputBuffer:处理完成,释放ByteBuffer数据

3.Android MediaMuxer简介

1.含义:在Android中,可以使用MediaMuxer来封装编码后的视频流和音频流到mp4容器中,目前MediaMuxer支持的文件输出格式包括MP4,webm和3gp。

2.使用

(1)构造

MediaMuxer mMediaMuxer = new MediaMuxer(mOutputVideoPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
// new MediaMuxer(String path, int format)指定视频文件输出路径和文件格式

(2)添加媒体通道

//开始编码 就会调用一次
MediaFormat outputFormat = mMediaCodec.getOutputFormat();
//配置封装器
// 增加一路指定格式的媒体流 视频
index = mMediaMuxer.addTrack(outputFormat);

(3)启动

MediaMuxer.start();

(4)写入数据

// 输出缓冲区
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int status = mMediaCodec.dequeueOutputBuffer(bufferInfo, 10000);
// index是addTrack(outputFormat)返回的
mMediaMuxer.writeSampleData(index, outputBuffer, bufferInfo);

(5)释放资源

MediaMuxer.stop();
MediaMuxer.release();

4.应用实例

1.功能

基于Android Studio开发APP,实现读取资源目录asserts所有NV21图片,并调用MediaCodec生成一段MP4。

2.代码:wangzhicheng2013/android_dump_mp4 (github.com)

 


http://www.niftyadmin.cn/n/243444.html

相关文章

ATTCK v12版本战术介绍——防御规避(三)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术、防御规避部分理论知识及实战研究,本期我们为大家介绍ATT&CK 14项战术中防御规避战术技术第13-18种技术,后续会介绍防御规避其他子技术&#xff0…

VGG Network

文章目录 一、AlexNet和VGG二、VGG模型实现 一、AlexNet和VGG AlexNet 于 2012 年问世,是一次革命性的进步。它改进了传统的卷积神经网络 (CNN),并成为图像分类的最佳模型之一。   当 AlexNet 发布时,它轻松赢得了 ImageNet 大规模视觉识别…

2023年全国最新道路运输从业人员精选真题及答案58

百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 69.根据《公路水路行业安全生产风险管理暂行办法》,…

Ceph入门到精通-Cephadm安装Ceph(v17.2.5 Quincy)全网最全版本

Deploy Ceph(v17.2.5 Quincy) cluster to use Cephadm - DevOps - dbaselife Install cephadm Cephadm creates a new Ceph cluster by “bootstrapping” on a single host, expanding the cluster to encompass any additional hosts, and then depl…

在Java8中使用Akka

提示:在Java8中,使用Akka可以轻松构建分布式、高可用、高可伸缩性的应用程序。Akka是一个基于actor模型的框架,它提供了强大的并发和分布式处理能力。在本文中,我们将介绍如何在Java8中使用Akka,并提供一些简单的例子帮…

打卡Android学习—Compose 布局 和 修饰符

我们将通过解释 布局 和 修饰符 的基础知识 来开始我们的旅程。我们将介绍他们是如何协同工作的,Compose 提供了什么开箱即用的API,以及如何漂亮地设计您的UI 布局——因为 Compose 中的几乎所有内容都是布局 布局是Compose UI的核心组件,使…

【Java面试八股文】JVM篇

引言: 本文对多个平台的面试题进行了汇总、分类、概括、整理,对重点进行了标出,更便于阅读和记忆。 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 说说你了解的JVM内存模…

Bootstrap框架实战:轻松搭建响应式网站

Bootstrap 是一款非常受欢迎的前端开发框架,它可以帮助我们轻松地搭建响应式网站。在这篇文章中,我们将介绍如何使用 Bootstrap 框架创建一个简单的响应式网站,并了解其核心概念和组件。 1. Bootstrap 简介 Bootstrap 是由 Twitter 公司的开…